仓位管理基础:凯利公式的实战应用与改良
做量化交易这些年,我见过太多人把精力全花在策略开发上。说实话,策略再好,仓位管不好,照样亏钱。今天咱们聊聊仓位管理里最经典的一个工具——凯利公式。
凯利公式:从赌场到交易
凯利公式最早是贝尔实验室的John Kelly为研究电话信号噪声提出的。后来被赌徒们发现,这玩意儿在赌博里特别好用。再后来,量化交易圈也把它拿过来了。
公式长这样:
f* = (bp - q) / b
其中:
- f* — 最优下注比例
- b — 赔率(盈亏比)
- p — 胜率
- q — 败率(1 - p)
举个例子。假设你的策略胜率60%,盈亏比2:1。代入公式:
f* = (2 * 0.6 - 0.4) / 2 = 0.4
也就是说,每次交易应该用40%的资金去赌。嗯,这里要注意——这个比例在赌博里没问题,但在交易里,40%的仓位太激进了。
我在项目中踩过的坑
我曾经在一个CTA策略上直接用了全凯利仓位。结果呢?连续三次亏损后,账户回撤超过30%。那段时间我整晚睡不着,盯着账户净值曲线发呆。
后来我明白了——凯利公式给出的是理论最优值,但实际交易中,我们需要对它做改良。
固定比例仓位 vs 动态仓位调整
这两种方法,说白了就是「死板」和「灵活」的区别。
固定比例仓位
每次交易都用固定比例的资金。比如总资金的2%,不管账户赚了还是亏了,都按这个比例来。
优点:简单、稳定、容易执行。
缺点:资金增长时效率低,回撤时保护不够。
动态仓位调整
根据账户净值、市场波动率、策略表现等因素,动态调整仓位比例。
优点:资金利用率高,风险控制更精细。
缺点:需要实时计算,容易过度优化。
| 对比维度 | 固定比例仓位 | 动态仓位调整 |
|---|---|---|
| 执行难度 | 低 | 高 |
| 资金利用率 | 一般 | 较高 |
| 回撤控制 | 中等 | 较好 |
| 适合人群 | 新手、低频交易 | 老手、高频交易 |
改良凯利公式:实战中的折中方案
我个人习惯用半凯利或者分数凯利。什么意思呢?就是把凯利公式算出来的比例,再打个折扣。
实际仓位 = 凯利比例 × 折扣系数
折扣系数一般取0.25到0.5之间。比如刚才那个例子,凯利比例是40%,我用0.25的折扣,实际仓位就是10%。
你想想看,如果每次都用10%仓位,连续亏10次,账户还剩多少?
剩余资金 = (1 - 0.1)^10 ≈ 0.3487
也就是说,亏了65%。但如果用40%仓位,连续亏3次就只剩21.6%了。这就是为什么我说「活着比什么都重要」。
动态调整的实战技巧
我建议的做法是:
- 基础仓位:用半凯利公式算出基础比例
- 波动率调整:市场波动大时,仓位减半;波动小时,仓位加回
- 回撤控制:账户回撤超过10%,仓位自动减半;回撤超过20%,暂停交易
- 盈利加仓:账户创新高时,可以适当增加仓位,但不超过基础仓位的1.5倍
代码示例:动态仓位管理器
class PositionManager:
def __init__(self, initial_capital, max_risk_per_trade=0.02):
self.capital = initial_capital
self.max_risk = max_risk_per_trade
self.peak_capital = initial_capital
def kelly_fraction(self, win_rate, profit_ratio):
"""计算半凯利仓位"""
kelly = (profit_ratio * win_rate - (1 - win_rate)) / profit_ratio
return max(0, kelly * 0.5) # 半凯利
def volatility_adjust(self, base_position, current_vol, avg_vol):
"""波动率调整"""
vol_ratio = avg_vol / current_vol
return base_position * min(vol_ratio, 1.5) # 最多放大1.5倍
def drawdown_control(self, position):
"""回撤控制"""
dd = (self.peak_capital - self.capital) / self.peak_capital
if dd > 0.2:
return 0 # 回撤超20%,暂停
elif dd > 0.1:
return position * 0.5 # 回撤超10%,减半
return position
def get_position_size(self, win_rate, profit_ratio, current_vol, avg_vol):
base = self.kelly_fraction(win_rate, profit_ratio)
adjusted = self.volatility_adjust(base, current_vol, avg_vol)
final = self.drawdown_control(adjusted)
# 加上硬性上限
final = min(final, self.max_risk)
return final * self.capital
资金曲线平滑的核心逻辑
说了这么多,其实就一句话:仓位管理的目的,不是赚最多,而是活得久。
我见过太多人,策略回测曲线漂亮得不行,实盘一跑就崩。为什么?因为回测时用的是固定仓位,实盘时市场环境变了,波动率变了,但仓位没变。
下面这张图,是我自己总结的仓位管理决策流程:
你看,整个流程就是一层层过滤。从策略信号开始,经过凯利计算、波动率调整、回撤控制,最后才输出仓位。每一步都在做一件事——降低风险暴露。
最后说一句:凯利公式是个好工具,但它不是圣杯。真正的圣杯,是你对风险的理解和控制。记住,资金曲线平滑,靠的不是预测市场,而是管理自己。