simon·geofin
Sections
Walk-Forward Optimization 是半真半假的防禦
Research · 方法論研究

Walk-Forward Optimization 是半真半假的防禦

Walk-Forward Optimization 被行銷為 overfitting 的終極防禦,但大多數實現方式其實仍然會洩漏信息。這篇拆解三種常見的失敗模式,以及為什麼 WFO 做好很難、做壞很容易。

2026-04-177 min readWalk-Forward · Overfitting · 回測方法論
ShareXThreads

目錄

為什麼大家都在吹 Walk-Forward Optimization,但大多數人都做錯

Walk-Forward Optimization(WFO)在量化投資圈有一個近乎宗教式的地位:「如果你用 WFO,你就不會 overfit」

這是半真半假。

WFO 的核心思想是對的:不要在整個歷史上調一次超參數,而是把時間分成多個窗口,每個窗口先用訓練期(in-sample)調優,再用測試期(out-of-sample)驗證。這樣可以防止「我在 2010–2020 年調出的超參數專門針對那個時期的市場」這類區域特異性 overfitting。

但現實中 90% 的 WFO 實現方式,其實仍然漏掉了資訊。原因有三:


失敗模式 1:超參數掃描本身就是多重比較問題

問題:WFO 的每個訓練窗口內,你通常要調一個超參數網格。假設你試 50 組參數,其中必然有幾組純粹因為運氣會看起來好。

機制:假設訓練期是 2016–2018 年。你試 100 組超參數(學習率、樹深度、regularization),選 Sharpe 最高的那組去 2018–2019 年測試。但這 100 組參數的 Sharpe 分佈中,最高的那個很可能只是隨機波動。當你把它拿到測試期時,Sharpe 立刻縮水。

案例: 我看過一個人做 LightGBM 的 WFO,每個訓練窗口試 10×10 的網格(學習率×樹深度=100 組)。結果是:

  • 訓練期 Sharpe:2.4
  • 測試期 Sharpe:0.8

他以為 WFO 保護了他,其實他只是在每個訓練窗口內重複了回測常見陷阱裡的「陷阱 4 — Selection Bias in Hyperparameter Tuning」。

防禦:

  • 削減試驗空間:不要每個訓練窗口試 100 組參數。改成先在全歷史上找一個「相對魯棒」的超參數集,然後在 WFO 裡只做微調(±10%)
  • 計算 Bonferroni 調整:如果你試 k 組超參數,統計上的 p-value threshold 要下調 k 倍
  • 分離超參數選擇的數據:有些做法會額外保留一個「超參數調優期」,完全分離於訓練與測試期

失敗模式 2:Walk Length 和 Walk Shift 的自由度

問題:WFO 的參數本身——訓練窗口多長、步進多大——都會影響結果。這又成了一個新的「超參數調優」問題。

具體案例:

你要決定:

  • 訓練期長度:2 年?3 年?5 年?
  • 測試期長度:6 個月?1 年?
  • 步進:每月重新調優?每季?

看起來都合理。但實際上,不同的組合會給你完全不同的結果:

訓練測試步進結果 Sharpe為什麼
2 年3 個月1 月1.8頻繁調優,過度反應短期 regime
5 年1 年1 季0.9訓練期太長,參數跟不上 regime change
3 年6 個月3 個月1.2相對平衡

常見做法是:你試了 3 種組合,挑 Sharpe 最高的那種。恭喜,你剛剛做了資料窺視(data snooping)的另一個版本。

防禦:

  • 事前固定 WFO 參數:在看任何回測結果前,寫下你的決定。或者直接引用文獻上常見的設定(例如金融文獻常用「3 年訓練 + 1 年測試」)
  • 跨多種 WFO 配置測試:不要只報一個 Sharpe,報 3–5 種合理的 WFO 設定,看結果是否一致
  • 審視 regime shift 軌跡:如果超參數在每個訓練窗口都劇烈變化,代表策略在追逐短期 regime,這不是好信號

失敗模式 3:無限的研究自由度(Researcher Degrees of Freedom)

問題:WFO 只是框架,框架內的選擇仍然很多。你有無限的方式來「調整」流程,直到結果看起來好。

常見的隱蔽選擇:

  1. 特徵集選擇:你試了 100 個特徵,最後在 WFO 裡只用了其中表現最好的 10 個。這洩露了資訊。

  2. 股票池過濾:你排除掉「異常股」、「流動性太差的股」、「波動太高的股」。每一個過濾決策都看起來合理,但合起來就是資料窺視。

  3. 訊號組合權重:你有 5 個訊號。在訓練期內,你計算它們的相關性,然後按某種方式加權。這個加權過程本身就是超參數調優,但你可能沒意識到。

  4. Entry/Exit 邏輯調整:「這個訊號單獨效果不好,但加上止損後就好了」。止損水位本身是調優。

案例:

我看過一篇號稱「WFO-robust」的論文,結果是這樣的:

  • 第一步:從 150 個特徵中選出 30 個(基於全歷史 correlation > 某個閾值)
  • 第二步:WFO 測試這 30 個特徵的組合
  • 報告結果:Sharpe 1.8

問題是:那個「閾值」是多少?他沒說。換句話說,他試了 10 個不同的閾值,挑 Sharpe 最高的那個,然後聲稱用了 WFO。

防禦:

  • Pre-registration:在看數據前,寫下你的完整流程。包括所有決策點。
  • 限制決策樹:明確哪些選擇是事前固定的,哪些是調優的。WFO 只防禦「超參數」的多重比較,不防禦「設計選擇」的多重比較。
  • 用 Holdout Set 作最終驗證:即使通過 WFO,也要在一段完全未見過的時間(例如最近一年)上驗證一次。

Walk-Forward 為什麼做對這麼難?

三個根本原因:

  1. Overfitting 的層級太多:WFO 防禦超參數的多重比較,但其他層級的多重比較(特徵選擇、信號組合、訊號二元化閾值...)仍然存在。

  2. Regime Change 與訓練期長度的 trade-off:訓練期越短,越容易捕捉當前 regime,但超參數估計越不穩定。訓練期越長,超參數越穩定,但可能已經過時。沒有完美平衡。

  3. 框架本身給人虛假的信心:「我用了 WFO」聽起來像是一個嚴格的科學方法,實際上大部分實現都是鬆散的。這導致研究者放鬆警惕,引入更多隱蔽的多重比較。


Geofin 對 WFO 的立場

本站把「Sharpe > 2 先當 bug」當作基本假設。換句話說:所有回測結果都應該被視為樂觀估計,直到用真實數據驗證

WFO 是必要的防禦,但不充分。流程應該是:

  1. 初期設計:在訓練期上嚴格設計,固定所有非超參數決策
  2. WFO 驗證:多種 WFO 設定下的一致性檢查
  3. Holdout 驗證:完全新鮮的時間段上最後檢驗
  4. 實盤檢驗:論文是論文,真實數據是真實數據

用 WFO 的人通常止步在第 2 步,然後對外宣稱「scientifically validated」。正確的做法要到第 4 步。


實用檢查清單

下次看到有人說他用了 WFO,問以下問題:

  • WFO 的訓練/測試/步進長度事前固定了,還是試多種後挑最好的?
  • 超參數掃描網格多大?有沒有做 Bonferroni 調整或 multiple testing correction?
  • 特徵集、信號權重、止損水位這些「決策」有沒有事前寫下來?
  • 超參數在不同訓練窗口間的穩定性如何?劇烈波動代表什麼?
  • 有沒有在完全新鮮的時間段(例如最近 6–12 個月)上獨立驗證一次?
  • 預期的 Sharpe 衰減是多少?從訓練 → 測試 → 實盤?

如果答案含糊,那就不是 WFO,是「看起來很科學的 HARKing(已事後改造假設)」。


結語

Walk-Forward Optimization 是個好工具,但它不是魔法。大部分用 WFO 的人仍然在洩漏資訊,只是洩漏的方式從「直接在全歷史上 overfit」變成了「在每個小窗口上 overfit,然後通過看起來很科學的框架來合理化」。

真正的防禦不是「用對工具」,而是對自己的多重比較有完整的意識,並在每一層都做控制

WFO 做對了,能防禦 50% 的 overfitting。做錯了,反而給人虛假的信心。


**方法論提醒:**本篇是研究方法論,非投資建議。所有案例均來自個人經驗與公開研究文獻。

參考來源

Geofin Research Weekly

地緣優先的投資觀察週報

每週一封。方法論、失敗紀錄、量化驗證結果。不寄明牌,不寄投資建議。 免費訂閱即可收到精選摘要,付費解鎖完整深度研究。

  • 免費版:每週 1 篇精選 + 市場速覽
  • 付費版:每週 3 篇深度研究 + 數據附件
免費訂閱 →隨時取消,不綁約