柏宇的 BTC 四小時趨勢策略上線五個月,每筆交易的淨期望值從回測的 23.6 個基點掉到 1.35。他花了兩個週末逐行檢查訊號邏輯,找不到任何壞掉的地方。最後把交易按市場環境拆開,才看到那五個月有 65% 的交易落在低波動盤整裡,回測期間這個比例只有 30%。
訊號幾乎沒變,變的是它被丟進去的環境。策略失效診斷最常見的錯誤就出在這裡:拿錯對照組。多數人把實盤績效跟回測的全樣本平均比,而那個平均值,是在回測期間那一套環境組成下算出來的。實盤期間的環境組成不一樣,兩個數字從一開始就在回答不同的問題。
我在 Threads 寫過一次類似的經驗:照 SOP 進場做多,被 Positive Gamma 的盤來回掃出場,當時的結論是「策略沒錯,是環境錯了」。這句話我到現在還同意,但它有一個危險的性質,它可以拿來解釋任何一次虧損。Gamma exposure 與清算熱圖那篇講的是怎麼辨識環境,這篇處理下一個問題:環境到底解釋了多少,剩下的那一塊才是策略本身的事。
量化策略的穩健性測試那篇要求上線前先做一張逐 regime 的條件績效表,這篇是那張表在上線之後的用法。讀完你會拿到三樣東西:環境調整後的對照值怎麼算、一張把落差拆成配置效果與桶內效果的歸因表,以及兩種歸因結果各自對應的強化方法。最後一節講 regime 定義本身怎麼變成再擬合的入口,那是這套方法最容易被濫用的地方。
策略失效診斷的對照組:回測平均值其實是加權平均
量化回測給出的每筆期望值,是各種環境裡的期望值按出現頻率加權的結果。拿柏宇的策略當例子,用 BTC 過去 30 天的實現波動率把環境切成三桶,界線取在回測期間的三分位附近:
| 環境(30 日實現波動,年化) | 回測交易佔比 | 回測每筆淨期望值 |
|---|---|---|
| 低波動(低於 40%) | 30% | -8 bp |
| 中波動(40% 到 60%) | 40% | +20 bp |
| 高波動(高於 60%) | 30% | +60 bp |
| 全樣本 | 100% | +23.6 bp |
23.6 這個數字,是 0.3 乘負 8、0.4 乘 20、0.3 乘 60 加起來的。它隱含一個沒人會寫出來的假設:未來的環境組成跟回測那幾年差不多。
趨勢策略在低波動盤整裡虧錢,有機制上的理由。突破訊號在窄幅區間裡多半是假突破,進場後很快被拉回停損,手續費與滑價照付。高波動期正好相反,價格一旦走出去就會走很遠,少數幾筆大賺扛起大部分績效。上表的高波動桶只佔三成交易,卻貢獻了 76% 的期望值。
Lo 在 The Adaptive Markets Hypothesis 裡把這件事寫成一般原則:策略的獲利能力會隨市場環境起落,在某些環境表現好、在另一些環境表現差。這篇要做的是把這個原則變成一個算得出來的數字,免得它變成每次虧損都能拿出來用的說法。
想拿自己的策略跑一次分桶、對照別人怎麼選環境的切法,可以到 Lab 社群討論。
環境調整後的對照值:用實盤的權重重算一次回測
柏宇實盤五個月一共 120 筆交易。按同一套上線前就凍結的界線分桶:
| 環境 | 回測佔比 | 實盤佔比 | 回測每筆期望值 | 實盤每筆期望值 |
|---|---|---|---|---|
| 低波動 | 30% | 65% | -8 bp | -10 bp |
| 中波動 | 40% | 30% | +20 bp | +17 bp |
| 高波動 | 30% | 5% | +60 bp | +55 bp |
| 加總 | +23.6 bp | +1.35 bp |
這張表可以做一件很簡單的事:拿回測的桶內期望值,配上實盤的桶權重,重新加權一次。0.65 乘負 8、0.30 乘 20、0.05 乘 60,加起來是 3.8 個基點。
3.8 才是實盤該拿來比的數字。它回答的問題是:如果策略跟回測時一模一樣,只是被丟進這五個月的環境裡,它本來會交出多少。
實盤交出 1.35,跟 3.8 差 2.45 個基點。跟 23.6 比,差的是 22。22 個基點的落差會讓人想打開策略檔案,2.45 個基點的落差只會讓人想關掉電腦去睡覺。
把落差拆成兩塊:Brinson 歸因搬到策略失效診斷
上面那個重新加權的動作,在傳統資產管理裡有四十年的歷史。Brinson、Hood 與 Beebower 在 1986 年的 Determinants of Portfolio Performance 把基金相對基準的報酬差拆成兩塊:資產類別的權重跟基準不同造成的配置效果,以及同一類資產裡挑的東西跟基準不同造成的選擇效果。
換到策略失效診斷的語言,基準是回測,資產類別換成環境桶,下文把這套分解叫做 regime 歸因:
- 配置效果(環境錯配):每一桶的權重差,乘上該桶的回測期望值,再加總。它量的是環境組成變了這件事本身造成多少落差。這一塊不是你選的,是市場選的。
- 桶內效果(策略變化):每一桶的期望值差,乘上該桶的實盤權重,再加總。它量的是在同一種環境裡,策略的表現跟回測比有沒有變。所謂 alpha 衰減,嚴格說只該用這一塊來量。
兩塊加起來剛好等於總落差。正式的 Brinson 分解還有第三項交互效果,這裡把它併進桶內效果、改用實盤權重加權,數字比較好讀,結論方向不會變。
柏宇的歸因表:
| 環境 | 權重差 | 配置效果 | 期望值差 | 桶內效果 |
|---|---|---|---|---|
| 低波動 | +35% | -2.8 bp | -2 bp | -1.3 bp |
| 中波動 | -10% | -2.0 bp | -3 bp | -0.9 bp |
| 高波動 | -25% | -15.0 bp | -5 bp | -0.25 bp |
| 合計 | -19.8 bp | -2.45 bp |
總落差 22.25 個基點裡,19.8 來自環境組成,佔 89%。最大的一格不在虧錢的低波動桶,在高波動桶:少了 25 個百分點的高波動交易,等於少掉策略最主要的利潤來源。
這個細節改變了環境錯配的讀法。柏宇的問題主要不在低波動期賠了多少,在高波動期沒有來。
兩塊的精度不對稱:配置效果幾乎確定,桶內效果幾乎全是雜訊
拆完之後還得問一句:這兩個數字各自有多可信。
兩者的誤差來源不同。配置效果用的是回測的桶內期望值,加上實盤各桶的出現頻率,前者來自 1,500 筆回測交易,後者是已經發生的事實。桶內效果用的是實盤的桶內期望值,而實盤每一桶的樣本都少得可憐。
用每筆交易的報酬標準差估一下。柏宇的策略在低、中、高三桶的每筆標準差大約是 150、250、400 個基點:
| 比較方式 | 估計值 | 標準誤 | 相當於幾個標準誤 |
|---|---|---|---|
| 總落差(實盤 vs 回測全樣本) | -22.25 bp | 約 20 bp | 1.1 |
| 配置效果 | -19.8 bp | 約 5.4 bp | 3.7 |
| 桶內效果 | -2.45 bp | 約 19.4 bp | 0.13 |
第一列是多數人會做的比較。1.1 個標準誤,統計上說不出任何話,所以最後只能憑感覺決定要不要動。
第二列說落差裡有一大塊,幾乎可以確定是環境造成的。第三列說扣掉環境之後,剩下的差異完全在雜訊裡,五個月的實盤沒有提供任何「策略在同樣環境下變差」的證據。高波動那一桶只有 6 筆實盤交易,標準誤超過 160 個基點,這一桶的實盤期望值現階段等於不存在。
這張表透露一個不太舒服的結構。上線頭幾個月,能確定的幾乎只有環境那一塊,策略本身有沒有變,要等每一桶都累積到足夠樣本才看得出來。所以策略失效診斷在初期的主要工作是排除:把環境能解釋的部分先拿掉,剩下的才輪得到懷疑策略。
還有一個前提要講清楚。配置效果的精度建立在回測桶內期望值可信的基礎上,如果那三個數字本身是樣本內擬合出來的,配置效果只是把一個有偏誤的數字乘上一個精確的權重。桶內期望值應該取 Walk-Forward Analysis 的樣本外段落來算,全樣本最佳化之後的數字不能用。
第二種結果:環境沒變,主場那一桶在變薄
怡君跑的是另一類策略:山寨幣永續合約的資金費率極端反轉。費率衝到極端時反向進場,吃費率回歸與擁擠部位平倉的那一段。她用全市場持倉加權的資金費率年化值當環境軸,也切三桶。上線六個月、250 筆交易,每筆淨期望值從回測的 19.25 個基點掉到 6.06。
拆出來的結果跟柏宇相反:
| 環境(資金費率年化) | 回測佔比 | 實盤佔比 | 回測期望值 | 實盤期望值 | 配置效果 | 桶內效果 |
|---|---|---|---|---|---|---|
| 低於 10% | 40% | 38% | +5 bp | +3 bp | -0.1 bp | -0.76 bp |
| 10% 到 30% | 35% | 34% | +15 bp | +12 bp | -0.15 bp | -1.02 bp |
| 高於 30% | 25% | 28% | +48 bp | +3 bp | +1.44 bp | -12.6 bp |
| 合計 | +19.25 bp | +6.06 bp | +1.19 bp | -14.38 bp |
配置效果是正的。那六個月高費率的時段比回測期間還多一點,環境其實對她有利。
落差全部來自桶內,而且集中在一桶。高資金費率那一桶,每筆期望值從 48 掉到 3,實盤 70 筆,差距大約兩個標準誤。總落差本身只有 1.3 個標準誤,不拆開的話,這個訊號會被另外兩桶的雜訊稀釋掉。
這才是真正需要往下診斷的形狀,而桶內效果怎麼分佈,比它的總數更有資訊量:
- 所有桶等幅下移,通常是成本層的事。手續費級距變了、規模變大讓滑價上升,這類變化平均扣在每一筆交易上,跟環境無關。
- 集中在主場那一桶,通常是 edge 本身在被分食。怡君賺的是費率極端時的擁擠溢價,而那一桶正是其他資金最容易看見、最容易進來搶的地方。
近兩年做 delta 中性費率收益的資金明顯變多,極端費率被抹平的速度變快,是一個說得通的機制。它還要靠毛利與成本分開看、以及費率回歸速度的變化來確認,資金費率分析那篇拆過這個指標的讀法。單憑一張歸因表不能定案,歸因表的用途是告訴你該往哪裡查。
流動性與衍生品結構的環境變化,我會在每週市場分析電子報裡整理,可以拿來當自己分桶時的外部對照。
策略強化方法:兩種歸因結果,兩套不同的動作
歸因的價值,在於它把「要不要動」拆成幾種可以對號入座的情況:
| 歸因結果 | 代表什麼 | 正當的強化 | 看起來像強化、其實是再擬合 |
|---|---|---|---|
| 配置效果主導,桶內在雜訊內 | 策略沒變,環境不在它的主場 | 訊號不動,組合層補一支主場在另一桶的策略 | 事後加 regime 濾網 |
| 桶內效果集中在主場那一桶 | 主場的 edge 在變薄 | 往下查毛利與成本,按證據降配置 | 調參數把主場救回來 |
| 各桶等幅下移 | 成本層的變化 | 修執行、重估成本模型 | 動訊號 |
| 實盤落在回測沒見過的環境 | 樣本外環境,沒有對照值 | 降到最小規模,把它當新樣本收集 | 用鄰近桶外推 |
| 兩塊都小,總落差在雜訊內 | 沒有事件 | 不動 | 任何動作 |
第四列最容易被忽略。如果實盤期間 BTC 的 30 日實現波動跌到回測期間從沒出現過的低點,那個環境根本沒有回測對照值,配置效果算不出來。這時唯一誠實的答案是不知道,規模應該縮到只夠收集樣本的程度。
組合層的強化:替策略找一支主場在另一桶的隊友
柏宇那種結果,訊號層沒有東西可修,能動的是組合。手上的策略只在高波動期賺錢,組合裡缺的就是一支在低波動期賺錢的策略:區間型策略、網格、或者賣波動率的結構,主場都在盤整。我自己在盤整期跑的是短期網格,它跟趨勢策略的主場剛好錯開。
這個強化有兩個條件,缺一個就會變成另一種形式的再擬合。
隊友要獨立開發、獨立驗證。 用柏宇虧損的那五個月去挑一支「剛好在這五個月賺錢」的策略,等於拿同一段資料又做了一次選擇,那支隊友的績效裡混了多少運氣,沒有人知道。它要用自己的假設、自己的回測期間走完完整驗證,嘗試次數記進自由度預算。
組合的評估看分桶表,不看合併曲線。 兩支策略合在一起之後,重做一張分桶期望值表,確認每一桶的組合期望值都為正,也沒有一桶扛起大部分績效。合併曲線漂亮,可能只代表回測期間的環境組成剛好適合這個組合。
倉位層的強化:規則要在上線前寫死
另一種常見的做法是按環境調倉:低波動時減碼,高波動時加碼。機制上說得通,但它在上線之後才加上去,就是一個新的策略版本。
新版本的規則與參數,要用上線前就有的資料做 walk-forward 驗證。實盤虧損那五個月不能算進它的樣本外,因為這條規則的靈感就來自那五個月。新版本的樣本外時鐘,從它自己上線那天才開始走。
事後加 regime 濾網,為什麼幾乎都是再擬合
志豪跑的也是 BTC 趨勢策略,分桶結果跟柏宇相近,同樣遇上一段低波動佔多數的五個月。他做了歸因,看到低波動桶在虧錢,接著做了一件很自然的事:加一條濾網,30 日實現波動低於 40% 就不進場。
他沒有只試一種。實現波動用了 14、30、60 天三種窗口,門檻試了 35%、40%、45%、50% 四種,再用 ADX 做了同樣的 12 組,一共 24 個變體。挑出來最好的那一組,回測 Sharpe 從 0.9 升到 1.25。
問題有三層。
第一層是資訊量。 實盤給了他 78 筆低波動交易,期望值負 10;回測早就說過這一桶是負 8,標準誤 7。關於低波動這一桶,五個月的實盤幾乎沒有帶來新資訊。這條濾網如果值得加,上線前就該加,上線後才加,推動決定的是這五個月的痛感。
第二層是挑選。 從 24 個變體裡挑最好的一組,這個動作本身就會生出績效。這些變體彼此高度相關,粗算下來,光是挑選就能在 Sharpe 上憑空多出 0.3 上下,跟他看到的 0.35 差不多。Deflated Sharpe Ratio 那篇的算式可以把嘗試次數扣回去,扣完之後這條濾網大概站不住。
第三層是機制。 低波動常常是大行情的起點。實現波動被壓到低檔之後,往往接著一段擴張,而趨勢策略最大的幾筆獲利,進場點經常就落在波動還很低的時候。濾網擋掉的,剛好是這一類交易。
志豪的濾網版上線後第六週,BTC 從一段窄幅盤整往上突破。原版策略的進場訊號出現時,30 日實現波動是 37%,被濾網擋下。事後拿影子紀錄對照,原版在那個月賺了 6.8%,濾網版賺了 0.4%。他加濾網是為了修掉低波動期的虧損,修掉的卻是讓低波動期那些虧損值得承擔的那一筆。
合法的 regime 濾網存在,路徑只有一條:機制先於資料,定義在看到實盤虧損之前寫好,只用上線前的資料做 walk-forward,嘗試次數全部記帳,以新版本身份重新上線。這條路很慢,慢本身就是它的用途。
regime 定義的四個陷阱:診斷怎麼悄悄變成擬合
歸因的結論全部建立在 regime 定義上,而定義有四個地方會把診斷變成擬合。
標籤用到了未來。 分桶界線如果用全樣本的三分位算,或者用置中的移動窗口,回測裡的環境標籤就用到了當時還不知道的資訊。
Hamilton 1989 年的 regime switching 模型,現在的標準實作會同時給出兩種機率:只用過去資料的濾波機率,以及用整段資料回頭修正的平滑機率。後者畫出來漂亮得多,也完全不能拿來做診斷。這類問題的完整清單在前視偏誤那篇。
用滾動分位數分桶,配置效果會永遠消失。 界線如果是「過去一年實現波動的三分位」,不管市場怎麼變,每一桶的佔比都會接近三分之一,實盤權重自動貼近回測權重,配置效果被定義成零。界線要用絕對值,上線那天凍結,之後不跟著資料重算。
桶切太細。 一個軸切三桶已經很勉強,兩個軸交叉成九桶,120 筆實盤交易平均每桶 13 筆,桶內效果全部淹在雜訊裡。實務上的門檻是一桶至少累積 30 筆實盤交易,才開始讀那一桶的桶內效果,在那之前只讀配置效果。
事後挑一個最能解釋虧損的軸。 候選的環境軸很多:實現波動、趨勢強度、資金費率、成交量、Gamma 狀態、美元指數。十個候選軸裡,總有一個會碰巧把虧損解釋得很漂亮。只有上線前就依策略機制選定的那一個軸算數,選軸的理由要寫得出「策略為什麼在這種環境賺錢」,寫不出來的軸不能用。
這套策略失效診斷擋不住什麼
regime 歸因在風險控管裡的角色是事後定位,它有四個邊界。
它解釋過去的落差,不預測環境什麼時候回來。 配置效果主導只代表策略沒壞,不代表下個月就會回到主場。低波動期可以持續好幾個季度,策略在那段期間照樣虧錢,能撐多久是資金規劃的問題,歸因回答不了。
環境錯配本身就是一個上線前的警訊。 柏宇的策略有 76% 的回測期望值來自佔三成交易的高波動桶。一支靠單一環境撐起績效的策略,遇到環境錯配只是時間問題。歸因表如果每次都指向同一桶,該回頭補的是上線前的穩健性。
環境軸是代理變數,不是原因。 實現波動只是一個容易觀察的標籤,真正驅動趨勢策略獲利的,可能是流動性、槓桿水位或某種資金流。代理變數跟原因之間的關係一旦改變,分桶表就會失準,而歸因本身看不出這件事。
環境可能是策略自己造成的。 同類策略的資金大到一定程度,會反過來改變市場的波動結構。這時配置效果與桶內效果的分界會糊掉,環境變差跟 edge 被分食成了同一件事的兩面。
上線那天要凍結的 regime 對照表
歸因要能做,六樣東西得在第一筆實盤交易之前就存在:
| 項目 | 內容 | 事前凍結的理由 |
|---|---|---|
| 環境軸與機制理由 | 一個軸,寫出策略在哪種環境賺錢、為什麼 | 防止事後挑軸 |
| 標籤算法 | 資料源、計算窗口、只用過去資料 | 防止前視偏誤 |
| 絕對界線 | 例如 40% 與 60%,不隨資料重算 | 防止配置效果被定義成零 |
| 各桶期望值與標準誤 | 取 walk-forward 的樣本外段落 | 配置效果的精度來源 |
| 各桶回測頻率 | 回測期間的環境組成 | 配置效果的基準權重 |
| 讀取門檻 | 每桶至少 30 筆實盤才讀桶內效果 | 防止在雜訊裡找訊號 |
多數人會在虧損之後才想到要做這張表,那時候做出來的每一格,都已經被實盤污染過了。
結論:策略失效診斷與強化方法的五個重點
- 換對照組。 實盤該比的是用實盤環境權重重算的回測期望值,不是回測的全樣本平均。柏宇的案例裡,前者是 3.8 個基點,後者是 23.6。
- 落差拆成兩塊。 配置效果量環境組成變了多少,桶內效果量策略在同樣環境裡變了多少。這是 Brinson 歸因換了一套名詞。
- 兩塊的精度不對稱。 配置效果幾乎可以確定,桶內效果在上線初期幾乎全是雜訊。早期診斷的主要工作,是把環境能解釋的部分先排除。
- 兩種結果,兩套策略強化方法。 配置效果主導時訊號不動,強化發生在組合層;桶內效果集中在主場時,才進入衰減與成本的診斷。
- 事後加的 regime 濾網幾乎都是再擬合。 實盤帶來的新資訊通常只有環境本身,因虧損而加的濾網,依據多半是痛感。
「策略沒錯,是環境錯了」這句話,只有在算得出環境錯了多少的時候才成立。算不出來的時候,它跟「主力在針對我」是同一類句子。
想把自己的策略拿來跑一次這張歸因表,或對照別人怎麼選環境軸、怎麼設界線的,可以加入付費實驗室一起拆。只想定期追蹤流動性與衍生品結構的環境變化,訂閱電子報就夠了。




