2026年八月20日 · 最佳化

三種讓你在不知不覺中做錯前推最佳化的方式

三種讓你在不知不覺中做錯前推最佳化的方式

前推最佳化(walk-forward optimization)向來被視為調參的誠實做法,這名聲也算實至名歸——至少比起把全部資料拿來最佳化、然後對著結果孤芳自賞好太多。但這套技術有它無聲的失效模式,而每一種都會產出同一件東西:一份寫著「穩健」的驗證報告,訂在一支其實並不穩健的策略上。以下是我們必須在工程上防堵的三種,按它們留下的殘骸分類。

失效一:視窗滲漏

錯誤的做法:拿一月到六月調參、七月驗證,然後又讓任何來自七月的資訊影響第二輪——看過樣本外數字後重跑一次、對參數網格做個「小調整」、或是用整段序列做標準化的特徵。每一項單看都無傷大雅。合在一起,樣本外視窗就變成了延遲版的樣本內資料。

殘骸長這樣:樣本外 Sharpe 竟然詭異地跟著樣本內 Sharpe 走。真正的樣本外結果是嘈雜且令人失望的;IS/OOS 之間過度平滑的關係,代表資訊正在往回流。我們明確盯著這個比值——樣本內超過樣本外 3 倍就標記該次執行,而樣本外只要小於等於零,不管樣本內多漂亮都直接判死。

失效二:跨視窗挑指標

跑三個前推視窗,得到三組嘈雜的結果,然後開始總結:取 Sharpe 平均數?中位數?還是以「市場結構改變」為由把最差的那個視窗剔掉?每一個選擇都是一個自由度,而一個夠執著的最佳化器(不管是人還是貝氏演算法)總會找到讓這支策略看起來最好的那種總結方式。每個視窗七十五次 Optuna 試驗,就是七十五次擬合雜訊的機會,再乘上你願意考慮的總結方式有幾種。

殘骸長這樣:一支通過驗證的策略,上線後交出的卻是最差那個視窗的績效——因為最差的那個才是唯一誠實的。我們的規則是:彙總方式在開跑前就寫死在設定檔裡、試驗預算固定,分析師看到的是每個視窗的個別結果並附上離散程度。一支非得靠友善的總結方式才能過關的策略,就是沒過關。

失效三:不再是保留樣本的保留樣本

保留樣本(holdout)只能用一次。當一支策略第二次被拿去對它評估——在微調參數之後、動了訊號之後、或者「我們就再確認一下」之後——它就不再是保留樣本了,而是一個變慢的驗證集。十五天不曾碰過的資料,聽起來要保住很容易,直到迭代的壓力上門,再檢查一次感覺完全無害。

這裡的殘骸很隱晦:同一支策略的保留樣本結果,竟然隨著迭代次數而變好。全新的樣本外資料沒有任何理由偏愛第三次迭代勝過第一次;一旦出現這種情況,就代表保留樣本已經被挖過了。我們用機制強制一次性:保留樣本在每次 pipeline 執行中只評估一次,結果直接寫進紀錄,需要再試一次的策略必須從頭跑完整條關卡——包括重新切分視窗。它至少要保住前推樣本外 Sharpe 的 70%,而且這顆骰子沒有第二次可擲。

能撐過這三種的破綻

在上述所有步驟之前,我們會先跑一輪單純的敏感度掃描:把每個參數上下推 ±20%,觀察指標的變化。真實的優勢會平緩地衰減;巧合則會直接掉下懸崖。這是整條 pipeline 裡最便宜的測試,而它否決掉的策略,往往正是能一路順風通過上面所有關卡的那些——因為參數懸崖,就是過度擬合還來不及躲進驗證機制裡之前的樣子。

3.0×IS/OOS Sharpe 比值上限
70%保留樣本須保住的 WF OOS 比例
±20%每個參數的敏感度擾動幅度
1保留樣本評估次數,永遠只有

這些都不會讓最佳化變得安全。它們只是讓失效模式變得吵鬧——而這已經是你能誠實地要求一套驗證流程做到的極限了。

最佳化前推測試過度擬合保留樣本敏感度分析
← 所有文章