halo 的技术博客

返回

一个困扰交易者的千年难题#

假设你有一个胜率60%的交易策略,每次盈利赚5%,亏损亏3%。每次应该下注多少?

  • 全仓?一次失误就爆仓
  • 固定10%?可能浪费高胜率优势
  • 马丁格尔(加倍下注)?迟早死于黑天鹅

约翰·拉里·凯利(John Larry Kelly Jr.)在1956年给出了数学答案。

凯利公式原理#

基本形式#

f* = (p × b - q) / b
plaintext

其中:

  • 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:估计误差放大#

凯利公式对pb的估计误差极其敏感。如果你的真实胜率是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_safe
python

量化实盘中的仓位管理框架#

多策略组合仓位分配#

当你同时运行5个策略,如何分配资金?

风险平价思路:

# 计算每个策略的波动率
volatility = strategy_returns.rolling(60).std() * np.sqrt(252)

# 仓位与波动率成反比
position_size = (1 / volatility) / (1 / volatility).sum()
python

动态仓位调整#

市场波动率变化时,仓位应该动态调整:

VIX指数仓位调整
< 15100% (满仓)
15-2575%
25-3550%
> 3525% (或空仓)

实盘案例:CTA趋势跟踪策略#

某商品期货CTA策略(2019-2025):

  • 原始凯利:平均仓位 38%
  • 半凯利 + 波动率调整:平均仓位 22%
  • 结果对比:
指标原始凯利改进方案
年化收益24.1%21.3%
最大回撤-41.2%-18.7%
夏普比率1.211.58
卡玛比率0.581.14

结论: 降低仓位但提升风险调整后收益,这才是可持续的交易。

仓位管理的铁律#

  1. 永远不要满仓单一策略(即使凯利公式说可以)
  2. 分散到3-5个低相关策略
  3. 定期重新估计pb(策略衰减会发生)
  4. 设置硬性止损(凯利公式不考虑尾部风险)

结语#

凯利公式是数学送给交易者的礼物,但不是圣杯。真正的仓位管理是艺术与科学的结合——用数学给出基准,用经验做调整。

“Position sizing is the only thing that matters.” — Jack Schwager


延伸阅读:

凯利公式与仓位管理:用数学优化你的每次下注
https://blog.halo26812.eu.org/blog/2026-06-04-kelly-criterion-position-sizing
Author halo
Published at 2026年6月4日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨