simon·geofin
Sections
Research · 方法論研究

回測常見陷阱:七種 overfitting 的樣貌

我見過(也自己犯過)的七種回測陷阱。每一種都會讓你看到一個漂亮的 Sharpe,然後在實盤上消失。這篇是一份實用檢核表,不是教科書。

2026-04-165 min read回測 · Overfitting · 方法論

為什麼要寫這一篇

為什麼要開這間研究室那篇提過一個 Sharpe 2.16 的幻覺——回測結果好看,原因是沒設 LightGBM 的 random seed。那是我自己踩的 最貴一次坑。

但 overfitting 不只一種長相。過去幾年我遇過(或看別人踩到)的至少有七種, 每一種的機制都不同,防禦方法也不同。把它們一次寫下來,對未來的我和讀者 都有用。


陷阱 1 — Random Seed 樂透

症狀:同一組參數,不同 random seed 跑出的 Sharpe 可以差 2–3 個單位。 你不自覺選到最幸運那一顆,就誤以為有 edge。

機制:機器學習模型(尤其 gradient boosting、神經網路)對初始化極敏感, 訓練過程隨機性高。

防禦:

  • 固定 random_state
  • 至少 10 個 seed 平均,報告 mean + stdev
  • 如果 stdev > |mean|,宣告非 edge

陷阱 2 — Look-ahead Bias(未來窺視)

症狀:用 t+1 的資料當 t 的 feature。回測 Sharpe 5+,實盤歸零。

常見來源:

  • 用收盤價當開盤訊號
  • 用當季財報當季初 feature
  • 用未 restatement 的最終版數據當當時可見資料

防禦:


陷阱 3 — Survivorship Bias(倖存者偏差)

症狀:回測用的股票池是「今天還存在的股票」,漂亮。實盤在歷史上遇到 下市股、合併股時完全走樣。

機制:歷史上倒閉 / 下市的股票不在今天的資料庫,但當時是可交易的。 它們的負報酬沒被計入。

防禦:

  • 使用包含下市股的完整歷史資料庫
  • 檢查時點股票池是否包含當時可交易的所有標的
  • Compustat、WRDS 等專業資料源有標記

陷阱 4 — Selection Bias in Hyperparameter Tuning

症狀:你試了 100 組超參數,挑 Sharpe 最高的一組。這組在 out-of-sample 完全不一樣。

機制:多重比較問題(multiple hypothesis testing)。如果你試夠多次, 總會有幾組純粹靠運氣看起來好。

防禦:

  • Walk-forward optimization,不是一次性 grid search
  • 用 nested cross-validation
  • 計算 deflated Sharpe ratio(考慮試驗次數)
  • 報告所有試驗結果,不只最好那個

陷阱 5 — Regime-specific Overfitting

症狀:策略在 2015–2020 牛市跑得好,其他 regime 歸零。你只測試了特定 regime。

機制:歷史上不同時期的市場結構差異巨大。你在一種 regime 上 fit 出的 模型,可能跟下一種 regime 完全相反。

防禦:

  • 跨 regime 測試(牛市 / 熊市 / 橫盤 / 高通膨 / 低通膨)
  • Walk-forward 時切不同時段
  • 對極端事件(2008、2020、2022)做特別檢查

陷阱 6 — 交易成本與 Slippage 假設過於樂觀

症狀:回測 Sharpe 2,但假設 0 手續費 + 0 slippage。加上實際交易成本後 歸零或負。

常見錯誤:

  • 假設「以當期中間價成交」
  • 忽略市場衝擊(大量單的 slippage 非線性)
  • 忽略借券成本(做空策略)
  • 忽略税負(短線 vs 長線稅率差)

防禦:

  • 用保守的 slippage 假設(至少 10 bp,流動性差的標的更高)
  • 加上實際手續費(券商 + 交易所 + 交割)
  • 對高週轉策略特別嚴格測試

陷阱 7 — Data-Snooping(資料偵查)

症狀:你看了資料很久,「發現」一個好用的信號。這個信號看起來有效, 因為你已經把資料看穿了。

機制:這是最隱蔽也最難防的。它不是「明顯用未來資料」,而是「你對整段 歷史的記憶已經污染了你對 feature 的選擇」。

防禦:

  • 保留 holdout set(從不看、從不測試,直到最後一步)
  • Pre-registration(在開始測試前寫下假設)
  • 對自己誠實:「這個 feature 我是第一次想到的,還是因為我知道歷史上它有效?」

七陷阱的嚴重度排序

依據我的經驗,從最容易犯 / 最難發現的順序:

#陷阱頻率難以發現度
1Random Seed 樂透極高
2Selection Bias (Grid Search)極高
3Data-Snooping極高
4交易成本假設過樂觀
5Regime-specific中高
6Survivorship Bias低(資料源確認即可)
7Look-ahead Bias低(熟手)

最危險的是 Data-Snooping——它不是技術問題,是認知問題。你的直覺已 經被歷史污染了,連自己都不知道。這也是為什麼 pre-registration 在學術界愈 來愈重要。


我的個人防禦 checklist

每次跑新策略前,我都會跑一次這個檢核表:

  • Random seed 固定了嗎?至少 10 個平均過嗎?
  • 所有 feature 都是 t 時間點可見嗎?
  • 股票池包含歷史上下市股嗎?
  • 超參數調優用 walk-forward 嗎?
  • 測試至少 2–3 個不同 regime 嗎?
  • slippage ≥ 10bp,手續費實際計入?
  • holdout set 保留且從未被看過?

任何一項不過,結果就不算數


結語

回測陷阱不是技術問題,是認知誠實度問題。最聰明的人也會犯,唯一的差別 是願不願意在犯了之後誠實撤回

對本站而言,這份 checklist 會持續套用在未來的 Geofin Score 回測、策略驗證、 與任何需要定量結論的 Research 文章。讀者看到本站引用回測結果時,可以預期 這七道關卡都跑過了。


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