先講一個我自己的案例。一支黃金方向預測策略,通過了 Monte Carlo 檢驗,通過了 walk-forward analysis,統計顯著性 p<0.01。以多數人的標準,這支策略已經「驗證完畢」,可以上真錢了。
後來它被證明是假的。死因不是程式寫錯,是驗錯了題。那個 p<0.01 來自重疊 12 個月的取樣視窗,相鄰兩個樣本有 11 個月是同一段資料。改用非重疊樣本重算,p 值變成 0.237。再加上 Newey-West 修正,p=0.47。名目上有 258 個樣本,有效樣本大約只有 20 個。訊號從頭到尾不存在。這是一次標準的回測過擬合,只是死法不在多數人預期的地方。
這篇文章要拆的就是這件事:回測過擬合遠遠不只「參數調太多」一種。它至少有九種死法,而市面上最常見的兩個防護工具,Monte Carlo 和 walk-forward,只能擋住其中一種。我會把九種死法逐一攤開,說明每一種的機制、為什麼標準工具抓不到、用什麼才抓得到,最後給一套從挖掘到驗收的防治流程。
如果你還在建整套系統的階段,建議先讀量化交易系統的五層結構那篇,本文聚焦在其中最容易自欺的驗證層。
什麼是回測過擬合:你優化的是雜訊,不是訊號
量化回測的原始用途,是在投入真金之前檢驗一個交易假設。過擬合指的是:策略的規則與參數被調整到貼合歷史資料中的隨機雜訊,而非真實存在的結構。歷史上剛好發生過的巧合,被當成了可以重複的規律。
用白話講:你不是找到了市場的規則,你是把考古題的答案背起來了。下一次考試換題目,成績立刻打回原形。
過擬合的策略有一個共同特徵:回測績效與實盤績效之間有巨大落差。回測 Sharpe 3.0、實盤 Sharpe 0.4 的故事,在量化圈不是意外,是常態。Bailey 與 López de Prado 在 The Probability of Backtest Overfitting 這篇論文裡給過一個冷靜的結論:在夠大的參數空間裡隨機搜尋,幾乎保證能找到一條漂亮的回測曲線,即使底層完全沒有可交易的訊號。
問題在於,多數人對過擬合的想像只停留在「參數調太多」。這只是九種死法裡的一種,而且是唯一一種標準工具真的防得住的。
盒內與盒外:為什麼 Walk-Forward 給你虛假的安全感
先建立一個關鍵區分。Monte Carlo 和 walk-forward 都是「盒內」工具:它們在你選定的那一支策略、選定的那份資料裡做驗證。WFA 滾動地在訓練段調參、在測試段驗證,防的是參數貼合雜訊。MC 打亂順序或重抽樣本,防的是績效依賴特定路徑。
這兩道牆都有價值。但真正殺死策略的東西,幾乎都在盒外。
你在五支候選策略裡挑了 WFA 表現最好的那支?這個「挑」的動作發生在 WFA 迴圈外面,WFA 不會因為你五選一而懲罰你。你的資料面板裡混進了公布日之後才知道的宏觀數據?WFA 信任你餵給它的面板,不會去查面板有沒有偷看未來。你的績效全部由某一段牛市撐起?WFA 的每個 fold 都抽自同一個時代,往前走一百次也證明不了策略在別的環境活得下來。
牆蓋得很紮實,子彈從沒有牆的方向進來。這是回測過擬合最危險的型態:你以為驗證過了,其實只驗了九分之一。
先把九種死法列出來,後面逐一拆解:
- 選擇偏誤:試了很多組,只報最好那組(盒外)
- 基準選錯:對「零」或弱對手檢定,不對最強的笨方法(盒外)
- 前視偏誤:決策時用到當時還不知道的資料,含 publication lag(盒外)
- 重疊樣本:自相關觀測被當成獨立樣本,p 值被灌小(盒外)
- Regime 依賴:全部績效由單一時代撐起(盒外)
- 因子偽裝:「alpha」其實是已知 beta 換了衣服(盒外)
- 減風險誤認為 alpha:抗跌來自結構性持有現金,不是訊號(盒外)
- 來源污染:亮眼數字借自別支策略或別段資料(盒外)
- 參數過擬合:參數貼合歷史雜訊(盒內,WFA 唯一真正防得住的一種)
八種在盒外,一種在盒內。這就是「通過 walk-forward 還是賠錢」的算術。
五個最常見的盒外陷阱
陷阱一:選擇偏誤,試了很多組、只報最好那組
機制很單純。N 個帶雜訊的估計值取最大值,那個最大值天生就高於任何一個的真實值,即使 N 個全是雜訊。你試了 240 組參數與變體,挑出最好的一組寫報告,這組的亮眼績效裡有很大一部分只是「取最大值」這個動作本身製造的。
一個真實案例:某研究者寫了 S1 到 S5 五個策略變體,挑表現最好的 S3 準備寫白皮書。把搜尋過程中實際碰過的 240 個設定全部放進 White’s Reality Check 與 Hansen SPA 檢定後,SPA 的 p 值是 1.0,連 universe 裡最佳的那支都跑輸基準,S3 在全體排名第 103。它不是訊號,是選擇偏誤的殘渣。
防治工具是全 universe 的 SPA 檢定,加上 Deflated Sharpe Ratio:把你真實嘗試過的組數(包括看了一眼就丟掉的)折算進顯著性門檻。試越多,門檻越高。只把贏家放進檢定的做法沒有意義,懲罰的對象必須是整個搜尋過程。
陷阱二:基準選錯,贏過零毫無意義
「年化 16%,是大盤的兩倍」這種宣稱,拆開來常常長這樣:對照組用的是不含息指數,每年憑空少算約 1.9% 的股息;策略本身的 16% 則來自逐 fold 重新校準的 in-sample 版本,實盤根本複製不了。誠實重建後變成 6.2% 對 11%,輸給大盤。
更隱蔽的版本是不比靜態配置。你的策略 Sharpe 0.65,聽起來還行,但無腦的 50/50 股金組合 Sharpe 0.91。你花了幾個月調出來的東西,輸給一個不需要任何訊號的固定比例。
正確的虛無假設不是「零」,是最強的笨方法:含息指數、50/50、risk parity、等權組合、已知因子的複製組合。在看結果之前就把基準寫死,不要事後挑一個剛好輸給你的弱對手。
陷阱三:前視偏誤,最隱蔽的是 publication lag
決策時點用到了當時還不知道的資料,就是前視。粗糙的版本容易抓,例如用當日收盤價決定當日進場。隱蔽的版本是宏觀數據的公布延遲:M2、CPI、GDP 都是事後一到兩個月才公布,你的回測若在月初就用了當月數值,等於每次決策都偷看了未來。
這種洩漏的警訊是策略「準得不像話」。模型會很開心地利用你留下的任何一絲前視,然後把它包裝成天才般的擇時能力。防治只有一條路:全部資料 point-in-time,每個落後型因子扣掉對應的 publication lag,標準化與百分位計算只用當時已知的歷史。
順帶一提,把「扣 lag 前」與「扣 lag 後」的績效差算出來,你就能量化前視替你偷了多少報酬。這個數字常常大到讓人清醒。
陷阱四:重疊樣本,p 值被灌小好幾個數量級
開頭那支黃金策略死的地方。用重疊視窗取樣(例如每個月取一次未來 12 個月報酬),相鄰樣本高度相關,卻被當成獨立觀測丟進統計檢定。名目樣本數 258,有效樣本數約 20,p 值被灌小了好幾個數量級。
危機對沖類策略是重災區。你的資料裡也許有 250 個月,但真正的危機只有 5 次。你的有效樣本是 5,不是 250。所有結論都應該用有效樣本數來陳述。
防治:HAC / Newey-West 標準誤是基本功,重疊視窗改成非重疊重算一次,兩版都報。修正後顯著性還在,才算數。
陷阱五:Regime 依賴,你的 edge 只是某個時代的影子
某輪動策略回測十幾年,績效漂亮。逐段拆開後發現,全部超額報酬由 2019 年之後的黃金牛市撐起;2007 到 2013 年是負 Sharpe,而且長期躺在現金裡,錯過了金融海嘯後的大反彈。
殺手級的測試是這個:把 edge 最強的那段 regime 切掉,重跑整條策略選擇流程。如果選出來的配置跟原本完全不同,代表你的「策略」只是那個時代的影子。上面那個案例重跑之後,選出的配置徹底漂移,而且在被切掉的年份裡找不到任何正 edge。
Regime 的切法必須用外生的宏觀資料(通膨高低、利率正負、股市牛熊),不能用策略自身的績效好壞來切,否則是循環論證。
進階陷阱:偽裝的 alpha 與被污染的數字
陷阱六:因子偽裝,你的 alpha 是 beta 換了衣服
把策略報酬拿去對已知因子回歸(市場、規模、價值、動能、carry),殘差截距不顯著,代表它只是某個已知 beta 的偽裝。某「黃金擇時」策略拆開後,其實就是結構性偏多黃金:好年份就是黃金的好年份,沒有任何擇時成分。
陷阱七:減風險誤認為 alpha
這是最有欺騙性的一種。策略最大回撤從 51% 壓到 18%,看起來像本事。但檢查它的 risk-off 訊號,叫對回撤的真陽性率只有 35%,假警報率 65%,跟亂猜差不多。抗跌的真正來源是它結構性半倉現金,而這件事一個靜態 50/50 配置免費就能做到,Sharpe 還比它高。降風險不等於 alpha。要宣稱訊號有價值,至少要贏過不需要訊號的固定比例配置。
陷阱八:來源污染,數字掛錯了名字
純粹的人為疏失,殺傷力卻最大。某白皮書裡「2008 年 +5.8%、2022 年 +11.6%」的危機表現,追查後發現是另一支策略的代理數字,被掛在本策略名下。這會讓人對一個從沒被驗證過的能力產生信心。防治方法只有笨功夫:報告裡每個亮眼數字逐筆溯源,對回本策略的實際持倉。
在我們的研究框架裡,這三種偽裝是審查任何對外績效宣稱時的第一檢查點,因為它們最常出現在「看起來很專業」的白皮書裡。
陷阱九:參數過擬合,唯一活在盒內的死法
最後這種就是 WFA 設計來抓的那種:參數被調到貼合歷史雜訊,樣本外立刻退化。除了 walk-forward,還有一個便宜的檢查:擾動每個自由參數 ±10%,看績效響應面是高原還是孤峰。有個案例的全樣本最佳閾值就是孤峰,±10% 擾動後 Sharpe 衰減約 29%,而生產環境用的參數甚至不在穩健區裡。
重點是比例感。如果你只防了這一層,你只防住了九種死法裡的一種。
防治框架:從挖掘那一刻就要在場的紀律
多數人的量化回測流程是:先自由挖掘,找到好東西,再回頭補驗證。這個順序本身就是錯的。選擇偏誤一旦在挖掘階段烤進資料裡,事後就再也測不出來了。紀律必須在碰資料之前就位。
第一步,先寫經濟假設。在看任何資料之前,寫下這個 edge 為什麼應該存在:風險溢酬、行為偏誤、結構或制度因素、微結構,四選一。寫不出可信機制的,不要挖。沒有「為什麼」的 edge 幾乎都是過擬合,這是成本最低的一道防線。
第二步,鎖保險庫。立刻切出最近 20% 到 30% 的資料(或完整的一個時代),標記為禁區。所有探索、特徵工程、選模、調參都不准碰它。它只在最後驗收時被使用一次,這是你唯一誠實的樣本外測試。碰過第二次,它就不再是樣本外。
第三步,設定 trial budget 並誠實計數。每試一個特徵、一個模型、一組參數,都是一次 trial,包括你看了一眼就丟掉的。這個數字最後要餵進 Deflated Sharpe 的折扣公式。多數人低報這個數字一到兩個數量級。
第四步,預先指定基準。在看到任何結果之前,寫死你要打敗誰:含息指數、靜態配置、相關因子。
第五步,依序過八關驗證。基準健全性、選擇偏誤校正、推論嚴謹度、regime 穩健性、前視與資料完整性、因子歸因、參數穩健性、成本與容量。每一關給二元裁決:存活或死亡。任何一關死亡,就明確記錄死在哪個結構,不要「整體看起來還行」地混過去。
最後做一個 meta-check:回顧整個過程,你做的每一個取捨(基準怎麼選、樣本怎麼切、顯著性怎麼算)是不是剛好全部對結果有利?真正的分析,假設取捨會有對有錯。如果每一刀都剛好切在對你有利的位置,你做的不是分析,是辯護。一個真實的 edge 經得起對它最不利的合理假設;經不起的,不是 edge。
這套流程我們在 Lab 社群裡會拿實際策略逐關演練,包括 SPA、Deflated Sharpe 與 purged CV 的程式實作。有興趣把自己的策略丟進絞肉機的,那裡是合適的地方。
過了驗證,你可以宣稱什麼、不能宣稱什麼
驗證的產出不只是「能不能上線」,還包括「能誠實說出口的話」。幾條對應關係:
- 殘差 alpha 不顯著:不可宣稱「alpha」、「贏大盤」、「擇時能力」。
- 回撤低於基準、但 Sharpe 輸給靜態配置:只能說「相對買進持有降低回撤」,不能說這是策略的功勞。
- SPA 或 Deflated Sharpe 未過:不可使用「經統計證明」、「顯著」這類字眼。
- 只在單一 regime 有效:必須明示「績效集中於某環境,其他環境未經驗證」。
還有一件事常被忽略:實盤能證明的東西比想像中少。上線三個月不虧錢,能證明你的管線正常、成本估計合理、平靜期不流血。它不能證明你的 edge 真實存在,尤其當這個 edge 仰賴稀有事件時,平靜期的實盤什麼都證明不了。
結論:回測的目的是殺掉策略,不是證明它會賺
把這篇的重點收攏成五句話:
- 回測過擬合有九種死法,Monte Carlo 與 walk-forward 只防得住參數過擬合這一種。
- 最致命的威脅都在盒外:選擇偏誤、基準選錯、前視洩漏、重疊樣本、regime 依賴。
- 紀律必須在挖掘當下就在場,事後補驗證測不出已經烤進去的偏誤。
- 正確的虛無假設是最強的笨方法,不是零。
- 如果你的每個假設取捨剛好全對結果有利,那是自欺的警報。
找出「看起來會賺錢」的模式是世界上最容易的事,隨機雜訊裡都找得到一堆。難的、也是唯一有價值的,是不被自己騙。把算力指向證偽,而不是證實。一支策略在被盡力殺過之後還活著,才值得投入真錢。
我每週會把這類驗證框架與實際市場數據的交叉檢驗寫進電子報,包括流動性、衍生品結構與鏈上籌碼的例行審視。想讓自己的決策流程多一層濾網的,可以訂閱追蹤。
Meta Elements
Meta Title: 回測過擬合的九種死法:為什麼通過 Walk-Forward 還是賠錢
Meta Description: 回測過擬合不只是參數調太多。本文拆解選擇偏誤、前視、重疊樣本、regime 依賴等九種死法,說明標準驗證工具為何只擋得住一種,並給出從挖掘到驗收的防治流程。
Primary Keyword: 回測過擬合
Secondary Keywords: 量化回測, 過擬合, walk-forward analysis, 樣本外測試, 選擇偏誤, 前視偏誤, Deflated Sharpe
URL Slug: /blog/backtest-overfitting
Internal Links: /blog/quant-trading-system, /story/, /#lab-benefits, adtrader.beehiiv.com
External Links: SSRN (Probability of Backtest Overfitting), SSRN (Deflated Sharpe Ratio), Hansen SPA (doi.org)
Word Count: ~4600 字




