halo 的技术博客

返回

Kelly 公式大概是仓位管理里被引用最多、也被误用最多的一个式子。连续时间近似下它非常紧凑:最优杠杆 f=μ/σ2f^* = \mu / \sigma^2(无风险利率设 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 两头不讨好#

先把三个杠杆数摆出来。牛市参数下 fbull=μb/σb2=8.33f^*_{bull} = \mu_b/\sigma_b^2 = 8.33(理论值,实操会截断);熊市 fbear=1.76f^*_{bear} = -1.76(该做空或至少清仓);用平稳分布(75% 牛 / 25% 熊)加权出的无条件矩算出 funcond=1.23f^*_{uncond} = 1.23

1.23 这个数对牛市严重保守(放弃了大部分增长),对熊市严重激进(在年化 -18%、波动 32% 的环境里还满仓带杠杆)。它不是两个最优解的折中,而是两个错误的平均。 Kelly 的对数效用对「在坏状态里加杠杆」的惩罚是超线性的——熊市里 1.23 倍杠杆吃一次 -6% 的日损失,净值直接 -7.4%,这类日子的复利损耗就是 78% 最大回撤的来源。

条件化的数学形式很直接。设 pt=P(牛市Ft1)p_t = P(\text{牛市} \mid \mathcal{F}_{t-1}) 是基于昨天为止信息的状态概率,则今天收益的条件矩是混合矩:

μt=ptμb+(1pt)μc,σt2=pt(σb2+μb2)+(1pt)(σc2+μc2)μt2\mu_t = p_t\,\mu_b + (1-p_t)\,\mu_c, \qquad \sigma_t^2 = p_t(\sigma_b^2+\mu_b^2) + (1-p_t)(\sigma_c^2+\mu_c^2) - \mu_t^2

状态条件 Kelly 就是 ft=μt/σt2f_t = \mu_t / \sigma_t^2。注意方差公式里的第三项:混合分布的方差不只是方差的加权平均,还要加上「均值不确定」贡献的那一块——p 在 0.5 附近时你不知道自己在哪个状态,这份无知本身就是风险,公式会自动把杠杆压下来。这是条件化框架送的第一份礼物:模糊时刻自动去杠杆,不需要额外的风控规则。

观察者不知道状态:Hamilton 滤波#

真实世界没人给你发牛熊标签,状态必须从收益率里实时推断。两状态高斯混合下这是标准的 Hamilton 滤波(1989),每天两步:

两个实现细节。第一,杠杆必须用滞后概率ptp_t 依赖 t 日收益,用它决定 t 日仓位是 look-ahead,回测直接作废。第二,截断不是可选项:纯牛市概率下公式给 8.3 倍杠杆,那是「参数完全正确 + 连续调仓 + 无跳空」的理论产物,任何一条不成立都足以爆仓;本实验统一截断到 [0, 2]。

滤波效果:60 年里 90 次状态切换,逐日判断准确率 97.1%。但准确率是个宽容的指标,真正的成本在切换识别延迟——切换发生后滤波概率越过 0.5 需要中位数 3 天、均值 3.4 天、90 分位 6 天。也就是说每次入熊,你平均要用牛市杠杆硬扛 3 天熊市收益。这份延迟成本已经如实计入下面所有回测数字。

Hamilton 滤波与动态杠杆

识别延迟分布

60 年对决#

五个策略同一份数据,全部杠杆截断 [0, 2],滞后一天执行:

策略年化对数增长最大回撤Sharpe
买入持有2.6%69%0.14
无条件 Kelly(f=1.23)2.7%78%0.12
状态条件 Kelly10.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 最著名的软肋是对 μ 的估计误差极度敏感——μ 通常要几十年数据才能估准,而 ff^* 对 μ 是线性放大。把熊市年化均值故意估错 ±15 个百分点(真值 -18%,扫描 -33% 到 -3%):

熊市均值误差(年化)状态条件 Kelly无条件 Kelly
-15 pp10.2%0.8%
-5 pp10.2%2.5%
010.2%2.7%
+5 pp10.2%2.4%
+15 pp10.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 公式本身没有错,错的是喂给它的分布。把「市场是一个分布」升级成「市场是几个分布的马尔可夫混合」,同一个公式的输出质量完全不同——仓位管理的进步往往不在公式,在条件信息集

状态条件 Kelly:把 regime 概率写进最优杠杆
https://blog.halo26812.eu.org/blog/regime-conditional-kelly
Author halo
Published at 2026年7月27日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨