同一个策略,仓位 10% 和仓位 50%,长期下来可以是稳定盈利和账户归零的区别。选股、择时、因子设计都是在回答"买什么",仓位管理回答的是"买多少"。凯利公式(Kelly Criterion)是这个问题的数学最优解。

经典凯利公式

凯利公式起源于 1956 年贝尔实验室的 John Kelly。原始场景是一个简单的二元赌博:每局胜率 \(p\),败率 \(q = 1-p\),赔率 \(b\)(赢了拿回本金加上 \(b\) 倍本金,输了赔光下注金额)。你手里有固定本金,每局押多大比例?

凯利的答案:

$$f^* = \frac{bp - q}{b} = \frac{bp - (1-p)}{b}$$

其中 \(f^*\) 是最优下注比例(占总资金的百分比)。

数值例子:胜率 55%,赔率 1:1(\(b=1\))。

$$f^* = \frac{1 \times 0.55 - 0.45}{1} = 0.10$$

最优下注比例是 10%。直觉上合理:你有微弱优势,但不应该重仓。

凯利最大化的不是单局期望收益,而是对数资金增长率。对数增长率是几何增长的核心指标。算术期望可以很高,但如果某一局亏光了,几何增长率直接变成负无穷。凯利公式找的是让 \(E[\ln(W)]\) 最大的 \(f\),其中 \(W\) 是每局后的财富。

推导过程:每局后资金为 \(W_{n+1} = W_n(1 + f \cdot X)\),\(X\) 取 \(+b\)(概率 \(p\))或 \(-1\)(概率 \(q\))。对数增长率的期望:

$$G(f) = p \ln(1 + bf) + q \ln(1 - f)$$

对 \(f\) 求导令其为零,解出来就是上面的公式。

凯利公式有一个重要性质:\(f^*\) 只有在期望值为正时才大于零。如果 \(bp < q\)(负期望),公式给出负值,意味着不应该下注(或者反向下注)。这和直觉一致:没有优势就不玩。

连续情况:收益率分布的凯利

实际交易中收益不是"要么赚 b 要么赔光"这么简单。标的的收益率是连续分布的。假设策略的对数收益率近似正态分布,均值 \(\mu\),标准差 \(\sigma\),无风险利率 \(r\)。连续版本的凯利公式:

$$f^* = \frac{\mu - r}{\sigma^2}$$

这个公式的直觉:\(\mu - r\) 是超额收益(你的优势),\(\sigma^2\) 是风险(方差)。优势越大仓位越高,风险越大仓位越低。

夏普比率的关系很直接。夏普比率 \(SR = \frac{\mu - r}{\sigma}\),所以:

$$f^* = \frac{SR}{\sigma}$$

夏普比率 1.0、年化波动率 20% 的策略,凯利最优杠杆是 \(1.0 / 0.20 = 5\) 倍。夏普 0.5、波动率 30% 的策略,凯利杠杆是 \(0.5 / 0.30 \approx 1.67\) 倍。

这揭示了一个重要的现实:很多量化策略的凯利最优杠杆远高于直觉。一个年化收益 15%、波动率 10% 的策略(\(\mu - r = 0.10\),假设 \(r = 5\%\)),凯利杠杆是 \(0.10 / 0.01 = 10\) 倍。用 10 倍杠杆跑,理论上长期增长最快,但过程会非常痛苦。

分数凯利:实操的关键

直接使用公式算出的 \(f^*\) 做仓位叫全凯利(Full Kelly)。上一节的例子里,\(f^* = 2.5\) 就意味着全凯利要求你用 2.5 倍杠杆。全凯利是理论增长率最大化的点,但实操中问题很大:

  1. 回撤太深。全凯利的理论最大回撤可以接近 100%。模拟 1000 次赌局,全凯利在中途经常出现 50-80% 的回撤。
  2. 参数估计误差被放大。你用历史数据估算 \(\mu\) 和 \(\sigma\),但这些只是估计值。如果真实 \(\mu\) 比你估计的低,全凯利就变成了 over-bet,后果是灾难性的。Over-bet 比 under-bet 危险得多:under-bet 只是增长慢一些,over-bet 的长期增长率是负的。

所以实操中几乎所有人用分数凯利(Fractional Kelly):不直接用 \(f^*\),而是乘一个小于 1 的系数。\(f^*/2\) 叫半凯利(Half Kelly),\(f^*/3\) 叫三分之一凯利。如果全凯利是 2.5 倍杠杆,半凯利就是 1.25 倍,三分之一凯利就是 0.83 倍。

半凯利的性质很好:

  • 期望增长率是全凯利的 75%(只牺牲了 25% 的增长速度)
  • 最大回撤大约减半
  • 对参数估计误差更鲁棒

下面用 Python 模拟对比全凯利、半凯利、固定仓位的净值曲线:

import numpy as np

def simulate_kelly(mu, sigma, r, fraction, n_days=1000, n_sims=500):
    """
    模拟不同凯利分数下的净值路径
    mu: 策略年化收益率
    sigma: 策略年化波动率
    fraction: 凯利分数 (1.0=全凯利, 0.5=半凯利)
    """
    dt = 1 / 252  # 日频
    kelly_full = (mu - r) / sigma**2
    f = kelly_full * fraction
    
    daily_mu = mu * dt
    daily_sigma = sigma * np.sqrt(dt)
    
    np.random.seed(42)
    returns = np.random.normal(daily_mu, daily_sigma, (n_sims, n_days))
    
    # 每日按凯利比例配置,剩余放无风险
    wealth = np.ones((n_sims, n_days + 1))
    for t in range(n_days):
        portfolio_return = f * returns[:, t] + (1 - f) * r * dt
        wealth[:, t + 1] = wealth[:, t] * (1 + portfolio_return)
    
    return wealth

mu, sigma, r = 0.15, 0.20, 0.05

wealth_full = simulate_kelly(mu, sigma, r, fraction=1.0)
wealth_half = simulate_kelly(mu, sigma, r, fraction=0.5)
wealth_fixed = simulate_kelly(mu, sigma, r, fraction=0.3)  # 固定30%仓位

# 统计
for name, w in [("全凯利", wealth_full), ("半凯利", wealth_half), ("固定30%", wealth_fixed)]:
    final = w[:, -1]
    median_return = np.median(final)
    max_dd = np.min(w / np.maximum.accumulate(w, axis=1), axis=1)
    avg_max_dd = np.mean(1 - max_dd)
    print(f"{name}: 中位终值={median_return:.2f}, 平均最大回撤={avg_max_dd:.1%}")

参数设定:年化收益 \(\mu=15\%\),波动率 \(\sigma=20\%\),无风险利率 \(r=5\%\)。先算全凯利最优杠杆:\(f^* = (0.15 - 0.05) / 0.20^2 = 2.5\),意味着公式建议你把资金的 250% 投入策略(即 2.5 倍杠杆)。全凯利fraction=1.0)就是直接用这个 2.5 倍;半凯利fraction=0.5)取一半,即 1.25 倍;固定 30% 是不管公式怎么算,始终只投入 30% 资金。500 条路径,每条 1000 个交易日(约 4 年)。运行结果:

杠杆中位终值均值终值平均最大回撤95 分位最大回撤
全凯利2.50x1.883.1360.3%81.9%
半凯利1.25x1.721.9634.5%52.4%
固定 30%0.30x1.541.6220.9%32.9%

结论很清晰:全凯利 2.5 倍杠杆下中位终值最高(1.88 vs 1.72),但代价是 60% 的平均最大回撤,95 分位更是达到 82%。半凯利只用 1.25 倍杠杆,终值只低了 8%,回撤几乎减半。固定 30% 仓位最保守,回撤只有 21%,适合风险承受力低的策略。注意均值终值(3.13)远高于中位数(1.88),说明全凯利的分布是严重右偏的:少数路径暴赚拉高了均值,但大多数路径的表现不如均值暗示的那么好。

全凯利、半凯利、固定仓位的净值路径与回撤对比

多资产凯利

单资产凯利只需要一个比率。多资产的情况需要协方差矩阵。假设你有 \(n\) 个资产,收益率向量 \(\boldsymbol{\mu}\),协方差矩阵 \(\boldsymbol{\Sigma}\),无风险利率 \(r\)。多资产凯利的最优权重向量:

$$\mathbf{f}^* = \boldsymbol{\Sigma}^{-1} (\boldsymbol{\mu} - r \cdot \mathbf{1})$$

这个公式和均值方差优化(Markowitz)有直接关系。Markowitz 的切线组合(最大夏普比率组合)的权重正比于 \(\boldsymbol{\Sigma}^{-1}(\boldsymbol{\mu} - r \cdot \mathbf{1})\),但要归一化到目标风险水平。凯利组合就是切线组合不做归一化的版本,相当于"用多少杠杆就用多少杠杆"。

实操中不会直接用这个公式,因为 \(\boldsymbol{\Sigma}^{-1}\) 在高维度下极不稳定(条件数大,小扰动导致权重剧烈变化)。常见做法:

  1. 用 shrinkage estimator(如 Ledoit-Wolf)修正协方差矩阵
  2. 在权重上加约束(如单资产权重不超过 20%)
  3. 乘以分数凯利(如 1/3)来降低整体杠杆

如果你在做因子组合的仓位分配,多资产凯利提供了一个理论框架:每个因子的权重应该正比于它的超额收益除以它对组合方差的贡献。

import numpy as np

def multi_asset_kelly(mu, cov, r, fraction=0.5):
    """
    多资产凯利权重
    mu: (n,) 各资产预期年化收益率
    cov: (n, n) 收益率协方差矩阵
    r: 无风险利率
    fraction: 凯利分数
    """
    excess = mu - r
    cov_inv = np.linalg.inv(cov)
    kelly_weights = cov_inv @ excess * fraction
    return kelly_weights

# 示例:3个资产
mu = np.array([0.12, 0.08, 0.15])   # 年化收益
sigma = np.array([0.20, 0.15, 0.25]) # 年化波动率
corr = np.array([
    [1.0, 0.3, 0.5],
    [0.3, 1.0, 0.2],
    [0.5, 0.2, 1.0]
])
cov = np.outer(sigma, sigma) * corr
r = 0.05

weights = multi_asset_kelly(mu, cov, r, fraction=0.5)
print("半凯利权重:", np.round(weights, 3))
print("总杠杆:", round(np.sum(np.abs(weights)), 2))

输出:

半凯利权重: [0.441 0.294 0.588]
总杠杆: 1.32

资产 3(超额收益 10%,波动率 25%)获得最高权重 0.588,尽管它波动率最大,但超额收益也最高。资产 2(超额收益 3%,波动率 15%)权重最低。总杠杆 1.32 倍,比单资产凯利温和得多,因为资产间的相关性分散了风险(协方差矩阵求逆隐式地考虑了分散化效应)。

实操注意事项

参数估计误差是最大敌人。 凯利公式假设你知道真实的 \(\mu\) 和 \(\sigma\)。现实中你只有样本估计。\(\mu\) 的估计尤其不靠谱:250 个交易日的样本,\(\mu\) 的标准误差约等于 \(\sigma / \sqrt{250} \approx \sigma / 16\)。年化波动率 20% 的策略,\(\mu\) 的标准误差就是 1.25%。如果你估计的 \(\mu = 15\%\),真实值可能在 12-18% 之间。代入凯利公式,最优仓位可以差一倍。

这和回测陷阱直接相关。如果你在回测中过拟合了参数,\(\mu\) 被高估,凯利公式就会给出过高的仓位,实盘直接被打爆。

永远不要超过凯利仓位。 凯利仓位是增长率为零的边界:在全凯利时增长率最大,超过全凯利增长率开始下降,超过 2 倍凯利增长率变成负数(长期亏钱)。Under-bet 只是增长慢一些,over-bet 到一定程度后长期必亏。这是不对称的。

对数增长率随仓位变化:凯利处为顶点,2 倍凯利处增长率为零

交易成本要从收益里扣。 凯利公式假设无摩擦。如果策略需要频繁调仓,交易成本(佣金、滑点、市场冲击)会吃掉一部分 \(\mu\)。用 \(\mu_{\text{net}} = \mu - \text{交易成本}\) 代入凯利,仓位会变小。这个调整在高频策略里尤其重要。

做空波动率时特别危险。 波动率交易策略里提到过,卖出波动率的收益分布是负偏的(大多数时候小赚,偶尔巨亏)。凯利公式在正态假设下工作最好,对负偏分布会系统性高估最优仓位。卖 VIX 期货的策略,凯利仓位按正态算是一回事,按真实的肥尾分布算又是另一回事。这也是 2018 年 2 月做空波动率基金爆仓的底层原因之一。

凯利是上限,不是目标。 实操中大多数量化基金用 1/4 到 1/2 凯利。牺牲一部分增长速度换取回撤可控和参数鲁棒性。如果你不确定用多少,半凯利是一个合理的起点。

如果你对量化交易的其他基础指标感兴趣,可以参考量化投资常用指标大全