2009 年 1 月 30 日,美國商務部公布 2008 年第四季 GDP:年化 -3.8%。今天打開 FRED 查同一個季度,數字在 -8.5% 附近。同一季,同一個統計機構,差了超過 4 個百分點。
沒有人算錯。總經數據的生產流程本來就是先給粗估,之後花好幾年慢慢改。這個過程叫總經數據修正(data revision),而它對量化研究的殺傷力在於:市場當年定價用的是初值,你的回測讀到的卻是終值。 用終值回測宏觀策略,是前視偏誤的一種,而且是驗證工具最抓不到的一種,因為整份歷史資料看起來完全正常。
這篇文章處理四件事:總經數據修正的三層機制(誰在修、修幾次、修多大)、兩個實際案例、修正污染宏觀策略回測的三條路徑,以及把實時數據(即時數據)管理寫進資料層的六個做法。前視偏誤的一般框架在前視偏誤:定義、成因與六道防線寫過,資料層基建在量化交易數據層的完整框架寫過,這裡只處理總經數據這一塊。
總經數據修正是什麼:初值、例行修正、基準修正
總經數據跟價格數據有一個根本差異。成交價一旦成立就不會變,但 GDP、非農就業這類統計量,公布當下只是抽樣推估,之後會隨著更完整的資料進來被反覆改寫。修正分三層。
第一層:例行修正。 樣本回收率提高後的更新。非農每個月的數字會在接下來兩個月各修一次,GDP 一季內有 advance、second、third 三個版本。
第二層:年度修正。 用更完整的行政資料重新校準。非農每年拿 QCEW(涵蓋約九成五就業人口的失業保險行政紀錄)做基準修正;季節調整因子也在這時重估,過去幾年的整段序列跟著重寫。
第三層:全面修正。 統計方法本身改版。BEA 大約每五年做一次 GDP 全面修正,2013 年那次把智慧財產投資納入 GDP,整條歷史序列的定義都變了。
放進前視偏誤那篇的兩個時間戳框架看:事件時間(這個數字描述哪一季)不變,但可得時間變成複數。同一個事件時間,對應一串隨 vintage 演化的值。主要指標的修正節奏長這樣:
| 指標 | 例行修正 | 年度修正 | 幅度感 |
|---|---|---|---|
| 非農就業 | 之後兩個月各修一次 | QCEW 基準修正+季調重估 | 單月常見 ±5 萬,基準修正可達數十萬 |
| GDP | advance → second → third | 年度修正+五年全面修正 | advance 到最新檔案平均差超過 1 個百分點 |
| CPI | 未季調值幾乎不修 | 季調因子每年重算近五年 | 季調序列整段重寫 |
| PCE 物價 | 跟著 GDP 時程修 | 同 GDP | 中等 |
| M2 | 小幅 | 季調因子年度重估 | 水準值小、年增率轉折點會移動 |
| 初領失業金 | 下週修一次 | 季調重估 | 小 |
| ISM PMI | 幾乎不修 | 季調更新 | 小 |
這張表有一個實務結論:指標越依賴抽樣與季節調整,修正越大;越接近行政紀錄或直接計數,修正越小。 你的策略用到哪一格,決定你需要多講究的實時數據管理。
修正幅度有多大:兩個案例
2008Q4:市場看到的衰退,只有實際的一半深
回到開頭那個 GDP 修正案例。2009 年 1 月 30 日的 advance 估計是 -3.8%,一個月後的 second 估計改成 -6.2%,2011 年的年度修正再往下改到 -8.9% 附近,之後的全面修正才落在目前檔案上的位置。
假設你的回測邏輯是「GDP 年化跌破 -5% 時切換到避險配置」。用今天的 FRED 資料跑,訊號在 2009 年 1 月底就會觸發。但在真實世界,2009 年 1 月底檔案上的數字是 -3.8%,門檻根本沒穿越。那個 -5% 要到好幾週後才存在。你的回測在一個當時不存在的數字上做了決策,而且整段歷史裡沒有任何欄位會提醒你這件事。
2024 到 2025:非農基準修正變成頭條新聞
第二個案例更近。2024 年 8 月 21 日,BLS 公布初步基準修正:截至 2024 年 3 月的一年,非農就業下修 81.8 萬,是 2009 年以來最大。2025 年 2 月的最終版本收斂到 -59.8 萬。
一年後規模再放大。2025 年 8 月 1 日,7 月非農只有 7.3 萬,5、6 月合計下修 25.8 萬;當天川普解僱了 BLS 局長 Erika McEntarfer。9 月 9 日,新一輪初步基準修正出爐:-91.1 萬,史上最大的初步下修。原本檔案上「一年增加約 180 萬」的就業,有一半是統計流程後來收回的。
這裡的重點不是政治,是機制。非農的月度數字來自十幾萬家企業的抽樣調查,其中新企業開張與倒閉的貢獻靠 birth-death 模型推估。這個模型在景氣平穩期表現不錯,在轉折點會系統性高估,因為它本質上是用過去的開業倒閉節奏外推。所以非農下修不是隨機雜訊,它集中出現在景氣轉折附近,修正的方向本身帶有景氣資訊。 這是把修正當成訊號源、而非只當成麻煩的理由,後面會回到這件事。
為什麼市場交易初值,你的回測卻用終值
宏觀數據影響價格的方式,是公布當下的 surprise:初值對比當時的市場共識。8:30 數據出來,資產在一分鐘內完成大部分重定價,反應的全是「初值減共識」。終值兩三年後才定案,跟當時的定價過程完全無關。
政策端也一樣。Orphanides 在 2001 年的 AER 論文用實時數據重算 Taylor rule,發現 1970 年代大通膨的政策失誤,有一部分來自產出缺口的實時估計錯得離譜:當年檔案顯示經濟遠低於潛能,事後修正的資料說缺口小得多。聯準會自己都被困在實時數據裡做決策,你的回測卻假設自己站在多年後的檔案上看當年的市場。
加密圈有一個現成的例子。「全球 M2 領先比特幣 70 到 108 天」那類圖,這兩年在社群上流傳很廣。這類圖通常有兩層問題疊在一起:位移天數是從多個候選裡挑擬合最好的(這屬於選擇偏誤與多重測試的範圍),而 M2 曲線用的是最新 vintage。M2 的水準值修正不大,但季調重估會讓年增率的轉折點移動幾週。一張同時吃到挑參數與吃到終值的圖,它的「領先性」有多少能在實時數據上重現,是要先回答的問題,不是先轉發的問題。
總經數據修正污染回測的三條路徑
對量化回測來說,修正會從三個入口滲進結果,每個入口的檢查方法不同。
路徑一:事件驅動策略的 surprise 算錯
交易數據公布的策略,需要兩個當時的值:as-released 的初值,以及公布前一刻的市場共識。用終值回算 surprise,整個分佈都是錯的。2008Q4 的例子裡,用終值算出來的負向 surprise 是實際的兩倍以上,回測會以為市場對壞消息的反應遠比實際溫和。
路徑二:門檻型制度濾網的切換時點移動
老陳在 2025 年做了一個制度濾網:美國 M2 年增率翻正才持有 BTC 現貨,翻負出場。用 FRED 最新檔案回測 2013 到 2025,Sharpe 1.6,完美躲過 2022。他後來用 ALFRED 的 first-release vintage 重建同一個濾網,兩件事變了:2020 與 2023 的制度切換時點各移動了一到兩個月,Sharpe 掉到 1.0 以下。濾網本身沒有失效,但「用當時看得到的數據,訊號會慢多少、慢掉的那段行情值多少」這個成本,最新檔案的回測完全沒有計價。
路徑三:季節調整的靜默重寫
最隱蔽的一條。季調因子每年重估,過去幾年的整段序列被重寫,即使原始值一個都沒改。你三個月前下載的檔案跟今天的不一致,pipeline 不會報錯,diff 只會告訴你值變了,不會告訴你為什麼。依賴月增率、年增率轉折的訊號,對這件事最敏感。鏈上數據有結構一模一樣的問題,供應商的靜默改寫在鏈重組與鏈上數據寫過。
實時數據管理怎麼做:六個做法
上面三條路徑對應的解法,核心只有一件事:讓資料庫記得每個數字在每個時點長什麼樣子。 這就是 point-in-time(PIT)資料管理。
做法一:雙時間戳 schema。 每筆觀測存三個鍵:序列、事件時間、vintage 時間。
CREATE TABLE macro_obs (
series_id TEXT,
obs_date DATE, -- 事件時間:這個值描述哪一期
vintage_date DATE, -- 可得時間:這個值出現在檔案上的日期
value REAL,
PRIMARY KEY (series_id, obs_date, vintage_date)
);
做法二:用 ALFRED 回補歷史 vintage。 聖路易聯儲的 ALFRED 存了 FRED 主要序列的歷史檔案快照,FRED API 的 realtime_start 與 realtime_end 參數可以直接拉。更早的 GDP 類序列,費城聯儲的 Real-Time Data Set 從 1965 年 11 月的 vintage 開始存。
做法三:回測與研究走兩條路。 回測用 as-of join(在時間點 t 只取 vintage 小於等於 t 的最新值),研究與畫圖用最新檔案。兩條路徑分開命名,例如 m2_pit 與 m2_latest,避免有人在回測裡順手 import 錯張表。
做法四:事件策略另存發布時刻的快照。 as-released 值、當時的共識值、精確到秒的發布時間戳。共識資料是這裡最難的一塊,免費來源基本上不存在,這筆訂閱成本要算進策略的固定成本。
做法五:季調資料存 vintage,或改用未季調值自己調。 把季調參數固定進回測,歷史就不會被明年二月的因子重估改寫。
做法六:把修正本身當監控對象。 新 vintage 進來自動 diff 前一版,修正幅度超過閾值就發警報。一方面保護既有訊號,另一方面,前面說過基準下修集中在景氣轉折附近,修正的方向與幅度自己就是一條值得研究的序列。
這套管線的實作細節,包括 ALFRED 回補腳本與 as-of join 的完整 SQL,Lab 社群裡有可以直接拿去改的版本,也有成員把它接上警報系統的做法討論。
風險與失效條件:什麼時候不用這麼講究
PIT 化有工程成本,不是每個策略都需要付。
純價格策略不需要。K 線與成交量沒有修正問題,這整篇文章跟你無關。持有期以年計的配置策略,修正造成的訊號延遲通常小於再平衡週期,誤差可能比執行滑價還小。講究程度要跟策略對總經數據的敏感度成比例,把每個序列都 PIT 化是過度工程。
PIT 化之後也還有殘餘風險。共識資料難以免費取得,ALFRED 對部分序列的 vintage 起點偏晚,而方法論改版(像 2013 年 GDP 定義變更)造成的斷裂,連 vintage 資料都救不了,因為新舊檔案量的根本不是同一個東西。
最後是判讀原則。如果一個宏觀策略在 first-release 與最新 vintage 兩個版本上的績效差距很大,正確的結論不是挑好看的那個版本報告。這個差距本身就是訊息:策略的 edge 對數據版本敏感,代表它賺的可能不是宏觀結構的錢,是檔案演化的錢。 後者在實盤上一毛都拿不到。
結論:先問「當時看得到嗎」,再問「訊號準不準」
整理下來是四件事。
總經數據是活的。初值、例行修正、基準修正、方法改版,同一個季度的 GDP 在檔案上是一串值,不是一個值。總經數據修正是宏觀策略的第一層資料風險,排在模型之前。市場定價用初值,你的回測預設讀終值,中間的落差是前視偏誤,而且樣本外測試抓不到。修正污染回測有三條路徑:surprise 算錯、制度切換時點移動、季調靜默重寫。解法是雙時間戳加 as-of join,資料源用 ALFRED 回補,事件策略另存發布快照。
宏觀策略上線前,值得多跑一個版本:把數據換成 first-release,看績效掉多少。掉得少,edge 大概是真的;掉得多,你剛剛省下了一次實盤學費。
這類數據結構與宏觀流動性的拆解,我每週在電子報整理一次,包括當週主要數據的初值與修正追蹤。要看更完整的管線實作,Lab 裡見。




