feedback
← 回到目錄

策略組合回測:多策略聯合驗證

為什麼單策略回測不夠用、BlaveClaw 走步向前組合回測的運作原理,以及如何解讀報告。

分開回測每個策略有什麼問題

假設你建了三個策略,每個都有不錯的 Sharpe ratio。把它們組合成一個投資組合——組合後的績效比單一策略好嗎?不模擬它們的互動,你無從得知。

有三件事只有在組合層面才看得見:

  • 相關性: 如果兩個策略都在同一個訊號上做多 BTC,合在一起不是分散風險——只是把暴露加倍。
  • 權重的誤差: 把 80% 資金分給回測最好的策略,看起來最佳,但這個配置是用最佳化器已經「看過」的資料找出來的,屬於樣本內過擬合。
  • 回撤疊加: 多個策略可能同時回撤(例如,所有趨勢追蹤策略在震盪市場都失效)。組合的最大回撤不等於各策略 MDD 的平均值。

組合回測在做什麼

BlaveClaw 的 management_backtest.py 跑的是走步向前模擬(Walk-forward Simulation)——和實盤 Manager 使用的方法相同,但回放在歷史資料上。這是估算組合層面績效的唯一有效方式。

1
從第一個樣本外日期開始

lookback 天(預設 365 天)作為初始校準窗口。績效報告從校準窗口結束後才開始——嚴格的樣本外。

2
在過去窗口上最佳化權重

每一天,最佳化器尋找權重向量 w,使過去 365 天的組合報酬率曲線「斜率/波動度」最大化。限制條件:權重加總為 1,且各策略權重 ≥ 0(不做空策略)。

3
把權重套用到明天的報酬

剛計算好的權重,套用到下一天各策略的實際報酬。最佳化器永遠看不到它要預測的那一天——這就是「樣本外」的意義。

4
往前移動一天,重複

窗口向前滑動。每一天都用最新的 365 天歷史資料重新計算權重。

隨機組合基準

要知道動態權重最佳化是否真的有幫助,組合回測會產生 1,000 個隨機組合——使用相同的策略,但用靜態的隨機權重(從 Dirichlet 分佈採樣)。核心輸出指標是:

Managed 的 Sharpe 超越了 X% 的 1,000 個隨機組合。
X > 70% → 動態配置在創造超額價值。X < 50% → 最佳化器沒有幫助,組合的優勢完全來自各策略本身的品質,而不是權重管理。

這個基準非常重要,因為「在回測中打敗隨機組合」的 Manager,才有更強的理由相信它在實盤也能做到。如果連隨機都打不贏,你就不該讓 Manager 動態調整權重。

讀懂三個面板的圖

輸出的 manager/pnl.png 有三個面板:

面板顯示內容看什麼
上方——累積報酬 Managed 組合(綠色)vs. 1,000 個隨機組合的 p5–p95 區間(灰色) 綠線應持續高於隨機組合的中位數。超過 2 年的一致性超越才有意義。
中間——回撤 Managed 組合從淨值高點的跌幅 MDD 要在可承受範圍內。深度且長時間無法回升的回撤,代表分散度不足或策略相關性太高。
下方——權重歷史 每個策略的配置比例隨時間的變化 權重穩定 → 各策略相對表現一致。權重快速切換 → 最佳化器在追短期雜訊,可信度低。

最佳化目標:斜率 / 波動度

最佳化器最大化這個目標函數:

組合報酬累積曲線的線性斜率(最近 365 天)
──────────────────────────────────────────
     組合報酬的波動度(最近 365 天)

這類似 Sharpe ratio,但用累積報酬曲線的線性斜率取代算術平均報酬。斜率比日報酬率的均值更穩定——它衡量的是趨勢的一致性,而不是報酬率的大小。

限制條件是 sum(w) = 1, w ≥ 0,即所有資金都配置在策略之間,且不對任何策略放空。最佳化器使用 10 次隨機重啟來避免陷入局部最優解。

槓桿與目標波動度

Manager 除了權重配置,還有另一個關注點:對整個組合施加多少槓桿。

最佳化完權重後,manager.py 計算組合的實際年化波動度,並調整到目標值:

槓桿 = 目標波動度 / 組合年化波動度

預設目標是 30% 年化波動度。如果組合的實際波動是 15%,槓桿 = 2x;如果是 40%,槓桿 = 0.75x(去槓桿)。

MDD 經驗法則: 目標波動度 ≈ 可接受最大回撤 ÷ 2。如果你能承受 −20% 的組合回撤,設 --target-vol 0.10。在 30% 目標波動度下,惡劣時期的回撤預期在 −40% 到 −60% 之間。

什麼時候要跑組合回測

每當以下情況發生,上線前都要重新跑:

  • 加入新策略
  • 移除策略
  • 任何個別策略的參數有大幅調整
  • 距離上次跑超過 3 個月
python3 manager/management_backtest.py --lookback 365 --random-n 1000

確認組合回測結果健康後,再跑 manager.py 更新實盤權重:

python3 manager/manager.py --lookback 365 --account 10000 --target-vol 0.30

組合回測的警示訊號

警示訊號可能代表的問題
Managed Sharpe 低於隨機組合中位數動態配置在拖累績效,考慮改用等權重分配。
下方面板權重劇烈振盪各策略優勢相近,最佳化器在擬合雜訊。嘗試加長 lookback 或增加更多策略。
某策略長期拿到 >80% 權重其他策略沒有在貢獻。評估它們是否值得繼續跑。
組合 MDD 超過個別策略 MDD 的 2 倍各策略同時回撤,相關性太高,無法有效分散。
樣本外期間不足 180 天資料不夠——結果在統計上不可靠。先讓個別策略的回測跑更長時間。
← 回到目錄