用过去的波动率预测,比 implied volatility 更准吗?
数据:六只有上市期权的 exchange-traded fund(ETF,交易所交易基金):50ETF、300ETF、500ETF、创业板ETF、科创50ETF、深100ETF;135 个日期上的 387 个样本,2015-05-11 至 2026-08-10,最后一个窗口在 2026 年 9 月结束。来源:新浪日收盘价与 QVIX 波动率指数,均通过 AKShare 获取。
不会。 预测下个月的已实现波动率,最好的方法是用市场的 implied volatility(IV,隐含波动率)减去一个小而稳定的溢价,约 1 个 vol point(波动率点)。把近期的已实现波动率加进去(很多工具以及本 App 以前都这样做),预测并不会更准。
- ≈ 1 点:平均溢价,即 at-the-money(ATM,平值)IV 比随后实际波动高出多少。
- 3.2 点里只兑现 0.6 点:当“IV 高于近期波动”发出卖出信号时,声称有 3.2 点优势,实际只兑现约 0.6 点。
- 27 %:“IV 便宜”这个想法(近期波动高于 IV,所以买入波动率)成立的比例。
- −0.2 点:2026 年至今的溢价。今年没有溢价可赚。
问题是什么
每个期权策略的期望值都取决于一个数:标的到期前实际会波动多少,即 realised volatility(RV,已实现波动率)。市场自己的估计就是期权价格里隐含的 IV。一个常见的捷径是用过去几个月的 RV 预测下个月:
forecast = IV − average(IV − RV 30d, IV − RV 60d, IV − RV 90d)
= 过去 30、60、90 天已实现波动率的平均值
式子里的 IV 会互相抵消,所以这个预测其实是“下个月和过去一到三个月一样”,完全没有用到市场当前的定价。IV − RV 这个差就是 volatility risk premium(VRP,波动率风险溢价):期权卖方承担波动率飙升风险、平均能收到的补偿。
检验方法:在过去的每个日期,把几种预测和随后 30 天的实际已实现波动率比较。
- Trailing RV(过去的已实现波动率):上面的 30、60、90 天 RV 平均值。
- Implied volatility:公开的 QVIX 指数(类似 VIX 的 30 天波动率指数,包含 skew(波动率偏斜),比 ATM IV 高 1–3 点),以及一个更接近期权链上平值 IV 的版本。
- 混合预测:IV 和 trailing RV 各占一半;以及 IV 减去长期平均溢价(只用当时已经结束的窗口来估计,从不看到未来)。
样本落在同一组相隔至少 30 个自然日的日期上,所以任意两个 30 天窗口都不重叠。

50ETF:两种预测与随后实际波动的对比,每个互不重叠的 30 天样本一个点。
哪种预测最准?
典型误差用 root mean square error(RMSE,均方根误差)衡量,单位是 vol point(1 点 = 0.01 年化波动率),六只 ETF 合并计算,越低越好。Bias(偏差)是(实际 − 预测)的平均值:为负表示预测偏高。
| 预测 | 样本 | bias | RMSE | 对数误差 sd |
|---|---|---|---|---|
| trailing RV(30/60/90 天平均) | 387 | −0.1 | 10.81 | 0.424 |
| QVIX | 387 | −2.7 | 9.98 | 0.370 |
| QVIX 的平值 IV 版本 | 387 | −1.1 | 9.65 | 0.373 |
| IV 与 trailing RV 各半 | 387 | −1.4 | 10.03 | 0.385 |
| IV − 长期溢价(样本外) | 363 | +0.4 | 9.69 | 0.388 |
- 所有基于 IV 的预测都比 trailing RV 准。 把日期网格平移 0 到 20 个交易日得到 21 个版本,QVIX 的 RMSE 在全部 21 个版本里都更低。
- 单独的 IV 偏高,偏高的部分就是溢价,但它的信息更充分(对数误差更集中)。Trailing RV 没有偏差,但噪声更大。
- 差距不大:每种方法的典型误差都在 10 点左右。无论用什么方法,下个月的波动率都很难预测。
- 统计上(用 Diebold–Mariano 检验逐日比较两个预测的平方误差),平值版本、IV − 溢价和各半混合都明显优于 trailing RV(t 值 2.2–2.5)。原始 QVIX 单独对比 trailing RV 不显著(t 1.5)。
溢价到底有多大?
溢价 = IV 减去随后的实际波动率:期权卖方在尾部亏损之前平均能收到的部分。
| IV 口径 | 均值 | 中位数 | 为正的月份 | sd(standard deviation,标准差) | 最差 5 % 均值 |
|---|---|---|---|---|---|
| QVIX(含 skew) | +2.7 | +4.6 | 75 % | 9.6 | −25.6 |
| 平值 IV | +1.1 | +3.0 | 70 % | 9.6 | −27.1 |
按年份的 QVIX 溢价(vol point;2015–2019 年只有 50ETF):
| 年份 | 月数 | 均值 | 为正的月份 | 最差 5 % 均值 |
|---|---|---|---|---|
| 2015 | 8 | +0.87 | 62 % | −23.86 |
| 2016 | 12 | +8.20 | 100 % | +1.30 |
| 2017 | 12 | +1.81 | 83 % | −8.44 |
| 2018 | 12 | +1.46 | 67 % | −11.89 |
| 2019 | 12 | +3.64 | 83 % | −15.05 |
| 2020 | 24 | +1.78 | 75 % | −24.34 |
| 2021 | 24 | +2.99 | 79 % | −6.73 |
| 2022 | 30 | +2.78 | 73 % | −8.91 |
| 2023 | 67 | +3.95 | 85 % | −3.70 |
| 2024 | 72 | +1.73 | 71 % | −43.61 |
| 2025 | 66 | +4.22 | 79 % | −18.95 |
| 2026 | 48 | −0.16 | 52 % | −17.60 |
- 典型的月份卖方能赚 3–5 点(中位数)。平均值更低,是因为少数月份非常惨烈:2015 年股灾、2020 年 2 月,以及 2024 年 9 月的刺激政策行情,那次创业板ETF 的实际波动比 IV 高出 59 点。
- 每月的优势与噪声之比约为 1.1 / 9.6 ≈ 0.1。卖方大多数月份都赢,但一个月就可能亏掉一年的溢价。
- 2026 年是样本中最弱的一年:平均 −0.2,只有 52 % 的月份为正。
- 在 IV 处于过去一年最便宜的 20 % 时卖出,是最平稳的交易:平均 +3.7,86 % 的月份为正,sd 4.8。
“卖出”和“IV 便宜”信号有效吗?
一个流行的规则把 IV − trailing RV 当作优势:为正就是“IV 偏贵,卖出波动率”,为负就是“IV 便宜,买入波动率”。平值 IV 口径(vol point;买入的几行按买方计算优势):
| 规则 | 月数 | 命中率 | 实际兑现 | 声称的优势 |
|---|---|---|---|---|
| 每月都卖出,不看信号 | 387 | 70 % | +1.1 | — |
| trailing RV < IV 时卖出 | 262 | 68 % | +0.6 | 3.2 |
| “IV 偏贵”区间卖出 | 87 | 71 % | +3.0 | 1.5 |
| trailing RV > IV 时买入波动率(“IV 便宜”) | 125 | 27 % | −2.1 | 3.6 |
| “IV 便宜”区间买入波动率 | 46 | 26 % | −1.5 | — |
信号越大,兑现的溢价是否越多?
| 信号(IV − trailing RV) | 月数 | 实际溢价 |
|---|---|---|
| 低于 −3 | 55 | +3.43 |
| −3 到 0 | 70 | +0.97 |
| 0 到 3 | 155 | +0.35 |
| 3 到 6 | 81 | +0.80 |
| 6 及以上 | 26 | +1.57 |
- 卖出信号没有判断力。 它的胜率和每月都卖一样,溢价反而更小。它声称约 3 点优势,实际只兑现约 0.6 点。
- 波动率飙升之后,trailing RV 会高估下个月。 当 trailing RV 比 IV 高出 3 点以上时,随后的实际波动有 75–85 % 的时间低于 IV,样本中每一次飙升都是如此,不是某一次的特例。所以信号最负的那一组,溢价反而最大。
- “IV 便宜”押错了方向。 按这个想法买入波动率,每月亏 2–4 点。
近期波动率应该占多大权重?
把下个月的波动率拟合为 w·IV + (1 − w)·trailing RV。留给 trailing RV 的权重 1 − w,就是预测应该相信近期波动的程度。
| 样本 | IV 权重 | trailing RV 权重 | 95 % 区间(RV 权重) |
|---|---|---|---|
| 全部 ETF,QVIX | 0.79 | 0.21 | −0.22 … 0.59 |
| 全部 ETF,平值 IV | 1.00 | 0.00 | −0.50 … 0.47 |
- 加入常数项后,拟合结果为 下个月波动率 ≈ 1.03 × IV − 2.8 点(QVIX 口径)。也就是 IV 减一个常数,trailing RV 项消失了。
- QVIX 的权重低于 1,只是因为 RV 项吸收了 QVIX 较大的溢价。把 QVIX 下移 1.5–2 点(大约是平值 IV 的位置),权重就变成 1.0。
- 数据支持的 trailing RV 权重是 0–0.2,而不是“折中取一半”规则用的 0.5。
最佳预测会错多少? IV − 溢价的对数误差离散度约为 0.39(大约 ±39 %),且偏向上方:log(实际 / 预测) 的第 5 和第 95 百分位是 −0.49 和 +0.71。以 20 % 的预测为例,下个月通常落在 14 % 到 29 % 之间。大约每 100 个月有 1 个月的实际波动达到预测的 3.4 倍(最严重的是 2024 年 9 月行情,4.1 倍);没有一个月低于预测的约 0.3 倍。
App 据此做了什么
- 波动率预测改为 ATM IV − 1 点,所有标的通用,用于策略评分、成本检查(“优势期望值”)和 Kelly criterion(凯利公式)仓位。它只需要当天的 IV,所以即使已实现波动率数据缺失,优势也不会被关掉。2026 年 10 月更新:后续研究发现溢价随 IV 增大,预测现在是 0.95 × ATM IV(IV 为 15 % 时减 0.75 点,30 % 时减 1.5 点)。
- VRP 卡片把 IV − trailing RV 作为历史显示,而不是优势,旁边给出预测值。
- “IV 便宜”的买入波动率提醒已移除。
- Kelly 按预测的误差范围计算仓位,而不是只用一个数字。这个范围有多宽、在短期限上如何变化,见波动率预测研究和按波动率区间计算 Kelly。
局限与注意事项
- 独立样本约 135 个月,不是 387 个。 2020 年之前只有 50ETF,之后六只 ETF 走势高度相关,所以合并后的样本数高估了独立性。权重的 95 % 区间很宽(±0.4–0.5)。
- 只有三次压力事件(2015 年、2020 年 2 月、2024 年 9 月)决定了尾部数字。新类型的冲击可能更糟。
- QVIX 不是你交易的 IV。 它是 model-free(无模型)的,包含 skew,所以比平值 IV 高 1–3 点。平值 IV 版本是把 QVIX 按一个平稳年份(2025-10 至 2026-09)测得的差距平移,再套用回 2015 年:它用到了后来的数据,并且在压力月份可能低估了差距。QVIX 和平值两行应看作真实值所在的范围。
- 较晚上市的品种从相对平稳的年份开始(2019–2023),那段时间溢价普遍为正。
- 已实现波动率用的是 ETF 收盘价,保留了分红除息的下跌。 换成不含分红的指数,溢价是 +2.9 而不是 +2.7(QVIX),结论不变。一次 ETF 份额拆分(500ETF,2022-08-29)已从所有 RV 中剔除。
- 中证1000 股指期权(IM)没有覆盖。 它的公开波动率指数有问题(有零值、缺口,且在 2026 年 3 月中断),所以 1 点溢价在 IM 上是未经检验的,App 也标明了这一点。
自己复现
下面的脚本用公开数据重算本页 QVIX 口径的各项数字,不需要账号或密钥。
数据(通过免费的 AKShare 获取):
| 内容 | AKShare 函数 | 起始 |
|---|---|---|
| ETF 日收盘价(新浪,未复权) | fund_etf_hist_sina("sh510050") 等 | 各 ETF 上市日 |
| 跟踪指数收盘价,仅用于识别份额拆分 | stock_zh_index_daily("sh000016") 等 | — |
| QVIX 日收盘值 | index_option_50etf_qvix()、_300etf_、_500etf_、_cyb_、_kcb_、_100etf_ | 2015-02-09(50ETF)至 2023-06(科创50) |
已实现波动率(收盘价对收盘价,预测和目标用同一个估计方法):
def realized_vol(points, as_of, lookback_days, *, skip_gaps):
start = as_of - timedelta(days=lookback_days)
window = [(d, p) for d, p in points if start <= d <= as_of]
rets = [log(p1 / p0) for (d0, p0), (d1, p1) in zip(window, window[1:])
if not (skip_gaps and (d1 - d0).days > 5)] # 跳过长假
m = sum(rets) / len(rets)
return sqrt(sum((r - m) ** 2 for r in rets) / len(rets) * 252)
起点 t 的各个预测,以及目标:
trailing = mean(realized_vol(px, t, w, skip_gaps=True) for w in (30, 60, 90))
qvix = qvix_close[t] / 100
target = realized_vol(px, t + timedelta(days=30), 30, skip_gaps=False)
# IV − 溢价:截至 t 已经结束的样本的平均溢价
past = samples[samples.origin + timedelta(days=30) <= t]
iv_minus_premium = qvix - (past.iv - past.rv_fwd).mean()
评分:
rmse = 100 * sqrt(((target - forecast) ** 2).mean()) # vol point
premium = 100 * (iv - target) # 均值、中位数、为正的比例
运行:
pip install -r requirements.txt
python vrp_backtest.py --cache-dir data --until 2026-09-30
--until 2026-09-30 把数据截在本页所用的日期;不加的话,之后结束的月份会被加进来,数字会略有变化。
2026-10-01 核对:分别用研究保存的数据和重新从 AKShare 下载的数据运行,两次结果相同,与本页显示的每一位数字一致。声明的容差为 ±0.01 vol point(四舍五入)。
| 数字 | 本页 | 脚本 |
|---|---|---|
| 样本 / 日期 | 387 / 135 | 387 / 135 |
| RMSE,trailing RV | 10.81 | 10.81 |
| RMSE,QVIX | 9.98 | 9.98 |
| RMSE,IV − 溢价 | 9.69 | 9.69 |
| QVIX 溢价:均值 / 中位数 / 为正的月份 | +2.70 / +4.62 / 75 % | +2.70 / +4.62 / 75 % |
| IV 权重(QVIX) | 0.79 | 0.788 |
| “IV 便宜”(QVIX):成立比例 / 买方优势 | 26 % / −3.68 | 26 % / −3.68 |
| IV − 溢价的对数误差 sd | 0.388 | 0.388 |
平值 IV 的几行不在脚本里:QVIX 与平值 IV 之间的差距,是用本站从实时期权链记录的一年平值 IV 测出来的,这不是公开数据。
下载脚本
独立的 Python 脚本,只使用公开数据(AKShare)。先安装 requirements.txt 中的依赖,再运行脚本。