仓位管理基础:凯利公式的实战应用与改良

做量化交易这些年,我见过太多人把精力全花在策略开发上。说实话,策略再好,仓位管不好,照样亏钱。今天咱们聊聊仓位管理里最经典的一个工具——凯利公式。

凯利公式:从赌场到交易

凯利公式最早是贝尔实验室的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%了。这就是为什么我说「活着比什么都重要」。

动态调整的实战技巧

我建议的做法是:

  1. 基础仓位:用半凯利公式算出基础比例
  2. 波动率调整:市场波动大时,仓位减半;波动小时,仓位加回
  3. 回撤控制:账户回撤超过10%,仓位自动减半;回撤超过20%,暂停交易
  4. 盈利加仓:账户创新高时,可以适当增加仓位,但不超过基础仓位的1.5倍
💡 小技巧: 我习惯在代码里加一个「仓位上限」参数。比如单笔最大仓位不超过20%,这样即使凯利公式算出50%,系统也不会执行。这个习惯救过我很多次。

代码示例:动态仓位管理器

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

资金曲线平滑的核心逻辑

说了这么多,其实就一句话:仓位管理的目的,不是赚最多,而是活得久

我见过太多人,策略回测曲线漂亮得不行,实盘一跑就崩。为什么?因为回测时用的是固定仓位,实盘时市场环境变了,波动率变了,但仓位没变。

下面这张图,是我自己总结的仓位管理决策流程:

仓位管理决策流程 策略信号 凯利公式计算基础仓位 波动率调整 回撤控制 & 硬性上限 最终仓位

你看,整个流程就是一层层过滤。从策略信号开始,经过凯利计算、波动率调整、回撤控制,最后才输出仓位。每一步都在做一件事——降低风险暴露

💡 我的经验: 刚开始做仓位管理时,别搞太复杂。先用固定比例跑三个月,把习惯养成了,再慢慢加入动态调整。一口吃不成胖子,仓位管理也是。

最后说一句:凯利公式是个好工具,但它不是圣杯。真正的圣杯,是你对风险的理解和控制。记住,资金曲线平滑,靠的不是预测市场,而是管理自己。

专注资料整理