状态条件 Kelly:把 regime 概率写进最优杠杆
经典 Kelly 公式 f*=μ/σ² 用无条件均值方差算一个常数杠杆,但市场不是一个分布——牛市(年化 +12%/12%)和熊市(-18%/32%)的最优杠杆一个是 +8.3 一个是 -1.8,无条件 Kelly 的 1.23 对两个状态都是错的。两状态马尔可夫市场模拟 60 年实测:无条件 Kelly 年化对数增长仅 2.7%、最大回撤 78%;用 Hamilton 滤波实时推断 regime 概率、按混合矩重算杠杆的状态条件 Kelly 达 10.2%、回撤 57%,距全知作弊上限(11.3%)只差一个百分点。更被低估的红利是稳健性:熊市均值估错 ±15 个百分点,状态条件 Kelly 增长率几乎不动(10.1-10.3%),无条件 Kelly 从 2.7% 掉到 0.8%——条件化不仅赚增长,还买了参数误差保险。附滤波识别延迟分布(中位数 3 天、90 分位 6 天)、杠杆上限截断的必要性、以及真实市场里 regime 参数本身要估计的 EM/贝叶斯讨论(中阶)。
Kelly 公式大概是仓位管理里被引用最多、也被误用最多的一个式子。连续时间近似下它非常紧凑:最优杠杆 (无风险利率设 0),投入这个比例,长期对数增长率最大。问题出在那两个希腊字母上——μ 和 σ 是谁的 μ 和 σ? 教科书默认是「市场的」,一个数。但市场不是一个分布:牛市和熊市的均值符号相反、波动差近三倍,用全样本平均出来的 μ/σ² 算杠杆,等于给两个完全不同的赌局下同一个注。
结论先放这:把 regime 概率写进 Kelly,增长率和稳健性同时改善,且改善幅度大到不像是免费的。两状态马尔可夫市场(牛:年化 +12%/12%,熊:-18%/32%,牛市平均持续一年、熊市四个月)模拟 60 年实测:无条件 Kelly 年化对数增长只有 2.7%、最大回撤 78%;用 Hamilton 滤波实时推断状态概率、按条件矩重算杠杆的状态条件 Kelly 做到 10.2%、回撤 57%——距离「每天都知道真实状态」的作弊上限(11.3%)只差一个百分点。更反直觉的发现在参数误差实验里:熊市均值估错 ±15 个年化百分点,状态条件 Kelly 的增长率几乎纹丝不动,无条件 Kelly 却从 2.7% 跌到 0.8%。
为什么无条件 Kelly 两头不讨好#
先把三个杠杆数摆出来。牛市参数下 (理论值,实操会截断);熊市 (该做空或至少清仓);用平稳分布(75% 牛 / 25% 熊)加权出的无条件矩算出 。
1.23 这个数对牛市严重保守(放弃了大部分增长),对熊市严重激进(在年化 -18%、波动 32% 的环境里还满仓带杠杆)。它不是两个最优解的折中,而是两个错误的平均。 Kelly 的对数效用对「在坏状态里加杠杆」的惩罚是超线性的——熊市里 1.23 倍杠杆吃一次 -6% 的日损失,净值直接 -7.4%,这类日子的复利损耗就是 78% 最大回撤的来源。
条件化的数学形式很直接。设 是基于昨天为止信息的状态概率,则今天收益的条件矩是混合矩:
状态条件 Kelly 就是 。注意方差公式里的第三项:混合分布的方差不只是方差的加权平均,还要加上「均值不确定」贡献的那一块——p 在 0.5 附近时你不知道自己在哪个状态,这份无知本身就是风险,公式会自动把杠杆压下来。这是条件化框架送的第一份礼物:模糊时刻自动去杠杆,不需要额外的风控规则。
观察者不知道状态:Hamilton 滤波#
真实世界没人给你发牛熊标签,状态必须从收益率里实时推断。两状态高斯混合下这是标准的 Hamilton 滤波(1989),每天两步:
import numpy as np
from scipy import stats
# 已知参数:mu_b, sig_b(牛), mu_c, sig_c(熊), 转移概率 p_bb, p_cc
lik_b = stats.norm.pdf(r, mu_b, sig_b) # 每天收益在两个状态下的似然
lik_c = stats.norm.pdf(r, mu_c, sig_c)
p_bull = np.empty(n)
prior = pi_stationary # 初始用平稳分布
for t in range(n):
if t > 0: # 预测步:昨天的后验推今天的先验
prior = p_bull[t-1] * p_bb + (1 - p_bull[t-1]) * (1 - p_cc)
num = prior * lik_b[t] # 更新步:贝叶斯
p_bull[t] = num / (num + (1 - prior) * lik_c[t])
# 杠杆用滞后一天的概率算(信号在 t-1 收盘确认,t 日执行)
p_lag = np.concatenate([[pi_stationary], p_bull[:-1]])
mu_mix = p_lag * mu_b + (1 - p_lag) * mu_c
var_mix = p_lag * (sig_b**2 + mu_b**2) + (1 - p_lag) * (sig_c**2 + mu_c**2) - mu_mix**2
leverage = np.clip(mu_mix / var_mix, 0.0, 2.0) # 截断:禁止做空、上限 2 倍python两个实现细节。第一,杠杆必须用滞后概率: 依赖 t 日收益,用它决定 t 日仓位是 look-ahead,回测直接作废。第二,截断不是可选项:纯牛市概率下公式给 8.3 倍杠杆,那是「参数完全正确 + 连续调仓 + 无跳空」的理论产物,任何一条不成立都足以爆仓;本实验统一截断到 [0, 2]。
滤波效果:60 年里 90 次状态切换,逐日判断准确率 97.1%。但准确率是个宽容的指标,真正的成本在切换识别延迟——切换发生后滤波概率越过 0.5 需要中位数 3 天、均值 3.4 天、90 分位 6 天。也就是说每次入熊,你平均要用牛市杠杆硬扛 3 天熊市收益。这份延迟成本已经如实计入下面所有回测数字。


60 年对决#
五个策略同一份数据,全部杠杆截断 [0, 2],滞后一天执行:
| 策略 | 年化对数增长 | 最大回撤 | Sharpe |
|---|---|---|---|
| 买入持有 | 2.6% | 69% | 0.14 |
| 无条件 Kelly(f=1.23) | 2.7% | 78% | 0.12 |
| 状态条件 Kelly | 10.2% | 57% | 0.47 |
| 半状态 Kelly(f_t × 0.5) | 10.1% | 57% | 0.47 |
| 全知 Kelly(作弊上限) | 11.3% | 60% | 0.54 |

四个读法。第一,无条件 Kelly 和买入持有几乎打平(2.7% vs 2.6%),回撤反而更深——「最优」杠杆没带来任何增长优势,因为它的最优性建立在「收益 iid 同分布」这个被 regime 结构公然违反的前提上。第二,条件化的增长差距是 7.5 个百分点年化,60 年复利下来是净值差两个数量级;来源不神秘:熊市平均把杠杆压到 0 附近(滤波概率图下半部分清晰可见),躲过了复利最怕的深坑。第三,滤波版距全知版只差 1.1 个百分点——97% 的准确率加 3 天延迟,只吃掉了条件化红利的一小部分;信息论上讲,regime 信号的价值大头在「大方向对」,不在「零延迟」。第四,半 Kelly 几乎不亏增长(10.1% vs 10.2%)——对数增长在最优杠杆附近是平顶抛物线,砍一半杠杆只损失顶点附近的一点点曲率,却把所有参数误差的安全边际翻倍。实务上无条件推荐半状态 Kelly。
真正被低估的红利:参数误差保险#
Kelly 最著名的软肋是对 μ 的估计误差极度敏感——μ 通常要几十年数据才能估准,而 对 μ 是线性放大。把熊市年化均值故意估错 ±15 个百分点(真值 -18%,扫描 -33% 到 -3%):
| 熊市均值误差(年化) | 状态条件 Kelly | 无条件 Kelly |
|---|---|---|
| -15 pp | 10.2% | 0.8% |
| -5 pp | 10.2% | 2.5% |
| 0 | 10.2% | 2.7% |
| +5 pp | 10.2% | 2.4% |
| +15 pp | 10.3% | 1.6% |

状态条件 Kelly 的增长率在整个误差区间里几乎是一条水平线,无条件 Kelly 却对同一个误差敏感得多。原因值得想清楚:熊市里条件 Kelly 给出的原始杠杆本来就是负的,被 [0, 2] 截断压在 0 上——熊市均值再怎么估错,杠杆反正是 0,错误进不了组合;而无条件 Kelly 把熊市均值揉进全局平均,误差直接污染那个全天候使用的常数杠杆。条件化 + 截断的组合等于给参数误差上了一道结构性绝缘。这比「多赚 7 个点」更重要:增长率是模拟里的承诺,稳健性才是实盘里的现金。
诚实的边界#
本实验的参数是上帝视角。 滤波时用了真实的 μ、σ、转移概率——真实世界里这些全要从数据估计(EM 算法或贝叶斯 MCMC),而 regime 参数的估计误差比 iid 参数更凶:熊市样本天然稀少(本设定下只占 25%),熊市均值的标准误大得惊人。参数估计误差会把「距作弊上限 1.1 pp」的差距进一步拉开,但参数误差实验表明条件化框架对此有相当的容忍度。
两状态高斯是玩具。 真实市场的 regime 更像连续谱而非二值开关,状态数选择本身就是模型风险(三状态?波动 regime 和均值 regime 分开?)。好消息是框架是通用的:滤波概率换成任何状态推断器(HMM、变点检测、甚至宏观指标打分),混合矩公式照用。
切换瞬间依然裸奔。 3 天的中位识别延迟意味着每次入熊要硬吃几天熊市收益,且这几天恰恰是波动最大的日子。跳跃式崩盘(一天 -10%)里滤波再快也来不及——这是所有基于日频推断的仓位系统的共同宿命,解法在框架外:尾部对冲或恒定的深尾资本预留。
交易成本未建模。 状态条件杠杆在概率模糊期会频繁小幅调仓,本实验零成本假设下这是免费的,实盘要加调仓带宽(比如杠杆变动小于 0.2 不动手),会轻微侵蚀增长差距但不改变结论量级。
Kelly 公式本身没有错,错的是喂给它的分布。把「市场是一个分布」升级成「市场是几个分布的马尔可夫混合」,同一个公式的输出质量完全不同——仓位管理的进步往往不在公式,在条件信息集。