一个困扰交易者的千年难题#
假设你有一个胜率60%的交易策略,每次盈利赚5%,亏损亏3%。每次应该下注多少?
- 全仓?一次失误就爆仓
- 固定10%?可能浪费高胜率优势
- 马丁格尔(加倍下注)?迟早死于黑天鹅
约翰·拉里·凯利(John Larry Kelly Jr.)在1956年给出了数学答案。
凯利公式原理#
基本形式#
f* = (p × b - q) / bplaintext其中:
f*= 最优仓位比例p= 胜率(盈利概率)q= 败率(1 - p)b= 盈亏比(平均盈利 / 平均亏损)
实战案例#
假设你的策略:
- 胜率 p = 0.55
- 平均盈利 8%,平均亏损 4% → 盈亏比 b = 2
f* = (0.55 × 2 - 0.45) / 2 = 0.325 = 32.5%plaintext这意味着: 每次应该用32.5%的账户资金下注。
凯利公式的残酷真相#
问题1:估计误差放大#
凯利公式对p和b的估计误差极其敏感。如果你的真实胜率是52%而非55%,最优仓位会从32.5%骤降至22.5%。
解决方案: 使用半凯利(Half-Kelly),即 f* / 2,降低波动。
问题2:不考虑破产风险#
纯凯利公式不限制最大回撤。连续亏损10次(概率0.55^10 ≈ 0.25%)会导致账户缩水98%。
改进方案: 引入最大回撤约束
def kelly_with_drawdown_constraint(p, b, max_drawdown=0.2):
f_full = (p * b - (1-p)) / b
f_safe = f_full * 0.5 # 半凯利
# 模拟10000次,检查回撤
equity_curve = simulate_trades(f_safe, p, b, n=10000)
max_dd = calculate_max_drawdown(equity_curve)
if max_dd > max_drawdown:
return f_safe * 0.7 # 进一步降低
return f_safepython量化实盘中的仓位管理框架#
多策略组合仓位分配#
当你同时运行5个策略,如何分配资金?
风险平价思路:
# 计算每个策略的波动率
volatility = strategy_returns.rolling(60).std() * np.sqrt(252)
# 仓位与波动率成反比
position_size = (1 / volatility) / (1 / volatility).sum()python动态仓位调整#
市场波动率变化时,仓位应该动态调整:
| VIX指数 | 仓位调整 |
|---|---|
| < 15 | 100% (满仓) |
| 15-25 | 75% |
| 25-35 | 50% |
| > 35 | 25% (或空仓) |
实盘案例:CTA趋势跟踪策略#
某商品期货CTA策略(2019-2025):
- 原始凯利:平均仓位 38%
- 半凯利 + 波动率调整:平均仓位 22%
- 结果对比:
| 指标 | 原始凯利 | 改进方案 |
|---|---|---|
| 年化收益 | 24.1% | 21.3% |
| 最大回撤 | -41.2% | -18.7% |
| 夏普比率 | 1.21 | 1.58 |
| 卡玛比率 | 0.58 | 1.14 |
结论: 降低仓位但提升风险调整后收益,这才是可持续的交易。
仓位管理的铁律#
- 永远不要满仓单一策略(即使凯利公式说可以)
- 分散到3-5个低相关策略
- 定期重新估计
p和b(策略衰减会发生) - 设置硬性止损(凯利公式不考虑尾部风险)
结语#
凯利公式是数学送给交易者的礼物,但不是圣杯。真正的仓位管理是艺术与科学的结合——用数学给出基准,用经验做调整。
“Position sizing is the only thing that matters.” — Jack Schwager
延伸阅读:
- Kelly, J. L. (1956). A New Interpretation of Information Rate
- Vince, R. (1990). Portfolio Management Formulas
- 实盘代码:https://github.com/yourusername/kelly-position-sizing ↗