一套通過 Walk-Forward 的策略,最後多半不是被參數殺死的。殺死它的是前提。
Walk-Forward Analysis 檢查的是同一套邏輯在沒看過的數據上還剩幾成績效。它成立的條件很明確:產生樣本內數據的市場結構,和產生樣本外數據的市場結構是同一個。這個條件在加密市場的有效期,通常比多數人假設的短。
市場結構性風險講的就是這個條件被破壞的情況。不是價格走得跟預期不同,是產生價格的那套機制被換掉了:造市商退場、保證金規則改版、同一個 edge 突然被十倍的資金追、原本互不相關的策略在同一天一起虧。這幾件事在價格序列上留下的痕跡,永遠是事後的。
這篇拆五種 WFA 在結構上就測不出來的風險、滾動重優化為什麼反而會讓人低估它們,以及實務上可以怎麼補。WFA 的滾動樣本外測試機制、切窗設計與判讀門檻,Walk-Forward Analysis 深度解析已經拆過完整流程,這裡不重複。
參數失效與前提失效是兩件事
參數失效是程度問題:市場還是同一個市場,只是最佳均線長度從 20 漂到 28。WFA 處理這件事的效率很好,重優化一次就跟上了。
前提失效是類別問題:策略賴以獲利的那個機制不見了。統計上這叫非平穩性,交易上它的意思是你的樣本和你的未來,來自兩個不同的世界。判斷一件事屬不屬於結構性風險,看三個特徵就夠。
- 不可逆:交易所改掉的保證金規則不會自己改回來,倒閉的造市商不會回來報價
- 作用在規則、參與者或成本上:它先改變市場怎麼運作,才間接改變價格
- 在你的資料欄位裡沒有對應的欄位:OHLCV 和資金費率記不下「誰在對面接單」
第三點是關鍵。回測引擎讀得到的東西,決定了驗證流程能看見的東西。
滾動重優化的適應延遲有算術上限
WFA 的滾動重優化常被講成「策略會自己適應市場」。適應速度可以直接算出來。
設定 IS 24 個月、OOS 3 個月、步長 3 個月。假設結構斷裂發生在某一段 OOS 的第一天:
- 這一整段 OOS 全程用斷裂前的參數跑完,延遲已經是 3 個月
- 下一次重優化時,24 個月的 IS 裡只有 3 個月屬於新結構,佔 12.5%,優化目標函數幾乎不可能被這一小塊主導
- 要等到新結構佔滿 IS 的一半以上,選出的參數才會真的轉向,那是斷裂發生 12 個月之後
所以「會自己適應」的實際速度是:一個步長之後開始學,半個 IS 長度之後才學會。中間這段時間,你跑的是一套為已經消失的市場優化過的系統。Rolling 窗至少會遺忘舊結構,anchored 窗連遺忘都不會,這也是加密策略優先用 rolling 的實際理由。
五種 WFA 看不見的市場結構性風險
五種風險攻擊的都不是參數,是回測讀不到的那一層。先給全表,後面逐項拆。
| 結構性風險 | WFA 為什麼看不到 | 最早出現的訊號 |
|---|---|---|
| Regime 斷裂 | 斷裂被記成一段難看的 OOS,再被其他視窗平均掉 | 單段 OOS 的極端虧損、參數大幅跳動 |
| 規則層變更 | 規則沒有對應的資料欄位 | 交易所公告、保證金與槓桿參數 |
| 流動性折舊與容量 | 滑價假設在整條回測上是常數 | 深度分位、實際成交與回測的價差 |
| 擁擠度與 alpha 衰減 | 重優化會陪著縮小的 edge 一起縮 | edge 絕對水位:基差、資金費率、價差 |
| 尾部樣本不足與相關性歸一 | 樣本裡的尾部事件只有個位數,且逐策略分開驗證 | 壓力視窗下的策略間相關係數 |
1. Regime 斷裂被平均值稀釋
WFA 不是完全看不到 regime 斷裂,它會把斷裂記錄成一段很難看的 OOS,然後和其他二十段一起平均掉。
算一次給你看。20 段 OOS、每段 3 個月、共 5 年,其中 19 段平均 +4%,一段 -30%。串接起來總報酬 46%,簡單年化 9.2%;IS 年化 18%,Walk-Forward Efficiency 算出來是 51%,按 Pardo 的門檻壓線過關。
壓線過關的那條線底下,埋著一次三個月虧掉 30% 的路徑。實盤走到那裡,多數人不會等到下一段。WFE 是平均值,結構斷裂是事件,用平均值去描述事件本來就會失真。
2022 年的加密市場是現成的樣本:Luna 崩盤、三箭資本清算、FTX 倒閉,連續三次把流動性結構、槓桿水位和參與者組成整批換血,一年之內走完三次 regime 轉換。任何在 2021 年數據上優化過的參數,驗證流程做得再嚴謹,都預見不了這種結構性斷裂。
判讀時該做的動作很簡單:逐段報酬單獨攤開看,把最差的那一段拿出來問「這一段發生的時候,我的倉位撐得住嗎」。總分永遠比分佈好看。
2. 規則層的變更不在你的資料欄位裡
你的回測資料通常是 OHLCV、資金費率、未平倉量,比較用功的會加上訂單簿快照。以下這些東西不在裡面:
- 槓桿上限與維持保證金階梯
- 自動減倉(ADL)的觸發規則
- 手續費階梯與 maker 返佣
- 撮合與限價規則、單筆委託上限
- 上架、下架與流動性遷移
- 監管造成的地區性停止服務
這些變數改變的是價格怎麼被產生出來的,價格序列本身照樣有值,回測照樣跑得完。
Lab 裡有位成員做的是清算級聯:抓強平量堆積的價位,在級聯啟動時跟著做動能。這套策略在 2021 年上半年的數據上表現非常好。2021 年下半年多家交易所把新開戶的槓桿上限壓到 20 倍、同時調整了維持保證金階梯之後,同樣幅度的下跌推不出同樣規模的強平量,級聯的深度和速度都變了。
他那年底重跑 WFA,WFE 還有 58%。原因不複雜:新規則當時只覆蓋到 IS 的最後幾個月,權重不夠。真正的答案要到 2022 年才在 OOS 上顯現,而那時候策略已經跑了半年多的實盤。
想知道回測還會用哪些方式騙你,回測過擬合的九種死法整理得比較完整,那篇講的是統計層的陷阱,這篇補的是規則層。
3. 流動性折舊與容量上限
流動性風險在回測裡只用一個形式存在:滑價假設。這組假設在整條 WFA 上通常是常數,或是拿歷史平均估出來的簡單模型。市場深度不是常數,它會隨造市商的進出、庫存能力與風險偏好結構性地變動。
2022 年 11 月 FTX 倒閉之後,Alameda 從多個山寨幣市場的報價端消失。Kaiko 的市場深度追蹤在那段時間記錄到主要交易所的 1% 深度出現腰斬級的萎縮,部分中小市值幣種恢復得更慢。價格照樣有得跑,但同樣一張單的成交品質已經是另一個世界。
一位成員的山寨幣均值回歸策略吃到的就是這一刀。回測滑價假設 8 bps,用 2021 到 2022 上半年的深度估出來的;2023 年上線之後實際成交平均超過 30 bps。他的 WFA 每一段 OOS 都過關,因為每一段用的都是同一組成本假設。年化 22% 的紙上績效,扣掉真實滑價剩不到 5%,再扣資金費率就是負的。
容量是同一個問題的另一面。WFA 測的是參數,不是規模。回測預設你的單子不影響市場,所以倉位放大五倍的衝擊不會出現在任何一段 OOS 裡。策略容量的上限必須另外測,用訂單簿深度和真實成交回饋去估,不能從 OOS 績效推。
4. 擁擠度與 alpha 衰減,會被重優化蓋住
回測資料裡沒有其他人。它預設你不影響市場,也預設沒有人在跟你搶同一個價差。真實世界裡,一個公開、好複製、容量有限的 edge,被發現之後就開始折舊。
2024 年 1 月美國現貨比特幣 ETF 上市,期現套利的資金結構整個換了一輪。CME 年化基差在 2024 年 3 月一度回到兩位數,隨後多數時間壓在個位數。一套用 2022 到 2023 年資料開發的期現套利策略,WFA 逐段滾下來幾乎沒有警訊:每次重優化,參數會自動往「更低的進場門檻、更長的持有期」移動,帳面上維持正報酬。
這正是最容易騙過 WFA 的死法。滾動重優化會陪著縮小的 edge 一起縮,讓報告持續顯示「參數還在適應」,實際發生的是「可分配的利潤在消失」。等到扣掉借貸與轉倉成本轉負,重優化才會停止生效,那時候已經賠了幾個月。
策略擁擠度沒有直接的觀測值,edge 本身的絕對水位是可用的代理指標。基差多少、資金費率中位數多少、價差幾個 tick,這些數字比策略報酬更早給訊號。策略報酬是結果,edge 水位是原因。對策不在驗證流程裡,在監控裡。
5. 尾部樣本不足,而尾部正是相關性歸一的時刻
六年日線資料大約 2,190 個交易日,其中真正的流動性事件,2020 年 3 月 12 日、2021 年 5 月 19 日、2022 年 5 月、2022 年 11 月、2024 年 8 月 5 日,大概就這幾次。任何從五個樣本估出來的尾部參數,信賴區間寬到不該拿來設槓桿。
樣本還會被生存偏差再砍一刀。倒掉的交易所、下架的幣種、停止報價的資料源不會留在你的資料庫裡,最慘烈的那幾段路徑在資料清洗階段就消失了。這類偏誤怎麼進到資料集,量化交易數據層的建法拆過完整流程。
更麻煩的是相關性。2024 年 8 月 5 日日圓套利平倉那天,BTC 一度跌到 5 萬美元以下,趨勢、均值回歸、期現、做市,邏輯完全不同的策略同一天同向虧損。強制平倉的時候,賣的不是看法,是所有能賣的東西。
WFA 是逐策略、逐路徑的工具。你對五套策略各跑一次 WFA,得到五條 OOS 曲線,它不會告訴你這五條在尾部其實是同一條。組合層的檢查要另外做:把壓力視窗單獨抽出來算策略間的相關係數,全樣本相關係數在尾部沒有參考價值。
補法:把結構前提寫成可監控的清單
前面五種風險有一個共同點,它們都不在回測的輸入裡,所以也不會在回測的輸出裡。要處理它們,得把監控從績效層移到前提層。
第一步,寫下策略的結構前提。 每套策略 3 到 5 條,每一條都要可觀測、可量化。寫不出來,代表你其實不知道這套策略為什麼會賺錢。
| 結構前提 | 觀測變數 | 資料來源 | 失效門檻 | 觸發動作 |
|---|---|---|---|---|
| 永續資金費率長期偏正 | 30 日資金費率中位數 | 交易所 API | 連續 14 日為負 | 倉位減半 |
| 深度吃得下我的規模 | 1% 深度 ÷ 單筆委託金額 | 訂單簿快照 | 比值低於 20 倍 | 降規模或換場所 |
| 基差 edge 尚未被擁擠 | CME 年化基差 | CME、交易所 | 低於成本加 3% | 停止新倉 |
| 波動環境在樣本內覆蓋範圍 | 30 日已實現波動率分位 | 自建資料 | 落在樣本外分位 | 標記為未驗證環境 |
| 交易規則穩定 | 交易所公告台帳 | 人工加爬蟲 | 保證金或槓桿規則變更 | 重跑成本假設 |
表裡的門檻是示範值。門檻要由策略邏輯決定,拿歷史資料去優化這幾個數字,等於把過擬合搬到監控層。
鏈上部位的變化也可以掛進這張表,交易所存量、巨鯨轉帳、長期持有者行為都是可量化的結構變數,鏈上籌碼分析入門整理過幾個可以直接用的指標。
第二步,建事件台帳。 把規則變更、上下架、造市商事件、ETF 與監管節點記成一張帶時間戳的表,疊到 OOS 權益曲線上做歸因。哪一段 OOS 的虧損對得上哪一個事件,一眼就看得出來,這比事後解釋「那段行情不好」有用得多。
第三步,分 regime 報績效,不是分視窗。 用波動率、資金費率狀態、深度分位把時間切成幾個桶,看策略在每個桶的績效與樣本數。某個桶只有 30 天樣本,就誠實承認那個環境沒有被驗證過。
第四步,壓力重放與成本壓測。 把幾段真實的斷裂視窗抽出來單獨跑,重點不看報酬,看最壞路徑與距離強平還有多遠。成本端做三組情境:滑價乘三、深度砍半、剔除最好的 5% 成交。結構性風險多半先從成本端顯現。
第五步,下線條件綁變數,不綁回撤。 回撤是落後指標,等它觸發,結構已經換完了。把停用條件寫在前提變數上,跌破門檻就縮規模,不必等虧到停損線。
統計工具可以補一部分。CUSUM、SADF 這類結構斷裂檢定(實作可以參考 López de Prado 的 Advances in Financial Machine Learning)能比人眼更快確認斷裂已經發生,但它們仍然是事後偵測,而且會給假警報。它們的價值是把「我覺得市場變了」變成可以記錄、可以回頭檢驗的訊號。
想看實際的監控腳本與前提清單怎麼寫,付費實驗室裡有持續的工具與流程討論,適合已經在跑實盤的人。
這套補法擋不住什麼
前提清單本身也可能不完整。你寫得出來的前提,是你已經想到的那些;真正殺死策略的,經常是清單上沒有的那一條。
監控門檻同樣會被過擬合。對著歷史資料去調「連續幾天為負才算失效」,等於把過擬合從策略層搬到監控層,跟對 WFA 配置本身做優化是同一個錯誤。門檻要由邏輯決定,寫下來就不動。
還有一類結構變化根本不可觀測。場外的部位、未公開的做市協議、交易所內部的風控參數,這些東西你拿不到資料。
所以結構性風險的最後一道防線不在驗證流程,在倉位。Pardo 那本書把驗證流程寫得很細,但驗證流程能給的是「這套策略還沒被證偽」,給不了「市場不會變」。能撐過一次未知斷裂的規模與槓桿,比能通過所有檢定的策略更值錢。
結論
收攏成五句話:
- WFA 驗證的是參數在沒看過的數據上的表現,前提是市場結構沒換人。市場結構性風險攻擊的正是這個前提。
- 滾動重優化的適應速度有算術上限:一個步長之後開始學,半個 IS 長度之後才學會。中間跑的是為已消失的市場優化過的系統。
- 五種測不出來的風險:regime 斷裂被平均值稀釋、規則變更不在資料欄位裡、流動性折舊與容量、擁擠度衰減被重優化蓋住、尾部樣本不足與相關性歸一。
- 補法是把監控從績效層移到前提層:寫下 3 到 5 條可量化的結構前提,配事件台帳、分 regime 績效、壓力重放,下線條件綁變數不綁回撤。
- 前提清單會有缺口,監控門檻會被過擬合,總有不可觀測的變化。最後一道防線是倉位規模,不是更精細的回測。
量化回測能處理的是統計上的假訊號。結構性風險屬於另一個問題類別,它要的不是更嚴格的檢定,是對「我的策略靠什麼吃飯」這個問題有明確答案,並且持續盯著那個答案還在不在。
想持續追蹤這類驗證框架、市場微結構與流動性條件的拆解,可以訂閱電子報,每週一篇,不喊單,只拆結構。




