ML4T 導讀 · Part I · Ch 2–5

資料層決定天花板

多數「量產出來的假 alpha」不是模型的錯,是資料層漏水——而且漏水不會報錯,只會靜默偏誤。這四章講的都是同一件事:時間點 t,你到底知道什麼?

Ch 2 資料宇宙 Ch 3 市場微結構 Ch 4 基本面與另類 Ch 5 合成資料
0

一張圖看懂這一部分

三種資料來源,一道共同的閘門

Part I 表面上在講四種不同的資料,實際上只有一個共同主題:任何資料進到下游之前,都必須通過一道閘門——這筆值在決策當下真的可知嗎?Ch 2 建立這道閘門的模型(bitemporal),Ch 3、Ch 4 是它在市場資料與基本面/另類資料上的落地,Ch 5 則是當真實資料不夠時的補充手段。

書把話說得很重:多數假 alpha 來自一小撮資料缺陷——PIT 違反、生存者偏差、公司行動、識別碼 join 錯誤。這些要當成預設風險處理,不是邊角案例。

資料來源 市場微結構 報價、成交、order book Ch 3 基本面與另類 財報、宏觀、鏈上、文字 Ch 4 合成資料 補充路徑、壓力情境 Ch 5 PIT 閘門 bitemporal 模型 Ch 2 available_at <= decision_time 識別碼映射再加生效期間 effective_date <= t < end_date 特徵工程與建模 Part II 之後的一切 Ch 8+ 繞過閘門 = 靜默 lookahead 不會報錯、回測還特別好看——這才是危險的地方

四章的差別只在來源,關卡是同一道:繞過去不會有錯誤訊息,只會給你一份漂亮但假的回測。

A

Ch 2 · 金融資料宇宙

你下載的不是數字,是一整套量測規則

核心思想:資料集不是數字,是一套量測規則。timestamp 語意、調整方法、識別碼政策、修訂處理——這四件事都內建在資料裡。書用一個很好的例子點破:當你「下載日線收盤價」,你其實是採納了供應商的一整套定義——close 是竞價收盤還是最後成交?哪個時區?調整是 point-in-time 還是回溯套用?答錯不會爆錯,只會靜默偏誤。

這章最重要的機制是 bitemporal(雙時間)模型:每筆值同時記「它描述哪個期間」(valid time)與「它何時變成可知」(knowledge time)。有了這兩軸,你才能重建任一歷史時刻的資訊集。

何時可知(knowledge time) Q3 期間(valid time) 這筆值描述的期間 10 月 · 原始申報 營收 $95M 12 月 · 修正 營收 $100M 次年 3 月 · 重編 營收 $102M 決策時刻 t = 11 月 ✓ 這時只存在 $95M,只能用它 ✗ 用 $100M 或 $102M = 用了 11 月不存在的資訊

今天資料庫裡查到的值,2020 年那天並不存在——這就是 restatement leakage,量化投資「七宗罪」之一。

Ch 02 · 新資料源進來時先鎖四件事決策規則
# 建模前先鎖定並寫成 metadata,讓下游無法重新詮釋
鎖定 ① timestamp 語意       # 交易所 / SIP / 供應商 / 到達,是哪一個
鎖定 ② 公司行動調整方法      # 除權息、分割,回溯還是 point-in-time
鎖定 ③ 識別碼政策           # 代號會重用,要用永久 ID + 生效期間
鎖定 ④ 修訂 / 重編處理

驗證順序 先抓會製造 lookahead 的
       PIT 違反 → backfill → 修訂 → 生存者偏差
       # 其他品質維度排後面,這四個最貴

違規時 大聲失敗,不可默默丟列
註解為什麼重要:書實測一份 100 檔 ETF 的 panel,有 473 筆 OHLC 邏輯違規(約 0.1%)——來源是四個價格欄位各自獨立做除權息調整。量級小到可以容忍,但必須記錄;靜默丟列會讓你連自己在丟什麼都不知道。

→ 接到台股(以下為外推,非書上內容):台股同樣有這四個坑,但形狀不同。調整方法上,台股除權息與現金增資的還原方式各家資料源不一致,FinMind 與券商 API 可能給出不同的還原價;識別碼上,台股代號同樣會重用(下市後釋出),公司改名(如更名為控股)也會斷開歷史。修訂則要注意財報的自結、核閱、查核三個版本與公告時點——這正是書講的 bitemporal 問題,只是換成台灣的申報時程。至於具體該用哪個時間戳當 available_at,書沒有台股答案,要自己查公開資訊觀測站的公告規則。

B

Ch 3 · 市場微結構

你怎麼切 bar,就改變了每個觀測值的意義

核心思想:市場資料是撮合引擎「規則+訂單流」的輸出,不是中性的時間序列。忽略 spread、深度、排隊的回測,錯的不只是成本——是整個價格形成過程被錯建模。這章最實用的一個觀念是:取樣方法(bar 的邊界規則)會改變每個觀測值的統計與經濟意義。

為什麼傳統的 1 分鐘 bar 不好?因為各 bar 的資訊含量差太多。書給的數字:開盤與收盤前後 30 分鐘各占日成交量 15–17%,午盤只有 2.6%(約 6 倍差距)。同一個「訊號」在 9:35 和 14:00 根本不是同一回事。改用活動量取樣(每累積固定金額關一根 bar),報酬分布會明顯更接近常態。

取樣光譜 由「看時鐘」到「看資訊到達」 Time 資訊含量最不均 Tick 固定筆數 Volume 固定股數 Dollar ML 的預設選擇 對價位變動穩健 Imbalance 買賣不平衡 Run 連續同向 不需要成交方向分類 只要成交資料就能算 必須先判斷每筆是誰發動 沒有報價資料就別用 決策與標籤定義在時鐘時間(「未來 5 分鐘」)時,還是要用 Time bar——選擇跟著用途走,不是跟著時髦走

往右走資訊密度越均勻,但代價是你得先知道「每筆成交是買方還是賣方發動的」。

Ch 03 · bar 選型與成交方向分類決策規則
預設   機器學習用 dollar bar
       # 只需成交資料、對價位變動穩健、統計性質好

若 需要成交方向(imbalance / run bar):
  有 aggressor 欄位  直接用       # CME 走 FIX tag 5797
  沒有               用 Lee-Ready      # 實測 94.7%,各日 94.4–95.0%
  # 對照:純 tick test 連續分類只有 80.0%

回測成交價 市價買用 ask、賣用 bid
        # 不是 last price——spread 是價格形成的一部分

清洗   標記+排除,絕不插值
       # 插值是在捏造市場活動
註解為什麼重要:成交方向的分類品質會直接傳導成訊號品質——Lee-Ready 與純 tick test 差了約 15 個百分點,這個誤差會一路帶進 imbalance bar。書的建議是:為了這件事重建 order book 是值得的。另有一個容易翻船的細節:imbalance bar 的 EWMA 平滑係數若取 α=0.1,在 NVDA 47% 買比的情況下,期望 bar 大小一天就膨脹 17.5 倍;改成 α=0.001 才持平(0.98 倍)。

→ 接到台股(以下為外推,非書上內容):台股的微結構跟美股差異很大,這章的方法要挑著用。台股是集中市場單一撮合,沒有 NBBO 與跨場所整合報價的問題,Ch 3 談 SIP 與 venue BBO 那一段基本用不到;但盤中零股、分盤撮合、漲跌幅限制是美股沒有的,撮合節奏不同會讓 bar 取樣的意義再變一次。至於券商分點資料——那是台股特有的一層,書裡完全沒有對應物,但 Ch 3 的核心提醒仍然成立:你看到的是「顯示出來的」流動性與流向,不是全部。分點資料同樣看不到內部化與跨券商調撥。

C

Ch 4 · 基本面與另類資料

兩件事做對,比演算法聰明更重要

核心思想:實戰失敗集中在兩件事——時間一致性與實體一致性。時間一致性就是 Ch 2 的 PIT,只是換到財報、宏觀、鏈上資料的場景;實體一致性(entity resolution)則是這章特有的:不同來源的記錄,要對到同一個發行人或同一檔可交易證券。書講得很直白:把這兩件事做對的工程紀律,比聰明的演算法更決定成敗。

為什麼實體對齊這麼危險?因為失誤是不對稱的:漏配只是損失覆蓋率,錯配會污染整條回測。書舉的例子很好記——把「ZOOM VIDEO COMMUNICATIONS」(ZM) 誤配成「ZOOM TECHNOLOGIES」,產出的 alpha 就只是雜訊。

兩筆記錄 來自不同資料源 有標準識別碼? LEI / CIK / FIGI 有 ① 確定性比對 但要先選對層:實體 / 證券 / 合約 沒有 ② 機率比對 名稱相似度分數 ≥ 95% 自動接受 每月仍要抽驗 1–5% 85–95% 人工審查 決定寫回 master 表 < 85% 升級特徵再比 地址、網站、描述 失誤不對稱:漏配只損失覆蓋率,錯配會污染整條回測——所以先求 precision

閾值不是普世常數,要對你自己標註樣本的實際分數分布校準過才算數。

Ch 04 · 另類資料的評估順序決策規則
# 順序不能顛倒:先過硬性關卡,才輪到比訊號分數
關卡一 法律/合規      hard fail
       # MNPI 紅旗、隱私風險——法律風險不能被績效「優化掉」
關卡二 PIT 完整性      hard fail
       # 講不清「首次可觀測時間」,PIT 回測就不可辯護

通過後才比 增量價值
       # 對既有 baseline 特徵集測增量,不看原始相關係數

半衰期當設計約束
       已發表的預測因子,發表後平均衰減約 58%
       # McLean & Pontiff (2016)

供應商說不清修訂處理
       推定它不是 PIT-correct,直到證明為止
註解為什麼重要:書給了一個很好用的洩漏自檢法——把同一個策略跑兩次,一次用 as-of 合格的版本、一次用「今日最新值」。後者通常更好看,但那不是訊號變強,是資料悄悄吃了未來資訊。這個 A/B 幾乎不花成本,卻能抓到最貴的錯。

→ 接到台股(以下為外推,非書上內容):實體對齊在台股同樣會咬人,只是形式不同:公司改名與轉型控股(歷史資料掛在舊名下)、代號重用、興櫃轉上市時的識別碼變動、以及集團內母子公司如何歸戶。書的三階段方法(確定性 → 機率 → 人工)可以直接搬,但閾值必須自己校準——中文公司名的相似度計算跟英文完全不同,95%/85% 這組數字是書上對英文名稱的經驗值,不要照抄。至於 PIT,台股財報有自結、核閱、查核多個版本,公告時點才是 available_at,與書上用 SEC accepted_at 的邏輯一致。

D

Ch 5 · 合成金融資料

歷史只給了你一條路徑

核心思想:歷史只提供一條實現路徑,回測很強可能只是那條路剛好順風。合成資料的用途,是把「單一歷史」變成「一組可信歷史的分布」來評估穩健性。但書把定位講得很清楚:它是決策支援工具,不是預測,而且——這句最重要——驗證協定往往比生成架構本身更重要。

這章的評估骨架是三個互相拉扯的準則:Fidelity(像不像)、Utility(有沒有用)、Privacy(會不會洩漏)。三者無法同時最大化,也沒有一個普世的「合成資料分數」。書用一個案例把 Fidelity 與 Utility 的分離示範得很清楚:GReaT 生成器在下游分類任務上達到真實資料的 92%(TSTR AUC 0.70 vs TRTR 0.74)——看起來很成功;但同時邊際分布的 KS 統計量落在 0.30–0.59(統計上明顯可分辨),類別分布嚴重塌縮。任務有用,分布卻是歪的。

Fidelity 像不像 分布、尾部、波動聚集 Utility 有沒有用 下游任務表現 Privacy 會不會洩漏 記憶稀有記錄 互相取捨 沒有普世分數 Utility 怎麼量:TSTR 用合成資料訓練 train on synthetic 在真實資料測 test on real 和「真實訓練+真實測試」比,誤差比率越接近 1 越好 但 Utility 過關 ≠ Fidelity 過關 實例:TSTR 比率 0.954 看起來近乎完美, 平方報酬 ACF 卻從實證的 0.49 塌到 0.05 = 波動聚集根本沒被保留

金融的決策相關結構集中在極端——中心像得不得了但低估 drawdown 的生成器,一點用都沒有。

Ch 05 · 合成資料實驗的四件套決策規則
# 每個合成資料實驗,這四項都要回報,缺一項結論就不完整
回報 ① fidelity 診斷   # 邊際、相關矩陣、尾部、波動持續性
回報 ② TSTR vs TRTR   # 效用基準
回報 ③ privacy 檢查    # 重複、最近鄰、成員推論或 DP 預算
回報 ④ 真實 holdout 結果

上場順序 先跑傳統 baseline
       stationary bootstrap / GARCH(1,1)
       # 深度生成器至少要在關鍵診斷贏過它們,才值得那個複雜度

波動聚集 用平方報酬的 ACF 驗
       # IID bootstrap 與多數 GAN 都在這裡露餡

最終確認 決賽名單一律回到
       未參與生成器訓練的真實資料上跑
註解為什麼重要:這章存在的理由本身就是個警訊——書引用的估計是:即使所有策略的真實 Sharpe 都是 0,光是測試 10 個配置,期望的最大樣本內 Sharpe 就已經達到 1.57;測 100 個會超過 2.5。你在合成路徑上挑策略時,挑到的可能只是最貼合生成器假設的那一個,不是最貼合市場的。

→ 接到台股(以下為外推,非書上內容):合成資料對台股的誘惑更大、風險也更大。誘惑大是因為台股可用的歷史比美股短、單一市場的 regime 樣本更少,很容易想「生一些出來補」。風險大則是因為台股有漲跌幅限制——這是一個硬性的分布截斷,通用生成器(GBM、GARCH、多數 GAN)預設沒有這個約束,生出來的極端報酬可能根本不可能在台股發生。書講的 stylized facts 驗收(厚尾、波動聚集、槓桿效應)仍然適用,但台股要多驗一項:生成的報酬有沒有違反漲跌幅。這條書上沒有,是台股特有的約束層。

E

這一部分的決策速查

資料層的閾值與規則,動手時回來查這張表

情境怎麼做出處
新資料源進來先鎖 timestamp 語意、調整方法、識別碼政策、修訂處理四件事,寫成 metadataCh 2
任何跨源 join加 available_at <= decision_time;識別碼映射再加生效期間Ch 2、Ch 4
驗收優先序先排查 PIT 違反、backfill、修訂、生存者偏差——這四個最貴Ch 2
選儲存方案從分區 Parquet + Polars/DuckDB 起步,有併發或治理需求才升級Ch 2
回測要成交市價買用 ask、賣用 bid,不用 last priceCh 3
選 bar 類型ML 預設 dollar bar;標籤定義在時鐘時間才用 time barCh 3
要成交方向優先用 aggressor 欄位;沒有就 Lee-Ready(94.7%),別用純 tick test(80.0%)Ch 3
做 imbalance barEWMA 用 α ≈ 0.001(不是 0.1)+ warmup 100 根以上Ch 3
清洗 tick/quote標記+排除,絕不插值;改動要留審計紀錄Ch 3
偵測日內跳躍用局部 bipower 波動率,不用日 σ 閾值(5 分鐘 bar 取 K=12、α=0.01)Ch 3
實體對齊閾值≥ 95% 自動接受、85–95% 人審、< 85% 升級特徵;每月抽驗 1–5%Ch 4
評估另類資料先過法律與 PIT 兩道 hard-fail,才比增量價值(對 baseline 測,非原始相關)Ch 4
宏觀資料回測用 vintage(當時已知版本),不是今天的最終值Ch 4
合成資料選策略決賽名單一律在未參與生成器訓練的真實 holdout 上確認Ch 5
驗證生成器平方報酬 ACF 是波動聚集的首要診斷;先比傳統 baseline 再談深度模型Ch 5

注意事項 · 這一部分最容易踩的坑

🕰️用今天的資料庫值回測歷史:最貴也最常見的錯。財報重編後供應商會覆寫歷史,你今天查到的值在當年並不存在。自檢法很便宜——同一策略跑 as-of 版與「今日最新值」版,後者比較好看就是有問題。
👻用今天的成分股回測歷史:即使公司都還活著,「被選入指數」這件事本身就是結果依賴的濾網。書實測美股 3,199 檔中有 777 檔(24.3%)在資料截止前下市;只看存活者,2014–2018 期間會高估報酬 3.5–15.3 個百分點。注意偏差正負取決於下市主因——破產潮會高估,併購潮反而可能低估。
📉用未調整價格算報酬:AAPL 的 7:1 分割會讓原始價看起來像崩跌 86%。書的 panel 上原始價累積 5.9 倍、調整後 398 倍——低估約 68 倍。但也別混用調整方法或用期末因子回填歷史,那又變成另一種 lookahead。
🔗靜態代號對照表:沒有 effective_date 的 ticker 映射,會讓 2015 年的另類資料 join 到 2024 年的代號上——你得到一個歷史上不可能存在的資料集,同時混合了 lookahead 與生存者偏差。
📐本頁的來源邊界:內容取自 skills/ml4t/chapters/ch02–ch05 蒸餾檔。來源 EPUB 抽取時數學公式與圖表無法讀取,本頁的數字都取自章節檔中以文字明確寫出的部分。書中回測數字為作者測試床實測,屬研究等級、非實盤依據;口徑是美股,台股段落已標示為外推。