過度優化的五個可觀測警訊:上實盤前的最後一輪檢查

回測漂亮不代表能上線。本文把五個過度優化警訊變成可以自己算的數字:鄰域衰減比、WFE 分佈、自由度超支率、邊際貢獻曲線、損益兩平成本倍數,各附門檻與誤判邊界。

一支策略該不該上線,不該由回測的 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 裡把沒有紀律的回測稱為偽數學,理由就在這裡:檢查越多層,你越清楚自己的結論可以推到多遠,也越清楚哪裡推不過去。

結論

五個警訊,五個數字,全部可以在半天內跑完:

  1. 聯合鄰域衰減比低於 0.6,你找到的是雜訊座標。多參數要一起推,不要只看單軸。
  2. WFE 的中位數與分佈比平均值誠實。負值段數超過三分之一就退回假設層。
  3. 有效交易數除以自由度低於 30 是超支。交易要折算群聚,自由度要記得算上丟掉的嘗試。
  4. 樣本外 ablation 曲線該遞減。單條規則扛起三成以上績效,你研究的對象搞錯了。
  5. 損益兩平成本倍數低於 3,這條 edge 在實盤第一個消失。

五個檢查有一個共同點:沒有一個在問「這支策略賺多少」,全部在問「這個數字撐不撐得住被推一下」。這個視角切換,是回測紀律裡最省錢的一步。

下一次你準備上線一支策略,先把這五個數字填進表裡再說。填完之後你可能會發現,回測 Sharpe 2.8 那支得砍掉,1.3 那支反而能上。這種結論不好受,但它比實盤的帳單便宜太多。

個人頭像照片
AD.Trader Lab

AD.Trader Lab 創辦人 | 量化交易員 專注於在充滿雜訊的市場中,尋找數學上的必然性。AD.Trader Lab 實驗室主理人,帶你用數據看透漲跌背後的真相。

每日更新 · 免費

每日選幣清單

我每天在 Telegram 發一份選幣名單——標的、為什麼選它、我自己有沒有進場。

  • 每日選幣名單,附上選它的理由
  • 新文章與研究上架,第一時間通知
  • 討論區:有問題可以直接問我
免費加入 Telegram

340+ 人已經在頻道裡

已經在交易了?用我的連結註冊 OKX,手續費終身退 20% 月成交 20 萬 U,一年約退你 NT$6,000 — 交易越多退越多