多數「量產出來的假 alpha」不是模型的錯,是資料層漏水——而且漏水不會報錯,只會靜默偏誤。這四章講的都是同一件事:時間點 t,你到底知道什麼?
三種資料來源,一道共同的閘門
Part I 表面上在講四種不同的資料,實際上只有一個共同主題:任何資料進到下游之前,都必須通過一道閘門——這筆值在決策當下真的可知嗎?Ch 2 建立這道閘門的模型(bitemporal),Ch 3、Ch 4 是它在市場資料與基本面/另類資料上的落地,Ch 5 則是當真實資料不夠時的補充手段。
書把話說得很重:多數假 alpha 來自一小撮資料缺陷——PIT 違反、生存者偏差、公司行動、識別碼 join 錯誤。這些要當成預設風險處理,不是邊角案例。
四章的差別只在來源,關卡是同一道:繞過去不會有錯誤訊息,只會給你一份漂亮但假的回測。
你下載的不是數字,是一整套量測規則
核心思想:資料集不是數字,是一套量測規則。timestamp 語意、調整方法、識別碼政策、修訂處理——這四件事都內建在資料裡。書用一個很好的例子點破:當你「下載日線收盤價」,你其實是採納了供應商的一整套定義——close 是竞價收盤還是最後成交?哪個時區?調整是 point-in-time 還是回溯套用?答錯不會爆錯,只會靜默偏誤。
這章最重要的機制是 bitemporal(雙時間)模型:每筆值同時記「它描述哪個期間」(valid time)與「它何時變成可知」(knowledge time)。有了這兩軸,你才能重建任一歷史時刻的資訊集。
今天資料庫裡查到的值,2020 年那天並不存在——這就是 restatement leakage,量化投資「七宗罪」之一。
# 建模前先鎖定並寫成 metadata,讓下游無法重新詮釋
鎖定 ① timestamp 語意 # 交易所 / SIP / 供應商 / 到達,是哪一個
鎖定 ② 公司行動調整方法 # 除權息、分割,回溯還是 point-in-time
鎖定 ③ 識別碼政策 # 代號會重用,要用永久 ID + 生效期間
鎖定 ④ 修訂 / 重編處理
驗證順序 先抓會製造 lookahead 的
PIT 違反 → backfill → 修訂 → 生存者偏差
# 其他品質維度排後面,這四個最貴
違規時 大聲失敗,不可默默丟列
→ 接到台股(以下為外推,非書上內容):台股同樣有這四個坑,但形狀不同。調整方法上,台股除權息與現金增資的還原方式各家資料源不一致,FinMind 與券商 API 可能給出不同的還原價;識別碼上,台股代號同樣會重用(下市後釋出),公司改名(如更名為控股)也會斷開歷史。修訂則要注意財報的自結、核閱、查核三個版本與公告時點——這正是書講的 bitemporal 問題,只是換成台灣的申報時程。至於具體該用哪個時間戳當 available_at,書沒有台股答案,要自己查公開資訊觀測站的公告規則。
你怎麼切 bar,就改變了每個觀測值的意義
核心思想:市場資料是撮合引擎「規則+訂單流」的輸出,不是中性的時間序列。忽略 spread、深度、排隊的回測,錯的不只是成本——是整個價格形成過程被錯建模。這章最實用的一個觀念是:取樣方法(bar 的邊界規則)會改變每個觀測值的統計與經濟意義。
為什麼傳統的 1 分鐘 bar 不好?因為各 bar 的資訊含量差太多。書給的數字:開盤與收盤前後 30 分鐘各占日成交量 15–17%,午盤只有 2.6%(約 6 倍差距)。同一個「訊號」在 9:35 和 14:00 根本不是同一回事。改用活動量取樣(每累積固定金額關一根 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 是價格形成的一部分
清洗 標記+排除,絕不插值
# 插值是在捏造市場活動
→ 接到台股(以下為外推,非書上內容):台股的微結構跟美股差異很大,這章的方法要挑著用。台股是集中市場單一撮合,沒有 NBBO 與跨場所整合報價的問題,Ch 3 談 SIP 與 venue BBO 那一段基本用不到;但盤中零股、分盤撮合、漲跌幅限制是美股沒有的,撮合節奏不同會讓 bar 取樣的意義再變一次。至於券商分點資料——那是台股特有的一層,書裡完全沒有對應物,但 Ch 3 的核心提醒仍然成立:你看到的是「顯示出來的」流動性與流向,不是全部。分點資料同樣看不到內部化與跨券商調撥。
兩件事做對,比演算法聰明更重要
核心思想:實戰失敗集中在兩件事——時間一致性與實體一致性。時間一致性就是 Ch 2 的 PIT,只是換到財報、宏觀、鏈上資料的場景;實體一致性(entity resolution)則是這章特有的:不同來源的記錄,要對到同一個發行人或同一檔可交易證券。書講得很直白:把這兩件事做對的工程紀律,比聰明的演算法更決定成敗。
為什麼實體對齊這麼危險?因為失誤是不對稱的:漏配只是損失覆蓋率,錯配會污染整條回測。書舉的例子很好記——把「ZOOM VIDEO COMMUNICATIONS」(ZM) 誤配成「ZOOM TECHNOLOGIES」,產出的 alpha 就只是雜訊。
閾值不是普世常數,要對你自己標註樣本的實際分數分布校準過才算數。
# 順序不能顛倒:先過硬性關卡,才輪到比訊號分數
關卡一 法律/合規 hard fail
# MNPI 紅旗、隱私風險——法律風險不能被績效「優化掉」
關卡二 PIT 完整性 hard fail
# 講不清「首次可觀測時間」,PIT 回測就不可辯護
通過後才比 增量價值
# 對既有 baseline 特徵集測增量,不看原始相關係數
半衰期當設計約束
已發表的預測因子,發表後平均衰減約 58%
# McLean & Pontiff (2016)
供應商說不清修訂處理
推定它不是 PIT-correct,直到證明為止
→ 接到台股(以下為外推,非書上內容):實體對齊在台股同樣會咬人,只是形式不同:公司改名與轉型控股(歷史資料掛在舊名下)、代號重用、興櫃轉上市時的識別碼變動、以及集團內母子公司如何歸戶。書的三階段方法(確定性 → 機率 → 人工)可以直接搬,但閾值必須自己校準——中文公司名的相似度計算跟英文完全不同,95%/85% 這組數字是書上對英文名稱的經驗值,不要照抄。至於 PIT,台股財報有自結、核閱、查核多個版本,公告時點才是 available_at,與書上用 SEC accepted_at 的邏輯一致。
歷史只給了你一條路徑
核心思想:歷史只提供一條實現路徑,回測很強可能只是那條路剛好順風。合成資料的用途,是把「單一歷史」變成「一組可信歷史的分布」來評估穩健性。但書把定位講得很清楚:它是決策支援工具,不是預測,而且——這句最重要——驗證協定往往比生成架構本身更重要。
這章的評估骨架是三個互相拉扯的準則:Fidelity(像不像)、Utility(有沒有用)、Privacy(會不會洩漏)。三者無法同時最大化,也沒有一個普世的「合成資料分數」。書用一個案例把 Fidelity 與 Utility 的分離示範得很清楚:GReaT 生成器在下游分類任務上達到真實資料的 92%(TSTR AUC 0.70 vs TRTR 0.74)——看起來很成功;但同時邊際分布的 KS 統計量落在 0.30–0.59(統計上明顯可分辨),類別分布嚴重塌縮。任務有用,分布卻是歪的。
金融的決策相關結構集中在極端——中心像得不得了但低估 drawdown 的生成器,一點用都沒有。
# 每個合成資料實驗,這四項都要回報,缺一項結論就不完整
回報 ① fidelity 診斷 # 邊際、相關矩陣、尾部、波動持續性
回報 ② TSTR vs TRTR # 效用基準
回報 ③ privacy 檢查 # 重複、最近鄰、成員推論或 DP 預算
回報 ④ 真實 holdout 結果
上場順序 先跑傳統 baseline
stationary bootstrap / GARCH(1,1)
# 深度生成器至少要在關鍵診斷贏過它們,才值得那個複雜度
波動聚集 用平方報酬的 ACF 驗
# IID bootstrap 與多數 GAN 都在這裡露餡
最終確認 決賽名單一律回到
未參與生成器訓練的真實資料上跑
→ 接到台股(以下為外推,非書上內容):合成資料對台股的誘惑更大、風險也更大。誘惑大是因為台股可用的歷史比美股短、單一市場的 regime 樣本更少,很容易想「生一些出來補」。風險大則是因為台股有漲跌幅限制——這是一個硬性的分布截斷,通用生成器(GBM、GARCH、多數 GAN)預設沒有這個約束,生出來的極端報酬可能根本不可能在台股發生。書講的 stylized facts 驗收(厚尾、波動聚集、槓桿效應)仍然適用,但台股要多驗一項:生成的報酬有沒有違反漲跌幅。這條書上沒有,是台股特有的約束層。
資料層的閾值與規則,動手時回來查這張表
| 情境 | 怎麼做 | 出處 |
|---|---|---|
| 新資料源進來 | 先鎖 timestamp 語意、調整方法、識別碼政策、修訂處理四件事,寫成 metadata | Ch 2 |
| 任何跨源 join | 加 available_at <= decision_time;識別碼映射再加生效期間 | Ch 2、Ch 4 |
| 驗收優先序 | 先排查 PIT 違反、backfill、修訂、生存者偏差——這四個最貴 | Ch 2 |
| 選儲存方案 | 從分區 Parquet + Polars/DuckDB 起步,有併發或治理需求才升級 | Ch 2 |
| 回測要成交 | 市價買用 ask、賣用 bid,不用 last price | Ch 3 |
| 選 bar 類型 | ML 預設 dollar bar;標籤定義在時鐘時間才用 time bar | Ch 3 |
| 要成交方向 | 優先用 aggressor 欄位;沒有就 Lee-Ready(94.7%),別用純 tick test(80.0%) | Ch 3 |
| 做 imbalance bar | EWMA 用 α ≈ 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 |
effective_date 的 ticker 映射,會讓 2015 年的另類資料 join 到 2024 年的代號上——你得到一個歷史上不可能存在的資料集,同時混合了 lookahead 與生存者偏差。skills/ml4t/chapters/ch02–ch05 蒸餾檔。來源 EPUB 抽取時數學公式與圖表無法讀取,本頁的數字都取自章節檔中以文字明確寫出的部分。書中回測數字為作者測試床實測,屬研究等級、非實盤依據;口徑是美股,台股段落已標示為外推。