2026年九月12日 · 風險

5 種倉位規則、同一個訊號:回測真正仰賴的部分

5 種倉位規則、同一個訊號:回測真正仰賴的部分

你的進場訊號很可能是回測中影響最小的部分。我可以拿一條平庸的動能規則,完全不動任何進出場時間戳,只改變決定持有多少合約的函數,就讓淨 Sharpe 從 0.41 升到 0.71,最大回撤從 31% 降到 13%。交易相同,成交相同,策略卻不同。

這種說法會惹人不快,而且也理應如此,因為它暗示我們花在調整回看期與篩選門檻上的大部分時間,都耗在次要項目上。讓我先展示實際跑出的結果,再好好回應批評者,因為這個論點確實有一種說法是錯的,值得弄清楚我主張的究竟是哪一種。

一個訊號,6 種持倉方式

訊號設定:Binance USDⓈ-M 的 ETHUSDT 永續合約,1 小時 K 線;12 小時 EMA 高於 96 小時 EMA 時做多,否則空倉,不做空。期間為 2022 年 7 月至 2026 年 6 月。431 次完整交易。雙邊 taker 手續費各 5.0 bps,每 8 小時依實際持倉支付或收取資金費率,滑價則根據最佳買賣報價的掛單深度建模。這是個刻意選得很無聊的訊號——我挑它是因為沒人會替它辯護,能讓測試條件更單純。

下表每一列的進出場 K 線時間戳都完全相同,唯一差異是倉位大小函數。

倉位規則淨 Sharpe最大回撤每年交易名目金額(× 平均倉位)成本占毛利潤比例最高槓桿
固定 $10k 名目金額0.4118.2%246×14%1.0×
固定比例,使用 100% 權益0.4430.8%251×15%1.0×
20 日已實現波動率倒數0.6814.1%690×29%4.4×
年化波動率目標 20%,每小時再平衡,不設上限0.7112.9%1,180×41%6.3×
波動率目標 20%、20% 不交易區間、槓桿上限 3×0.6615.3%402×19%3.0×
以 60 日滾動平均/變異數計算 Half-Kelly0.5224.6%830×33%8.1×
0.41 → 0.71進場完全相同時的淨 Sharpe
41%每小時再平衡所耗掉的毛利潤
6.3×Sharpe 最高的那次測試悄悄用上的最高槓桿

看看這個差距。最差與最佳列之間,Sharpe 相對差異達 73%,回撤則相差 2.4 倍。現在請你在這組資料上找出一個進場訊號參數,讓 Sharpe 增加 0.30,又不會明顯過度擬合。我找過了。EMA 週期組合在整個合理參數網格中的變化,約能讓 Sharpe 浮動 0.12,而其中大部分只是樣本外無法延續的雜訊。

為什麼反波動率表現這麼好,其中有多少是真的

背後原理並不神祕。採用固定名目金額時,倉位大小與已實現波動率無關,代表每筆交易的美元風險會隨當週波動而變。在這段期間的 ETH 市場中,20 日已實現波動率介於年化 31% 至 118%。固定名目金額策略在 2024 年 3 月承擔的美元風險,是 2023 年 7 月的 3.8 倍;原因不是訊號更有把握,而是市場波動更大。它的回撤幾乎全都集中在波動率最高的五分位。反波動率倉位調整消除了這種連動,改善報酬序列的型態確實有其效果。

但 Sharpe 提升有一部分是衡量上的假象;如果不把兩者拆開,你之後會做出錯誤決策。Sharpe 的分母是報酬標準差,而波動率目標本質上就是讓報酬標準差更穩定。你直接在最佳化分母。只要報酬序列有波動叢聚,將倉位調整到固定事前波動率的規則,幾乎都能提高 Sharpe,即使那條序列毫無優勢也一樣。我用打亂的訊號驗證過:隨機化進場時間戳,保留波動率目標調整,零均值基礎序列的 Sharpe 相較固定名目金額仍提高約 0.06。幅度不大,但確實存在,而且純粹來自機制本身。

因此,我們在內部比較倉位規則時,Sharpe 絕不會是表上唯一的數字。我還要看 Calmar、每單位平均投入名目金額的淨 PnL,以及毛利潤到淨利潤的成本瀑布圖,因為這三項合在一起,比較不容易用分母伎倆做出好看的結果。

波動率估計是模型,也會發生資訊洩漏

漂亮的倉位調整結果最後證明是假的,最常見的原因就是波動率估計用了正在調整倉位的那根 K 線資訊。如果你的波動率序列是用置中視窗計算,或在重採樣後(當中包含目前尚未收完的 K 線)套用 pandas 預設的 `rolling().std()`,又或者是依完整樣本做標準化,那就發生資訊洩漏了。這很隱晦,因為波動率有持續性,所以任何一列的洩漏都很小,權益曲線看起來仍然合理。只是在真正關鍵的那些星期,曲線會顯得稍微過度平滑。

我們的 agents 會在任何倉位規則進入模擬交易佇列前,檢查以下 4 件事:

  1. 決策當下可取得的資料。14:00 開盤的 K 線所用倉位,必須能以收盤時間戳 ≤ 13:59:59.999 的資料計算。我們會隨機抽取 200 個決策時間點,從截斷後的資料框重新計算倉位序列並比對,以斷言這點成立。
  2. 估計器回看期是實際參數。20 日波動率視窗和 60 日波動率視窗是兩種不同策略。回看期會和其他參數一起放進 walk-forward 網格;如果結果只有某一個視窗長度有效,那就是策略脆弱性的發現。
  3. 檢視整段槓桿路徑,而不只看最高值。列出總槓桿的完整分布。上方那次未設上限的波動率目標測試,有 4% 的時間槓桿高於 5×;這種資訊在摘要表中總是看不到,卻完全左右策略能否實際執行。
  4. 以倉位敏感度做穩健性測試。如果把波動率目標從 20% 改成 25% 後,Sharpe 就崩跌,那這策略就不是在做波動率目標調整,而是在調槓桿;你只是挑了一個數字來找到優勢。

槓桿上限不是風險管理的裝飾,而是策略定義的一部分。Binance 的 ETHUSDT 會依倉位名目金額調降最高槓桿,維持保證金率也會隨之提高。回測若讓波動率目標規則在名目金額 $400k 時用到 6.3× 槓桿,描述的就是交易所不會讓你以那種保證金持有的倉位。表中有上限的那列少了 0.05 Sharpe,卻是兩列中唯一符合真實情況的策略。

資金都花在再平衡上了

看看成本欄。每小時依波動率目標再平衡,得到最高的表面 Sharpe,卻也把 41% 的毛利潤交給交易所。每年交易的名目金額是平均倉位的 1,180 倍,單邊手續費 5 bps,另加價差和市場衝擊成本。直覺上的解法是按排程降低再平衡頻率。更好的解法是設置不交易區間:只有當目前倉位偏離目標超過某個門檻時才調整。

20% 的區間把每年交易名目金額從 1,180× 降到 402×,減少 66%,Sharpe 則少了 0.05。我已在 8 個訊號上測過,結果模式一再重現:15% 至 25% 的區間,只用三分之一的換手量就能保留大部分風險控制效益;低於 10% 的區間,只是為了讓估計值看起來更精準而白白付手續費,何況這個數值本來就是用 20 日視窗估計的。面對標準誤有 15% 的數值,你不可能把再平衡精確到小數點後 3 位。

2 月時有一次測試,agent 寫的報告把 Sharpe 提升 0.22 歸功於「改善後的進場篩選器」。實際差異只有倉位模組裡的一行程式碼,篩選器根本沒改。我現在要求報告在頂端印出倉位設定的雜湊值,因為歸因需要紀律,而模型和其他人一樣,也很樂意編出好聽的故事。

模擬交易會讓倉位規則遇上什麼

回測和模擬交易之間的落差,這時會擴得最大,而且多半只是算術問題。依波動率調整倉位,會讓倉位大小在樣本期間上下浮動 4 至 8 倍。回測從未模擬過的交易所限制,這個範圍的兩端都會碰上。

小倉位時會遇到數量步進和最低名目金額限制。ETHUSDT 永續合約的數量步進為 0.001,最低名目金額為 $5。如果低波動狀態下你的倉位是 0.0004 ETH,回測會持有,模擬交易卻會完全不下單。這聽起來像是罕見例外,但別忘了波動率目標規則會在市場最平靜時配置最小倉位,而趨勢訊號的好進場點往往就在這種時候。大倉位時則會碰上倉位限制、保證金級距,以及 6× 倉位需要逐倉保證金管理,但你的回測並未建立清算模型。

我們曾遇到一個案例,模擬交易權益曲線連續 6 週都和回測相差不到 3%,之後卻大幅背離。原因是數值取整:下單倉位計算器用了 `int()` 截斷,而不是依步進取整;套用在平均只有 1.4 個步進的倉位上。回測是在連續空間計算倉位,實際下單計算器卻讓每筆小額交易都少了預定倉位的 20-30%。沒有什麼複雜的成交模型,也不是延遲問題,就是截斷。

批評者說得對的地方

有 3 個反對理由站得住腳,我不想刻意淡化。

第一,也是最重要的一點:倉位大小只能分配優勢,不能憑空創造優勢。如果你的訊號扣除合理的手續費和資金費率後,毛預期報酬小於或等於 0,表中每種規則都會虧錢;那些花俏的規則只不過讓虧損的波動型態更好看。我選的訊號在這段期間有微小但正向的淨優勢。把同樣 6 種規則用在每筆淨虧 −1.2 bps 的訊號上,績效排名不變,但每種規則期末權益都低於起始值。倉位大小只是某個東西的乘數;你仍然需要那個東西。

第二,波動率目標有個真實且已有充分紀錄的失效模式:在快速崩跌底部去槓桿,反彈後再加槓桿。急速 V 型反轉時,固定名目金額往往勝出,有時還大幅領先。2020 年 3 月的股票市場,以及 2024 年 8 月的加密貨幣市場回檔,都讓依波動率調整倉位的策略在回升階段吃足苦頭。我這 4 年的 ETH 樣本剛好包含更多波動叢聚下的盤跌,而 V 型劇烈震盪較少,因此反波動率的結果較好看。換一段期間,有些排名就會反轉;如果我拿 2020 年的表格打頭陣,這個論點就站不太住腳。

第三,倉位規則和其他東西一樣容易過度擬合。表中的 Half-Kelly 滾動估計就是警訊:看起來精密,有理論依據,最後卻得到倒數第二高的回撤,因為對雜訊報酬序列做滾動平均估計,結果根本不可靠,而 Kelly 對這種估計誤差極其敏感。任何把預期報酬估計當作輸入的倉位規則,都會承襲該估計的誤差,而且誤差還會放大。只根據變異數估計的規則穩定得多,因為用 4 年的每小時資料,變異數是我們唯一真正估得出來的動差。

從這些結果中,我會記住一件事:回測結果讓你意外時,先檢查倉位模組,再去訊號裡尋找巧思。報告 Sharpe 時,也要把槓桿路徑和成本瀑布圖一併列出,因為如此依賴倉位決策的數字,根本不是訊號本身的特性。

倉位大小、波動率目標、Sharpe 比率、風險管理、回測
← 所有文章