Kelly 仓位:按波动率的整个区间计算,而不是一个数
数据:2026-09-30 收盘时从本站数据供应商记录的 50ETF、300ETF 与中证1000股指期权(IM)期权链;同一收盘的 47 个看板推荐。区间宽度来自波动率预测研究(通过 AKShare 获取的 QVIX 波动率指数,2015 年以来每个已结束的到期月)。
Kelly 不再假设实现波动率事先已知。 它现在对实现波动率实际可能落入的区间取平均:预测值上下约 ±25 %,且偏高一侧比偏低一侧略重。大多数卖权利金的交易仓位变小;买波动率的交易和 debit spread(借方价差)略微变大。
- ±25 %:预测值周围的区间(对数离散度 0.253),每个期限都一样。对 25 % 的预测,到期前的实现波动率有五分之四的时间落在约 17 % 到 35 % 之间。
- 0.68×:铁鹰式(iron condor)的 Kelly 比例中位数,相对于只用一个数计算(看板上 11 个铁鹰式)。
- 25 / 22:仓位变大 / 变小的看板推荐(共 47 个可交易推荐)。
- 0.148 → 0:中证1000股指期权(IM)上一个深度 out-of-the-money(OTM,虚值)的 bull put spread(牛市看跌价差)。它在整个区间上的期望值为负,所以 Kelly 不下注。
- +10 %:看板上每 ¥100 万的合约数(1,368 → 1,505)。
不变的部分:expected value(EV,期望值)、评分、成本检查,以及每张卡片上的优势期望值(edge EV)。变化的只有 Kelly 比例、半 Kelly 仓位、合约数和评级。
Kelly 仓位是什么,为什么只用一个数会下注过多
Kelly criterion(凯利公式)选出投入风险的资金比例,使财富长期增长最快。对一笔期权交易来说,押上的是它的最大亏损:投入组合的比例 f,就是买入 f × 组合 / 最大亏损 张合约。Kelly 在到期时所有可能的结果上,最大化对数增长的期望:
f* = argmax over f in [0, 1) of Σ probability_i × log(1 + f × P&L_i / max loss)
本站把这个满仓比例显示为评级(10 % 起为 strong(强),2 % 起为 moderate(中),以下为 marginal(弱)),并建议取一半,且每笔不超过组合的 5 %,因为满仓 Kelly 对输入的误差非常敏感。
各个结果的概率来自到期价格的分布,而这个分布最主要取决于一个数:标的实际会波动多少,即 realised volatility(RV,实现波动率)。本站的预测是 0.95 × at-the-money(ATM,平值)implied volatility(IV,隐含波动率)(原因;本研究进行时是 IV 减去 1 个波动率点的长期溢价,原因)。以前,Kelly 给每笔交易定仓位时都假设这个预测完全准确。
但它并不准。波动率预测研究测量了实现波动率离这类预测有多远:高或低四分之一都很常见。而这个误差的影响并不对称。信用价差(credit spread)在波动率平静时赚得少,不平静时亏得多,所以只按区间中心定仓位会下注过多。
Kelly 现在使用的区间
log RV ~ Normal( log c − s²/2 , s² ), s² = 0.064 → s = 0.253
区间上半部分:离散度 × 1.143
- c 是定仓位用的波动率:0.95 × ATM IV(本研究进行时为 ATM IV − 1 个点),或交易者自己的波动率观点向市场收缩一半后的值。
- c 是区间的均值。 −s²/2 的平移让平均结果落在预测值上,因为预测本身是按平均值拟合的(IV 均值减 RV 均值)。数据在每个窗口长度上都支持这一点。
- 每个期限宽度都一样。 研究测得的离散度混了两样东西。一是真正的不确定性:市场比预期更平静或更剧烈,这会改变期权收益。二是测量噪声:几天的实现波动率只由几次日波动算出,就像只抛五次硬币来判断它是否公平。五天里,真实 13 % 的波动率有五分之四的时间会被测成约 9 % 到 20 % 之间的任何值。这种噪声不会改变价格最终能走多远,而期权收益只看这个,所以区间只保留真实的部分。一个更早、更宽的版本把噪声也算了进去(5 天时离散度 0.49),会让短期交易被当作市场比实际不确定一倍来定仓。
- 更重的高波动一侧(尾部折扣,tail haircut)。 区间上半部分加宽 14 %,使 7.5 % 的结果落在原区间第 95 百分位之上,而不是 5 %。近几年实际是 6–9 %,而对卖权利金的一方,那正是亏钱的一侧。加上它之后,区间均值比 c 高约 2 %。

15 % 预测的区间在每个期限都一样。橙色点线是同时计入测量噪声的早期版本。
Kelly 如何使用这个区间
- 取期权链的 smile(波动率微笑,每个行权价一个隐含波动率),把它转换成到期价格的分布,并缩放到平值波动率等于预测值 c。
- 在实现波动率的区间上取 32 个点,中位数两侧各 16 个,并附上概率权重(每一半各用一组 Gauss quadrature,即高斯求积,所以中位数处的折点能精确处理)。
- 在每个点上,把价格分布拉伸到该波动率:每个对数收益乘以 σ点 / c。微笑的偏斜和厚尾保持原有形状。
- 把 32 个分布按各自的概率加权合在一起,求出在所有分布上同时让对数增长期望最大的同一个 Kelly 比例。
这不是 32 个单独 Kelly 比例的平均。Kelly 回答的是:不知道自己身处哪一种情形时,哪一个仓位让财富增长最快?在高波动情形里亏损会急剧放大的交易,得到的答案更小。跨到期月的交易(如日历价差)仍和以前一样按市场 IV 定仓。
2026-09-30 收盘的十个推荐
真实期权链,记录于 2026-09-30 收盘。除 IM 深度虚值牛市看跌价差是按报价手工构造外,其余都是优化器自己的推荐(中等风险偏好);全部通过成本检查。腿的写法:+ 买入,− 卖出,P 看跌,C 看涨;IM 的行权价是指数点位。两个买波动率的推荐假设交易者的观点为 ATM IV + 5 个点,按一半可信度定仓。
| 推荐 | 腿 | 剩余交易日 | 满仓 Kelly,单个数 | 满仓 Kelly,整个区间 | 半 Kelly 仓位(上限 5 %) | 每 ¥100 万合约数 | 评级 |
|---|---|---|---|---|---|---|---|
| 50ETF 牛市看跌价差 | +2.7P −2.9P | 15 | 0.148 | 0.119 | 5.0 % | 28 | strong |
| 300ETF 熊市看涨价差(bear call) | −4.5C +4.9C | 15 | 0.196 | 0.130 | 5.0 % | 13 | strong |
| 300ETF 铁鹰式 | +4.2P −4.3P −4.5C +5C | 15 | 0.331 | 0.226 | 5.0 % | 11 | strong |
| IM 铁鹰式 | +6700P −7000P −8000C +8200C | 7 | 0.098 | 0.018 | 0.9 % | 1 | moderate → marginal |
| IM 铁蝶式(iron butterfly) | +6700P −7300P −7300C +7900C | 7 | 0.072 | 0.087 | 4.3 % | 1 | moderate |
| 300ETF 卖出看跌(short put) | −4.3P | 15 | 0 | 0 | 0 | 0 | 风险无上限 |
| 50ETF 跨式多头(long straddle,观点 18.8 %) | +2.9C +2.9P | 15 | 0.172 | 0.179 | 5.0 % | 58 | strong |
| IM 宽跨式多头(long strangle,观点 30.9 %) | +7200P +7400C | 7 | 0.064 | 0.070 | 3.5 % | 2(原为 1) | moderate |
| IM 牛市看跌价差,深度虚值 | −6800P +6200P | 7 | 0.148 | 0 | 0 | 0(原为 1) | strong → negative |
| IM 牛市看跌价差,近平值 | +6500P −7100P | 7 | 0.086 | 0.072 | 3.6 % | 1 | moderate |
当日定仓位用的波动率:12.81 %(50ETF)、15.71 %(300ETF)、24.88 %(IM),两个买波动率观点为 16.31 % / 28.38 %。前三者的 80 % 区间:9.0–18.0 %、11.0–22.0 %、17.4–34.9 %。
合约数几乎不变:只要满仓 Kelly 达到 0.10,5 % 的上限就会起作用;而一张 IM 合约本身就占 ¥100 万的 1.7–5.8 % 风险。真正传递信号的是比例和评级。

在整个波动率区间上的 Kelly,每个推荐一个小图。点击图片查看原尺寸。
为什么有的交易变大,有的变小
对波动率取平均,会通过两个效应改变一笔交易的 Kelly 比例。一是期望值随波动率变化的弯曲:向上弯的价值曲线会从不确定性中获益。二是结果更分散,而对数增长不喜欢分散。由于高波动一侧更重,对大多数卖方来说第二个效应占上风。
- 铁鹰式和深度虚值价差缩小得最多。 一旦高波动把价格推过卖出的行权价,亏损就会加速,而更重的上半部分正好加重了这些结果。IM 深度虚值牛市看跌价差的期望值从预测值处的每张 +¥160 变成整个区间上的 −¥27,所以仓位为 0。
- 近平值信用价差缩小得较少(IM 近平值牛市看跌价差 0.086 → 0.072,50ETF 牛市看跌价差 0.148 → 0.119)。它们的亏损有上限,限制了高波动一周里的损害。
- 铁蝶式和借方价差可能变大(IM 铁蝶式 0.072 → 0.087)。在预测值附近,它们的价值随波动率向上弯。
- 跨式和宽跨式多头略微变大:它们在更重的高波动一侧赚钱。
- 裸卖期权风险无上限,所以在考虑任何区间之前,Kelly 就把它定为 0。
更新,2026-10-09。 本站现在把净卖出看跌(short put)视为亏损有上限:标的跌到零时亏损就停止。它有自己的“下行风险大”Kelly 结论,仓位由每笔 5 % 的上限决定,而不是由 Kelly 比例决定。只有净卖出看涨仍然风险无上限。上面的 300ETF 卖出看跌一行及其图是在这一改动之前算出的。
对看板的影响
在 2026-09-30 收盘数据上重放标准看板请求(六个标的,所有剩余至少 14 天的月份,中等风险偏好):47 个可交易推荐(通过成本检查且风险有限)。
| 定仓方式 | strong | moderate | marginal | negative | 每 ¥100 万合约数 |
|---|---|---|---|---|---|
| 单个数(以前) | 16 | 30 | 1 | 0 | 1,368 |
| 整个区间(现在) | 21 | 21 | 5 | 0 | 1,505 |
25 个推荐变大,22 个变小;没有一个降到零。按结构看,现在与以前比例的中位数:铁鹰式 0.68,牛市看跌价差 0.86,熊市看涨价差 0.91,铁蝶式 1.00,牛市看涨价差 1.14,蝶式 1.22,熊市看跌价差 1.33。

每个点是一个看板推荐:以前的 Kelly 比例(横轴)对比现在的(纵轴)。左:本站使用的区间。右:早期版本,仅供对比。
局限与注意事项
- 大部分缩小来自尾部折扣。 如果没有它,单靠区间本身,ETF 卖波动率推荐的变化不到 10 %。尾部折扣基于 27 个到期月(近期有 6–9 % 的结果高于第 95 百分位,全部历史上是 4.6 %),所以它是有意留出的安全边际,而不是测量出的事实。
- 区间的中心放在哪里最关键。 预测是按实现波动率的均值拟合的。如果把它当作中位数,区间均值会抬高,所有卖波动率的推荐仓位都会降到接近零。
- 宽度是在 QVIX(波动率指数)上拟合,再用到平值 IV 上的,只有 27 个到期月和一次压力事件(2024 年 9 月的行情)。随着更多到期月结束,宽度、溢价和尾部折扣都会重新拟合。
- 分布如何加宽是一个建模选择。 每个点拉伸的是预测微笑的对数收益,保留偏斜。另一种做法是在每个点用缩放后的 IV 重建微笑,试过后发现不收敛,而且仓位会更大。
- 只是一天的收盘。 十个推荐和看板重放都是同一时点的快照。效应的方向是结构性的,具体数字不是。
- Kelly 的好坏取决于它的概率。 即使在区间上取平均,它也假设这个区间是对的。这就是本站建议半 Kelly 并设 5 % 上限的原因。
自己复现
脚本 kelly_range.py(见下方下载)是定仓计算的独立副本:预测、带尾部折扣的区间、32 点求积、从微笑到分布的转换,以及混合分布上的对数最优 Kelly 比例。只需要 numpy 和 scipy。
输入。 区间只需要定仓位用的波动率。给一笔交易定仓需要一条期权链:远期价格、距到期的交易日数、每个行权价一个隐含波动率,以及各条腿和它们的成交价。区间的参数(0.064、1 个点的溢价和 7.5 % 的尾部目标)来自波动率预测研究和溢价回测,它们用的是公开数据:QVIX 波动率指数(AKShare index_option_50etf_qvix 等同类函数,自 2015-02-09 起)和新浪 ETF 收盘价。
区间与求积点:
def forecast_range(centre, sd=0.253, tail=True, nodes=31):
median = centre * exp(-0.5 * sd * sd) # c 是均值
if tail: # 每一半 16 个高斯点
u, wu = half_range_rule((nodes + 1) // 2) # 半正态求积
z = concatenate([-u[::-1], u * TAIL_K]) # 上半部分 x 1.143
w = concatenate([wu[::-1], wu]) / 2.0
else:
z, w = hermegauss(nodes); w = w / w.sum()
sigmas = clip(median * exp(sd * z), 0.01, 5 * centre)
return sigmas, w
混合分布上的 Kelly:
point = market.scaled(centre / atm_iv) # 微笑缩放到预测值
pnls, weights = [], []
for sigma_k, w_k in zip(sigmas, w):
node = point.return_scaled(sigma_k / centre) # 拉伸对数收益
pnls.append(node.pnl(legs)) # 到期每股盈亏
weights.append(w_k * node.masses)
f = log_optimal_fraction(concatenate(pnls), concatenate(weights), max_loss)
half_kelly = min(f / 2, 0.05)
log_optimal_fraction 求 Σ w × log(1 + f × 盈亏 / 最大亏损) 的斜率为零时的 f(斜率严格递减,所以用区间求根即可);期望盈亏不为正时返回 0。
运行方法:
pip install -r requirements.txt # 或:pip install numpy scipy
python kelly_range.py # 区间 + 一条模拟的 50ETF 式期权链
python kelly_range.py --centre 0.25 # 某个定仓波动率的区间
python kelly_range.py --chain my_chain.json # 你自己的期权链和腿
你应该看到什么。 区间部分会精确打印上文引用的 80 % 区间:12.81 % → 9.0–18.0 %,15.71 % → 11.0–22.0 %,24.88 % → 17.4–34.9 %,区间均值比定仓波动率高 2.0 %。默认运行随后在一条模拟期权链上(远期 3.05,15 个交易日,ATM IV 14 %,看跌偏斜,每条腿两个最小价位的买卖价差成本)给三笔交易定仓,规律与真实推荐相同:近平值牛市看跌价差 0.128 → 0.116,深度虚值牛市看跌价差 0.326 → 0,铁鹰式 0.177 → 0.084。每笔还会打印“假如波动率固定”的 Kelly 曲线。
如何验证。 十个推荐的表格需要记录下来的 2026-09-30 期权链,它们来自商业数据供应商,不能再分发,所以默认运行改用模拟期权链。在记录的期权链上,脚本算出的 Kelly 比例与本站自己的定仓代码相差不超过 1e-9,并且对检查的六个推荐(单个数和整个区间两种定仓都检查:50ETF 牛市看跌价差、300ETF 熊市看涨价差和铁鹰式、IM 铁鹰式、两个 IM 牛市看跌价差)逐位复现了表中印出的所有小数。区间的点和权重与本站一致到 1e-14。每当本站的定仓代码变化,自动化测试都会重新检查这些结果。
下载脚本
独立的 Python 脚本,只使用公开数据(AKShare)。先安装 requirements.txt 中的依赖,再运行脚本。