Walk-Forward Optimization 是半真半假的防禦
Walk-Forward Optimization 被行銷為 overfitting 的終極防禦,但大多數實現方式其實仍然會洩漏信息。這篇拆解三種常見的失敗模式,以及為什麼 WFO 做好很難、做壞很容易。
目錄
為什麼大家都在吹 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 只是框架,框架內的選擇仍然很多。你有無限的方式來「調整」流程,直到結果看起來好。
常見的隱蔽選擇:
-
特徵集選擇:你試了 100 個特徵,最後在 WFO 裡只用了其中表現最好的 10 個。這洩露了資訊。
-
股票池過濾:你排除掉「異常股」、「流動性太差的股」、「波動太高的股」。每一個過濾決策都看起來合理,但合起來就是資料窺視。
-
訊號組合權重:你有 5 個訊號。在訓練期內,你計算它們的相關性,然後按某種方式加權。這個加權過程本身就是超參數調優,但你可能沒意識到。
-
Entry/Exit 邏輯調整:「這個訊號單獨效果不好,但加上止損後就好了」。止損水位本身是調優。
案例:
我看過一篇號稱「WFO-robust」的論文,結果是這樣的:
- 第一步:從 150 個特徵中選出 30 個(基於全歷史 correlation > 某個閾值)
- 第二步:WFO 測試這 30 個特徵的組合
- 報告結果:Sharpe 1.8
問題是:那個「閾值」是多少?他沒說。換句話說,他試了 10 個不同的閾值,挑 Sharpe 最高的那個,然後聲稱用了 WFO。
防禦:
- Pre-registration:在看數據前,寫下你的完整流程。包括所有決策點。
- 限制決策樹:明確哪些選擇是事前固定的,哪些是調優的。WFO 只防禦「超參數」的多重比較,不防禦「設計選擇」的多重比較。
- 用 Holdout Set 作最終驗證:即使通過 WFO,也要在一段完全未見過的時間(例如最近一年)上驗證一次。
Walk-Forward 為什麼做對這麼難?
三個根本原因:
-
Overfitting 的層級太多:WFO 防禦超參數的多重比較,但其他層級的多重比較(特徵選擇、信號組合、訊號二元化閾值...)仍然存在。
-
Regime Change 與訓練期長度的 trade-off:訓練期越短,越容易捕捉當前 regime,但超參數估計越不穩定。訓練期越長,超參數越穩定,但可能已經過時。沒有完美平衡。
-
框架本身給人虛假的信心:「我用了 WFO」聽起來像是一個嚴格的科學方法,實際上大部分實現都是鬆散的。這導致研究者放鬆警惕,引入更多隱蔽的多重比較。
Geofin 對 WFO 的立場
本站把「Sharpe > 2 先當 bug」當作基本假設。換句話說:所有回測結果都應該被視為樂觀估計,直到用真實數據驗證。
WFO 是必要的防禦,但不充分。流程應該是:
- 初期設計:在訓練期上嚴格設計,固定所有非超參數決策
- WFO 驗證:多種 WFO 設定下的一致性檢查
- Holdout 驗證:完全新鮮的時間段上最後檢驗
- 實盤檢驗:論文是論文,真實數據是真實數據
用 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。做錯了,反而給人虛假的信心。
**方法論提醒:**本篇是研究方法論,非投資建議。所有案例均來自個人經驗與公開研究文獻。
參考來源
- Pardo, R. (2008). The Evaluation and Optimization of Trading Strategies (2nd ed.). Wiley. Chapter 6: Walk-Forward Analysis
- de Prado, M. L. (2018). Advances in Financial Machine Learning. Wiley. Chapter 4: Backtesting
- Arnott, R. D., Beck, S. L., Kalesnik, V., & West, J. (2016). "How Can 'Backtests' Overestimate Performance?" Research Affiliates Publications
- Hesterberg, T. C., et al. (2005). "Bootstrap Methods and Permutation Tests" (Chapter in Encyclopedia of Biostatistics). Uses to illustrate resampling for robustness testing
- Holm, S. (1979). "A simple sequentially rejective multiple test procedure." Scandinavian Journal of Statistics, 6(2), 65-70. (Bonferroni-type corrections)
地緣優先的投資觀察週報
每週一封。方法論、失敗紀錄、量化驗證結果。不寄明牌,不寄投資建議。 免費訂閱即可收到精選摘要,付費解鎖完整深度研究。
- 免費版:每週 1 篇精選 + 市場速覽
- 付費版:每週 3 篇深度研究 + 數據附件
同一條思路下的其他研究
回測常見陷阱:七種 overfitting 的樣貌
我見過(也自己犯過)的七種回測陷阱。每一種都會讓你看到一個漂亮的 Sharpe,然後在實盤上消失。這篇是一份實用檢核表,不是教科書。
早盤晨間播報的讀法:當「台積電法說利多」與「ADR -3%」同時出現
台灣散戶每天讀晨間播報,但 90% 的人讀錯了訊號。這篇用一條真實的播報線索,拆解「法說利多 + ADR 跌幅」為什麼其實是賣點訊息,以及如何用 5 步驟區分噪音和真訊號。

存活者偏差:你看到的成功故事全是倖存者
存活者偏差(Survivorship Bias)是投資觀察中最致命的認知錯誤之一。看不見失敗者,就無法正確估計成功的機率。這篇文章用實際案例解釋為什麼。