為什麼單策略回測不夠用、BlaveClaw 走步向前組合回測的運作原理,以及如何解讀報告。
假設你建了三個策略,每個都有不錯的 Sharpe ratio。把它們組合成一個投資組合——組合後的績效比單一策略好嗎?不模擬它們的互動,你無從得知。
有三件事只有在組合層面才看得見:
BlaveClaw 的 management_backtest.py 跑的是走步向前模擬(Walk-forward Simulation)——和實盤 Manager 使用的方法相同,但回放在歷史資料上。這是估算組合層面績效的唯一有效方式。
前 lookback 天(預設 365 天)作為初始校準窗口。績效報告從校準窗口結束後才開始——嚴格的樣本外。
每一天,最佳化器尋找權重向量 w,使過去 365 天的組合報酬率曲線「斜率/波動度」最大化。限制條件:權重加總為 1,且各策略權重 ≥ 0(不做空策略)。
剛計算好的權重,套用到下一天各策略的實際報酬。最佳化器永遠看不到它要預測的那一天——這就是「樣本外」的意義。
窗口向前滑動。每一天都用最新的 365 天歷史資料重新計算權重。
要知道動態權重最佳化是否真的有幫助,組合回測會產生 1,000 個隨機組合——使用相同的策略,但用靜態的隨機權重(從 Dirichlet 分佈採樣)。核心輸出指標是:
這個基準非常重要,因為「在回測中打敗隨機組合」的 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(去槓桿)。
--target-vol 0.10。在 30% 目標波動度下,惡劣時期的回撤預期在 −40% 到 −60% 之間。
每當以下情況發生,上線前都要重新跑:
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 天 | 資料不夠——結果在統計上不可靠。先讓個別策略的回測跑更長時間。 |