問題根源
做量化的人都知道回測是策略開發的核心工具,但問題從來不在於你有沒有做回測,而在於你的回測方式是否真的在模擬「未來」。傳統的 K 折交叉驗證在靜態數據集上運作良好,但一旦放進時間序列,它就會製造出一個你看不見的漏洞:未來數據滲入訓練集。
我的觀察是,很多策略在樣本外表現崩潰,根源在開發者從一開始就沒有把時間的方向性當回事。金融時間序列有一個根本屬性:今天的價格行為受昨天影響,反過來不成立。你在訓練集裡混入了「未來」的數據,模型學到的不是真正的超額收益,只是一種精緻的過度擬合。
時序交叉驗證的邏輯
時序交叉驗證,或者更精確地說,向前滾動驗證(Walk-Forward Validation),就是為了對抗這個問題而存在的。
基本邏輯並不複雜:你把整條時間序列切成多個窗口,每一個窗口都嚴格保持「訓練在前、測試在後」的順序。你不允許測試集的任何信息回流到訓練集。每一次向前推進一個窗口,重新訓練,重新測試,累積出一條模擬真實部署的績效路徑。
但實際操作上,細節才是問題所在。
窗口大小選擇
窗口大小怎麼定?固定窗口還是擴展窗口?這兩個選擇背後其實是對市場狀態的假設。如果你相信市場結構相對穩定,擴展窗口讓你用上更多歷史數據,訓練集越來越大,信噪比理論上更高。但如果市場在某個時點發生了結構性轉變,比如某次流動性衝擊之後的微結構變化,那些遠古數據反而是噪音,固定窗口可能更接近真實。
我傾向於兩者都跑,然後比較績效差異。如果兩種方式的Sharpe差距很大,那本身就是一個訊號,說明你的因子對市場狀態很敏感,這種策略上線之前需要更多的壓力測試。
隔離期的重要性
另一個容易被忽略的問題是隔離期(Embargo)。
訓練集結束到測試集開始之間,要不要留一段空白期?我認為要。原因在於很多因子的構建本身就帶有前瞻性偏差的風險,特別是當你使用的特徵涉及滾動計算、財報數據的發布時間差,或者訂單流的延遲確認。如果訓練集的最後一天和測試集的第一天緊鄰,這些邊界效應會讓你的因子有效性指標虛高。
隔離期的長度取決於你的因子構建邏輯。短週期的高頻訊號可能只需要幾天,基本面因子可能需要一個季度。
因子有效性與IC穩定性
說到因子有效性,時序交叉驗證的一個重要輸出就是每個測試窗口的資訊係數(IC)分佈。我不太相信一個平均值漂亮但標準差極大的因子。這種因子在某些市場狀態下表現亮眼,在另一些狀態下完全失效,實盤中你很難知道自己現在處於哪個階段。我更願意看資訊係數的穩定性,即使均值稍低,但跨窗口的一致性高,這種因子在執行層面更可控。
最大回撤分析
最大回撤的分析也應該在這個框架下進行。每個測試窗口的最大回撤是多少?有沒有某個特定的時間段讓策略持續虧損?如果你發現策略在某類市場環境下系統性失效,那不是壞事,這是信息,你需要加入市場狀態過濾器,或者在那段環境下降低倉位。
執行層面考量
執行層面的現實是,向前滾動驗證的結果再好,也要考慮滑價與流動性的影響。回測裡的成交假設往往過於樂觀。特別是均值回歸策略,訊號往往在流動性最差的時候出現,你的訂單在市場上的衝擊成本會把理論上的超額收益吃掉一大半。
時序交叉驗證不能解決這個問題,但它至少能讓你在進入執行討論之前,先確認你的因子邏輯是乾淨的。
進階:組合淨化交叉驗證
延伸的話,組合淨化交叉驗證(Combinatorial Purged Cross-Validation)是更全面的測試,它在保持時序完整性的前提下,生成更多的測試路徑,讓你對策略的夏普比率分佈有更穩健的估計。計算成本更高,但對於準備實盤部署的策略,多花這個時間是值得的。
結語
時序交叉驗證是一種思維紀律,不只是技術工具。它逼你誠實地面對一個問題:你的策略到底在預測什麼,它的信息來源有沒有污染?這個問題答不清楚,回測結果再漂亮也只是騙自己。
原文出處:voltima_quant (@voltima_quant) 於 Threads · 查看原文

