Purged 交叉驗證與 embargo:避免交易模型的標籤洩漏
說明金融時間序列中如何處理重疊的未來報酬標籤,並比較 purging、embargo、walk-forward、TimeSeriesSplit 與 CPCV。
本指南內容隨機 K-fold 何時可能造成誤判
簡短摘要
Purged 交叉驗證會從訓練資料中移除結果區間與測試標籤區間重疊的樣本。Embargo 則是在測試區塊之後另外設定緩衝期;當切分允許使用測試區塊之後的資料訓練時,暫不將緩衝期內的後續觀測納入訓練。兩者處理的問題不同,也不會自動把切分轉成依時間順序進行的 walk-forward 模擬。
隨機 K-fold 何時可能造成誤判
一般 K-fold 交叉驗證會把樣本切成幾組,再輪流用其中一組測試。金融資料的觀測值可能彼此相關,面向未來的報酬標籤也可能涵蓋互相重疊的時間區間。這時隨機切分可能讓訓練與測試資訊過度接近,使評估結果看起來過於樂觀。
這不代表 K-fold 在所有情況下都無效。是否適用取決於評估目的、資料結構,以及對依賴關係和標籤區間的假設。對時間序列而言,特徵只能使用預測當下實際可取得的資訊;測試期的未來結果不能進入訓練標籤。
也要先講清楚驗證想回答什麼問題:是模擬當時只用過去資料訓練、再預測後續期間的部署流程,還是想觀察模型在多種切分下的穩定性?兩種目的可能需要不同的資料切分方式。
定義決策時間與標籤區間
每筆樣本都要記錄決策時間 t、當時實際可取得的資訊、特徵視窗、目標標籤區間,以及標籤確定的終點 t1。舉例來說,在 t 做出每日決策、預測未來 5 個交易日報酬的標籤,涵蓋區間 (t,t+5]。t+5 之後才出現的資訊,不能拿來當成 t 時點已知的特徵。
兩筆樣本的歷史特徵視窗有共同部分,不會自動構成洩漏。如果共同的歷史資料在兩個預測時點都已取得,而且特徵只使用各時點當時可用的資料,這通常是市場資料的相依性,與共用未來標籤不同。相反地,把之後修訂的經濟資料或回溯調整的價格,當成當時已知資訊,就會造成問題。
若標籤由事件結束時間或波動度障礙決定,每筆樣本的區間長度可能不同。請保留各標籤實際的起訖時間,不要用固定列數代表所有事件區間。
移除與測試結果區間重疊的訓練標籤
如果訓練樣本的實際結果或標籤區間與測試樣本的結果區間相交,purging 就會將該訓練樣本排除。金融標籤常包含未來報酬或事件;如果只比較決策日期,可能會忽略同一段價格變動同時進入訓練與測試標籤的情況。
對於長度不一的事件標籤,應比較實際的起始與結束時間。對所有樣本一律刪除固定 5 列,可能漏掉較長事件,也可能過度排除較短事件。先檢查標籤區間是否真的重疊,再視切分設計決定是否需要額外的 embargo。
Purging 本身不會讓資料依時間順序切分。某種設計仍可能把測試區塊之後的觀測留在訓練資料中。移除重疊標籤,與模擬只用過去資料進行歷史部署評估,是兩件不同的事。《Advances in Financial Machine Learning》第 7 章說明金融重疊標籤的 purging 作法。
用五個交易日標籤核對重疊區間
假設每天都有一筆決策,每個標籤涵蓋接下來五個交易日,也就是 (t,t+5]。以下日期視為連續的交易日序號。如果測試決策日期從第 11 日到第 15 日,第 15 日決策的測試標籤會延伸到第 20 日。
候選訓練標籤 (7,12] 與測試結果區間在第 11 日到第 12 日之間重疊。另一個候選標籤 (16,21] 也與仍在延續的測試標籤區間相交。因此,這兩筆訓練樣本都應被 purge。判斷根據實際結果區間,而不是只看決策日期相差幾天。
較晚的樣本即使標籤沒有與測試標籤重疊,也可能因為落在另外設定的 embargo 期間而被排除。本例用來示範區間核對方式,不代表所有資料都適用相同長度的間隔。
分開設定 embargo 與 purging
在會使用測試區塊之後資料訓練的切分中,embargo 是測試區塊後方的一段緩衝期;緩衝期內的後續觀測先不納入訓練。它可以降低事件或特徵建構造成的殘餘相依,但不能取代對實際標籤區間是否重疊的檢查。
沒有適用所有資料的固定比例或固定天數。請根據取樣頻率、標籤期限、特徵建構方式及觀測到的相依性選擇緩衝長度,並記錄理由。如果特徵視窗比標籤期限長,embargo 太短仍可能留下相依性。
在 walk-forward 切分中,如果訓練不會使用測試期間之後的資料,通常不需要為後續訓練資料設定 embargo。不過,仍要確認測試前的訓練標籤沒有延伸進測試結果區間。

區分 walk-forward 與 TimeSeriesSplit
Walk-forward 或 rolling-origin 驗證會用過去資料訓練,再用後續期間測試。若要回答歷史部署問題,也就是「當時只使用已知資料,模型能否預測下一段期間」,這種方式很合適。要註明訓練視窗是逐步擴大,還是維持固定長度。
scikit-learn 的 TimeSeriesSplit 也會讓訓練資料早於測試資料;gap 參數指定測試前要從訓練集尾端排除多少筆觀測。官方文件將 gap 定義為樣本列數。對等間隔觀測來說,它代表固定列數的間隔,但不會自動檢查可變長度事件標籤的實際區間。
因此,光設定 gap 不能取代實際標籤區間檢查。時間順序、標籤重疊和需要的緩衝期要分開處理。如果每列資料不代表等距的實際時間,也要記錄列數如何對應到時間長度。
了解 Purged K-fold 與 CPCV 回答的問題
Purged K-fold 會針對每個測試區塊,排除標籤區間與其重疊的訓練樣本。依切分方式不同,訓練資料也可能包含測試區塊之後的觀測。這有助於研究模型在多種期間組合下的穩健性,但回答的問題不同於只用過去資料模擬歷史部署的 walk-forward 測試。
Combinatorial purged cross-validation(CPCV)會組合多個測試區塊,建立多條測試路徑來觀察結果分布。《Advances in Financial Machine Learning》第 12 章對 walk-forward 與 CPCV 的討論介紹相關方法;第 7 章則說明重疊金融標籤的處理方式。多條測試路徑無法消除特徵偷看未來、事後修訂資料、在全樣本上預處理或反覆嘗試模型所造成的選擇偏誤。
不要把 CPCV 路徑數量當成彼此獨立的模型實驗數。從多次嘗試中挑選模型造成的過度擬合,需要另外評估。Bailey 等人探討回測過度擬合機率的研究分析了從多個候選結果中挑選的問題。
檢查切分後仍存在的資料洩漏
Purging 無法修正特徵偷看未來、錯誤時間戳、存活者偏誤或事後修訂資料。如果在切分前用全樣本擬合標準化、缺失值填補或特徵選擇,測試資訊就可能進入訓練流程。依測試結果反覆調整模型,也會產生選擇偏誤。
應在每個訓練 fold 內擬合前處理轉換及特徵選擇,再套用到該 fold 的驗證資料。選模型或超參數時,使用考慮時間順序的巢狀驗證,並保留一個從未用於選擇的最終時間序列 holdout。手續費、價差或實際成交能力等假設不切實際,也會扭曲結果。
交叉驗證無法保證未來表現。分數只是根據特定樣本、特徵與標籤定義,以及成本假設所做的估計。
記錄可重現的驗證設計
每次實驗都應記錄決策時間、資訊可用時間、特徵視窗、標籤起訖時間、訓練與測試 fold 的邊界、被 purge 的樣本、embargo 長度與理由、前處理擬合範圍,以及最終 holdout。這樣其他人才能重建相同的樣本邊界。
延伸閱讀:[金融模型的偏誤與變異取捨](/zh-TW/learn/bias-variance-tradeoff-financial-model-overfitting-explained)介紹過度擬合;[多重檢定與金融中的錯誤發現率](/zh-TW/learn/multiple-testing-false-discovery-rate-finance-explained)討論反覆檢定;[考慮序列相關性的 Sharpe ratio 年化](/zh-TW/learn/sharpe-ratio-serial-correlation-annualization-explained)則說明收益序列評估的另一個問題。報告時要說明每個步驟使用了哪些資料,而不只是列出方法名稱。
常見問題
Q1不同樣本的過去特徵視窗重疊,一定是洩漏嗎?
不一定。如果共同的歷史資料在兩個預測時點都已可用,視窗重疊本身不會洩漏標籤。若測試結果或未來資訊進入訓練標籤、特徵或前處理,才有洩漏風險。
Q2Embargo 一定要設為五天嗎?
沒有通用的長度或比例。請依取樣頻率、標籤期限、特徵建構方式與資料相依性說明緩衝期,並另外檢查實際標籤區間。
Q3CPCV 分數高,就能保證未來交易表現嗎?
不能。CPCV 能產生多條測試路徑,但無法消除未來資訊、事後修訂資料、多次試驗造成的選擇偏誤,或不切實際的成本及成交假設。
資料來源與延伸閱讀
回報問題
我們會準備一封包含本文連結的電子郵件。寄出後,Mark 才會收到你的回報
快速檢查
讀完指南後,用 3 道題檢查一下
問題 01
訓練標籤的結果區間與測試結果區間重疊時,purging 應該怎麼做?
選擇答案即可查看解釋