chundev
日期:2026-04-20 情境:期貨 / 槓桿商品的部位規模決策
「既然策略有統計支撐,為什麼不 all-in?」因為你受兩條獨立約束:Kelly Criterion 的數學上限(避免賭太大毀了複利)與 Margin Call 的物理下限(避免單日波動強制平倉)。回測不模擬 margin call,所以低槓桿看起來年化 700%+、實盤卻是歷史必爆倉。真正可用的倍率是兩條線的交集 — 以勝率 76%、賺賠比 2.72 的策略為例,Kelly 建議資金利用率 67%,歷史最大盤中跌 11.8% 要求至少 2x 保證金。這兩個數字把倍率釘在 2x 附近。
期貨交易的部位規模有兩種思考:
這兩個觀點得出的答案會打架。以動態口數策略常見的 multiplier 設計為例:
每口保證金 = 價格 × 點值 × marginRate × multiplier
可開口數 = floor(資金 / 每口保證金)
multiplier 越低,每口需要的錢越少,同資金能開更多口 → 更高槓桿。
Kelly% = W - (1 - W) / R
W = 勝率
R = 賺賠比 = avg win % / avg loss %
實測某策略:
Full Kelly = 0.759 - 0.241 / 2.72 = 0.670 = 67% 資金利用率
意思:每次交易下注金額 ≈ 67% 可用資金。
雖然數學上 Kelly 最大化對數財富長期成長率,實務上都用 Half Kelly(33.5%):
假設每口合約需要 27% 合約價值作為保證金(= marginRate 13.5% × 2x multiplier),則:
2-3 口 = 54-81% 曝險 → 接近 Full Kelly 67%
1-2 口 = 27-54% 曝險 → 接近 Half Kelly 33.5%
實務上 2x multiplier 配 DS(Dynamic Sizing)自動控制在 Kelly 區間。
期貨結算:每日 mark-to-market。當帳戶權益 < 維持保證金,觸發追繳 / 強制平倉。
每口合約價值 = 價格 × 點值
原始保證金 = 合約價值 × marginRate × multiplier
維持保證金 ≈ 原始保證金 × 75%
可承受的盤中跌幅:
tolerance = (原始保證金 - 維持保證金) / 合約價值
= marginRate × multiplier × (1 - 0.75)
= marginRate × multiplier × 0.25
以 marginRate = 13.5%、歷史最大盤中跌 11.8% 為基準:
| multiplier | 保證金佔合約價值 | 可承受盤中跌 | vs 歷史最大 | 判定 |
|---|---|---|---|---|
| 0.5x | 6.8% | -3.4% | -0.29x 餘裕 | ❌ 歷史已爆 |
| 0.75x | 10.1% | 0% | 0x | ❌ 歷史已爆 |
| 1.0x | 13.5% | 3.4% | 0.29x | ❌ 歷史已爆 |
| 1.5x | 20.3% | 10.1% | 0.86x | ❌ 歷史剛好爆 |
| 2.0x | 27.0% | 16.9% | 1.43x | ⚠️ 勉強撐住 |
| 2.5x | 33.8% | 23.6% | 2.00x | ✅ 安全 |
| 3.0x | 40.5% | 30.4% | 2.57x | 🛡️ 保守 |
關鍵洞察:1.5x 以下歷史會爆倉。
把兩個觀點疊在一張表:
| multiplier | 回測年化 | Kelly 達成度 | Margin Call 餘裕 | 可用 |
|---|---|---|---|---|
| 0.5x (all-in 概念) | 727.9% | > Full Kelly(過賭) | ❌ -0.29x | 紙上富貴 |
| 1.0x | 285.0% | 接近 Full Kelly | ❌ 0.29x | 歷史已爆 |
| 1.5x | 165.4% | 超過 Full Kelly 上緣 | ❌ 0.86x | 歷史剛爆 |
| 2.0x | 115.3% | 接近 Full Kelly 下緣 | 1.43x ⚠️ | ✅ 最佳交集 |
| 2.5x | 87.2% | Half Kelly | ✅ 2.0x | ✅ 保守可用 |
| 3.0x | 67.1% | < Half Kelly | ✅ 2.57x | ✅ 極保守 |
2x 是兩條線的甜蜜點:
低於 2x 就踩進歷史會爆倉區,高於 2.5x 就犧牲掉 Kelly 該拿的報酬。
實測 0.5x multiplier 回測輸出:
年化:727.9%
最大單筆虧損:-401,372 萬(-40 億)
最大口數:49,999 口
終值:2,302,568 萬
-40 億的單筆虧損?49,999 口?這些數字荒謬,因為:
所以回測高年化要搭配 margin call 分析一起看,光看績效會被誤導。
用來對照的「歷史最大」應該是策略會進場期間的最大波動,不是隨便找一個市場跌最多的日子。
做法:
以某個期貨策略為例:
這個 11.80% 就是 multiplier 選擇的硬門檻。任何比 0.88x 更激進的 multiplier,都會在 2018-02 或 2021-01/02 被爆倉過。
有人會做 Monte Carlo 模擬:隨機重組歷史交易,看不同 multiplier 表現。結果通常是:
| multiplier | Monte Carlo 中位終值 |
|---|---|
| 1.75x | 4,642 萬 |
| 2.0x | 4,650 萬 |
| 2.5x | 3,960 萬 |
1.75x 看起來跟 2.0x 幾乎一樣。但真實回測:
| multiplier | 真實終值 | 真實最大回撤 |
|---|---|---|
| 1.75x | 4,642 萬 | 41.0% |
| 2.0x | 4,650 萬 | 39.0% |
Monte Carlo 看不見 1.75x 的回撤放大。原因:隨機重組消除了口數累積效應。真實回測中,大贏後口數膨脹,1.75x 比 2.0x 分配更多口數,後續虧損被放大。
教訓:Monte Carlo 不能用來推薦 multiplier,只能驗證路徑依賴性(某策略是否過擬合特定市場序列)。
設計新策略時,決定 multiplier 的完整步驟:
const winRate = winTrades.length / totalTrades;
const avgWin = mean(winTrades.map(t => t.returnRate));
const avgLoss = Math.abs(mean(lossTrades.map(t => t.returnRate)));
const R = avgWin / avgLoss;
const fullKelly = winRate - (1 - winRate) / R;
const halfKelly = fullKelly / 2;
const intradayDrops = trades.map(t => {
// 找進場日的盤中最低價
const entryDay = getDayData(t.entryDate);
return (entryDay.low - t.entryPrice) / t.entryPrice * 100;
});
const maxDrop = Math.min(...intradayDrops); // 最深負值
minMultiplier ≈ |maxDrop| / (marginRate × 0.25) × 安全係數(通常 1.5)
例:maxDrop = -11.8%, marginRate = 13.5%:
minMultiplier = 11.8 / (13.5 × 0.25) × 1.5 = 5.25 ?
不對,應該是:
需要的保證金佔合約價值 = maxDrop / 0.25 = 47.2% × 安全係數
marginRate × multiplier ≥ 47.2% × 1.5 / (1 - 0.25) ...
簡化:直接查上面那張耐受度表,找 tolerance ≥ maxDrop × 1.5 的最小 multiplier。
兩端的 multiplier 對應區間 = 可用範圍。
「Kelly 只跟勝率有關,跟保證金無關」
錯。Kelly 計算每筆下注金額 / 總資金,但多少口數對應多少下注金額取決於 multiplier。
例:
等等——口數不是關鍵,曝險金額才是。
重新想:
低 multiplier 放大曝險倍數,直接越過 Full Kelly。所以 Kelly 和保證金是雙向互動的:想要 67% 曝險(Full Kelly),就不能用太低 multiplier。