一支策略該不該上線,不該由回測的 Sharpe 決定,該由五個跟績效高低無關的數字決定。
如果你已經接受過度優化這件事存在,也知道自己多少犯過,那下一個問題就很實際:燒錢之前,怎麼把它抓出來。這篇處理的就是這一段。五個過度優化警訊,每一個都變成一個可以在半天內算完的數字,附上觸發門檻,以及它各自會在什麼情況下騙你。
機制層的東西這裡不重複。優化器為什麼分不出訊號和雜訊、為什麼整個調參過程感覺起來完全像在做研究,過度優化:量化交易策略的隱形殺手那篇拆過。本文只做一件事:把警訊變成量表。
為什麼過度優化警訊看的是形狀,不是高度
績效的高低是優化器的輸出。它一定漂亮,不漂亮你不會停在那裡。拿漂亮程度去驗證漂亮程度,是循環論證。
五個警訊檢查的是另一件事:當你去動這份績效的時候,它會怎麼變形。真實的市場結構是鈍的,對參數的小幅偏移、對成本的估計誤差、對樣本的切法,都有一定的容忍度。雜訊擬合出來的績效是尖的,碰哪裡都塌。
下面這張表是本文的目錄,也是你跑完之後該填的表。
| 警訊 | 量什麼 | 觸發門檻 |
|---|---|---|
| 一、參數孤峰 | 聯合鄰域衰減比 | 低於 0.6 |
| 二、樣本外衰退 | 各段 WFE 的分佈 | 中位數低於 50%,或負值段數超過三分之一 |
| 三、自由度超支 | 有效交易數 ÷ 自由度 | 低於 30 |
| 四、邊際貢獻不遞減 | 樣本外 ablation 曲線 | 單條規則貢獻超過總績效 30% |
| 五、獲利邊緣太薄 | 損益兩平成本 ÷ 實際成本 | 低於 3 倍 |
五個數字沒有一個需要新工具,全部用你現有的回測引擎就跑得出來。
警訊一:參數孤峰,鄰域一動就垮
現象很好認:最佳參數旁邊那一格就賠錢。
量的方式是鄰域衰減比。取最佳點上下各一格的參數組合,算它們的平均績效,除以最佳點的績效。高於 0.8 代表這塊區域是鈍的,可以用;0.6 到 0.8 之間要觀察;低於 0.6,你找到的多半是雜訊的座標,不是市場的節奏。
多數人算錯的地方在於只看單軸切面。三個參數的策略,你把均線週期往左右各推一格看起來很平緩,但把三個參數同時各推一格,那是 26 個鄰居,聯合鄰域經常一算就垮。單軸平緩、聯合鄰域崩塌,是最常見的假平原。
另一個補充指標是平原寬度比:績效還維持在最佳值 80% 以上的連續參數區間,佔掃描總範圍多少。低於 10%,那不是平原,是山尖。
阿凱把一支 BTC 日線均線交叉策略的長週期參數從 5 掃到 60,最佳點落在 34 期,Sharpe 2.6。他傳來的參數曲面裡,33 期是 1.1,35 期是 0.9,鄰域衰減比 0.38。
後來他改掃 20 到 26 這段相對平緩的區間,取中心值 22,回測 Sharpe 掉到 1.4。上實盤三個月,實際績效跟回測的落差在 8% 以內。難看的數字活下來了,漂亮的那個沒有。
這個訊號什麼時候會騙你。 掃描格距太寬,鄰居會落到另一個雜訊峰上,反而畫出假的平原;格距太細,遇到 K 棒週期、整數天數這類離散參數,本來就會跳。格距要設在「參數變動足以改變實際訊號」的量級。另外,有些參數天生有斷點,例如以結算時間或日界線切開的時段參數,跨過去行為本來就不同,那是分段,不是孤峰。
還有一種情況要先排除:交易只有 60 筆的時候,整張參數曲面都是雜訊,鄰域比接近隨機。這時該修的是警訊三,不是警訊一。
這一節從頭到尾在判斷的只有一件事:你找到的是參數平原,還是山尖。兩者在績效表上長得一樣,在鄰域上完全不同。
警訊二:樣本外的衰退形狀,比衰退幅度更重要
多數人做完 walk-forward 只留下一個平均 Walk-Forward Efficiency(WFE)。那個平均會把最該看的東西蓋掉。
每一段滾動窗都該留三個數字:樣本內績效、樣本外績效、兩者的比值。然後看三件事。
第一是中位數而不是平均,平均會被單一段的極值拉走。第二是各段的一致性,樣本外為正的段數佔幾成。第三是衰退有沒有集中,如果整體 WFE 60% 是由一段 200% 加四段 20% 湊出來的,那不是穩定,是運氣分佈不均。
門檻抓在 WFE 中位數低於 50%,或樣本外為負的段數超過三分之一,就退回假設層。滾動窗怎麼切、比值怎麼算才不會自己騙自己,WFE 的完整拆解裡有完整流程。
這個訊號什麼時候會騙你。 有兩個方向。
高 WFE 也可能是假的。如果所有樣本外區段都落在同一種市場環境裡,例如整段資料都在 2023 到 2024 的緩漲,那樣本外只是樣本內的延長線。檢查方式是把每一段樣本外的環境標籤標出來:波動率分位、趨勢方向、資金費率狀態,看有沒有真的覆蓋到不同狀態。全部同色,這個測試就沒有做到它該做的事。
低 WFE 也不一定是過度優化。市場結構斷裂一樣會讓樣本外崩掉,那是另一種病,處理方式完全不同。分辨方法是把衰退的時間點對到已知事件:交易所規則變更、流動性遷移、費率制度改動。對得上,是結構問題,Walk-Forward 看不見的市場結構性風險那篇整理過這一類;對不上,而且衰退散在各段,才是擬合問題。
這類驗證流程的實作紀錄我每週會整理一次,想固定追的可以訂閱電子報。
警訊三:自由度超支,而且你的交易數比帳面少
這個警訊要算兩個數,一個容易高估,一個容易低估。
自由度容易低估,交易數容易高估
記帳規則先列清楚:每個可調數值參數算一個;每條規則的存在與否算一個;每次「看了回測結果之後才改的決定」算一個;試過又丟掉的指標和濾網也要記,你在挑選的當下就用掉了樣本;連資料切法本身,用哪段期間、哪幾個標的,也是自由度。最後這幾項是多數人漏掉的部分,而它們通常佔一半以上。
交易筆數則不等於獨立樣本。策略在同一波行情裡連續進出五次,那五筆損益高度相關,貢獻的獨立資訊接近一筆。粗估方式:有效交易數等於總交易數除以平均群聚大小,群聚大小可以用同方向連續交易的平均串長來抓,或者直接用 block bootstrap 看區塊長度。
門檻用有效交易數除以自由度,低於 30 就是超支。Pardo 在 The Evaluation and Optimization of Trading Strategies 給的量級是每個自由度需要數十筆獨立交易,30 到 50 是實務上還算保守的抓法。
小魏的策略是個好例子。一支 ETH 15 分鐘均值回歸,回測 1,900 筆交易,12 個自由度,帳面上每個自由度有 158 筆,看起來寬裕得不得了。
攤開時間分佈才發現,83% 的交易集中在佔全樣本 11% 的高波動時段,平均連續串長 6.4 筆。折算後有效交易數大約 300,每個自由度 25 筆。他的樣本從「非常充足」變成「不夠」,中間只隔一次統計。
這個訊號什麼時候會騙你。 自由度記帳永遠是低估值,因為你記不得所有丟掉的嘗試。這個數字的用途是排序和否決,不是精算,看到它就別再爭論小數點。反過來說,事前寫定、有經濟理由的參數,跟事後看著結果調的參數,統計代價其實不同,但保守起見一起記,反正誤差方向對你不利。
警訊四:每加一條規則,績效還在跳階
正常改良的貢獻是遞減的:第一條規則吃掉大部分的訊號,後面越加越小。要把這條曲線畫出來,用 ablation 測試。
做法是拿定版策略,逐條移除單一規則,量績效掉多少。
三個要求缺一不可。在樣本外做,樣本內的 ablation 只會告訴你優化器多努力。用同一組參數,移除規則後不要重新優化,重新優化會把貢獻抹平。每條規則的貢獻要按時間切開看。
判讀有三條線。單條規則貢獻超過總績效 30%,那條規則就是策略本身,其他都是裝飾,你該研究的是它而不是整包。貢獻集中在少於 20% 的時間窗,那是為特定行情客製的訊號。移除某條規則之後績效反而變好,代表它在樣本外是負擔,通常是當初為了修某段回撤加上去的。
這個訊號什麼時候會騙你。 風控類規則天生就是低頻高貢獻。一條「波動率超過門檻就停止交易」的規則,可能整段樣本只觸發三次,貢獻全部集中在 2020 年 3 月和 2022 年 5 月。這不算客製,前提有兩個:它的存在理由是事前寫下來的,而且它在幾個彼此獨立的事件上都起過作用。
只在單一事件上救過命的風控規則,跟為那個事件量身訂做的濾網,在資料上長得一模一樣。事後沒有辦法從績效區分它們,只能靠事前的紀錄。這是假設要先寫下來的實際理由,不是流程潔癖。
警訊五:獲利邊緣薄到成本一動就消失
量的是損益兩平成本倍數:讓策略淨績效歸零的每筆單邊成本,除以你實際負擔的每筆單邊成本。
做法很直接。把成本參數從 0 開始往上加,每次加一點,畫出績效對成本的曲線,讀出它穿越零軸的位置。倍數低於 3,邊緣太薄;低於 2,實盤基本上複製不出來。
加密市場估成本要多算三件事:taker 和 maker 的費率差、永續持倉跨過結算的資金費率、市價單的實際滑價。滑價不要用固定基點,用訂單簿深度對你的部位大小去估,小部位和大部位的答案差很多。
我自己砍過一支資金費率套利策略就是死在這一關。回測年化 19%,看起來很體面。實際成本抓 taker 5bp 加滑價 3bp,單邊 8bp,算出來的損益兩平點是 11bp,倍數 1.4。
這個數字的意思是:只要費率等級掉一階,或某天流動性變差,整條 edge 就沒了。後來改成只在費率絕對值超過門檻時才進場,交易次數少了八成,年化掉到 7%,損益兩平倍數升到 4.6。第二個版本無聊得多,但它的收益不是借來的。
同一組檢查裡還有一個配套指標:參數的小數位敏感度。停損從 1.5 倍 ATR 改成 1.52 倍,績效如果有明顯變動,代表你的績效落在極薄的邊緣上。市場結構不會精確到小數點第二位。
高頻策略是例外
高頻和做市策略天生對成本敏感,倍數低是本質,不是擬合。這時要換一把尺,看的是執行能力:費率等級、下單路徑、延遲、maker 成交比例。分辨方法是交叉看警訊一:成本敏感但參數鄰域平緩,是執行問題;兩個都尖,才是擬合問題。
五個過度優化警訊一起看:上線前的稽核表
單一警訊觸發不一定致命,組合才有診斷力。跑完之後把結果對到下面這張表。
| 觸發組合 | 比較可能的診斷 | 處理方式 |
|---|---|---|
| 只有警訊一 | 掃描格距或選點問題 | 改取平原中心重跑,不用砍策略 |
| 警訊一 + 警訊四 | 典型參數擬合 | 回到假設層,砍規則不是調參數 |
| 警訊二,且對得上結構事件 | 市場結構變化 | 重新界定適用環境,不是重新優化 |
| 只有警訊三 | 樣本不足,策略未必爛 | 降自由度,或換更長、更多標的的樣本 |
| 只有警訊五 | 執行成本問題 | 提高進場門檻或改變執行方式 |
| 三個以上同時觸發 | 這支策略本身是雜訊 | 丟掉,不要搶救 |
時序上有一件事別做錯:這五個檢查全部要在動用 lockbox 之前跑完。拿最終保留的那段樣本外資料去測警訊,等於把僅有的一發子彈用在體檢上。用開發期的資料跑這些檢查就夠了,它們量的是形狀,不是預測未來。
實際把一支策略的自由度記帳、聯合鄰域掃描和 ablation 曲線逐步跑過一遍,大概需要半天。我們在 Lab 社群裡會拿成員自己的策略跑這套流程,想把手上的東西丟進來體檢的,那裡是合適的地方。
這五個過度優化警訊擋不住什麼
全部通過,只代表這支策略沒有明顯的內部擬合痕跡。它不保證有 edge,也有三類問題完全落在偵測範圍外。
策略之間的選擇偏誤。 這五個都是策略內部檢查。你手上這支是從幾十個想法裡挑出來的贏家,這一層的偏誤不會出現在任何一個警訊裡。
要處理它,得記下嘗試次數再折算顯著性,Deflated Sharpe Ratio 做的是這件事,而嘗試次數怎麼算才誠實,選擇偏誤潛入量化回測的六個入口整理過六個常見漏記的地方。Bailey 等人在 The Probability of Backtest Overfitting 給的框架處理的也是同一層。
資料層的錯誤。 未來函數、幸存者偏誤、錯誤的 point-in-time 對齊,這些都會生出一支五個警訊全過的策略,因為它的績效在資料層就是假的,形狀當然穩。這一類要靠獨立的資料稽核,未來函數那篇有清單。
還沒發生的斷裂。 任何基於歷史的檢查都測不到未來的制度變化。這不是這套流程的缺陷,是所有回測的共同上限。
Bailey 等人在 Pseudo-Mathematics and Financial Charlatanism 裡把沒有紀律的回測稱為偽數學,理由就在這裡:檢查越多層,你越清楚自己的結論可以推到多遠,也越清楚哪裡推不過去。
結論
五個警訊,五個數字,全部可以在半天內跑完:
- 聯合鄰域衰減比低於 0.6,你找到的是雜訊座標。多參數要一起推,不要只看單軸。
- WFE 的中位數與分佈比平均值誠實。負值段數超過三分之一就退回假設層。
- 有效交易數除以自由度低於 30 是超支。交易要折算群聚,自由度要記得算上丟掉的嘗試。
- 樣本外 ablation 曲線該遞減。單條規則扛起三成以上績效,你研究的對象搞錯了。
- 損益兩平成本倍數低於 3,這條 edge 在實盤第一個消失。
五個檢查有一個共同點:沒有一個在問「這支策略賺多少」,全部在問「這個數字撐不撐得住被推一下」。這個視角切換,是回測紀律裡最省錢的一步。
下一次你準備上線一支策略,先把這五個數字填進表裡再說。填完之後你可能會發現,回測 Sharpe 2.8 那支得砍掉,1.3 那支反而能上。這種結論不好受,但它比實盤的帳單便宜太多。




