方差风险溢价择时:用隐含减已实现的差做风险开关
隐含波动率常年高于事后兑现的已实现波动率,这条缝隙(IV−RV)就是方差风险溢价 VRP——期权卖方收的保费。但 Bollerslev-Tauchen-Zhou 的洞见更进一步:VRP 不只是常数保费,它是会呼吸的,而且它的宽窄能预测卖波动策略未来的收益。10 年 GARCH 合成数据完整复现:IV 92.5% 的时间高于 RV、平均升水 4.33 个波动点;把当日 VRP 分五档,Q1(最薄)未来一个月卖波动亏 1.62%、Q5(最厚)赚 1.53%,单调递增。据此造开关——VRP 厚时开仓卖波动、VRP 薄或倒挂时空仓:同一条卖波动腿,无择时版 Sharpe -0.26、回撤 -51.7%(长期亏钱),VRP 择时版 Sharpe 1.2、回撤收窄到 -27.9%、净值转正。关键在 VRP 会在崩盘前压缩,开关据此提前拉闸。附 IV/RV 缝隙、VRP 开关时序、净值对比、分位收益四图与完整 Python,及四类真实陷阱(中高阶)。
卖波动率(short volatility)是量化里最诱人也最危险的一门生意:绝大多数时间稳稳收保费,直到某一天市场崩盘,把你几年的利润一次性收回去。问题从来不是”该不该卖波动”,而是”什么时候该卖、什么时候该收手”。今天讲一个古老又管用的开关:方差风险溢价(Variance Risk Premium,VRP)择时。
结论先放这:隐含波动率(IV)常年高于事后真正兑现的已实现波动率(RV),这条缝隙 IV−RV 就是方差风险溢价——期权卖方收的保费。但 Bollerslev-Tauchen-Zhou(2009)的洞见更进一步:VRP 不只是一笔常数保费,它是会呼吸的,而且它当前的宽窄能预测卖波动策略未来的收益。在 10 年 GARCH 合成数据上,IV 有 92.5% 的时间高于 RV、平均升水 4.33 个波动点;把当日 VRP 分成五档,Q1(最薄)未来一个月卖波动亏 1.62%、Q5(最厚)赚 1.53%,单调递增。据此造一个开关——VRP 厚时开仓卖波动、VRP 薄或倒挂时空仓——同一条卖波动腿,无择时版 Sharpe -0.26、最大回撤 -51.7%(长期亏钱),VRP 择时版 Sharpe 1.2、回撤收窄到 -27.9%、净值由亏转盈。 秘密在于:VRP 会在崩盘前压缩甚至倒挂,开关据此提前拉闸。
一、那条缝隙:期权卖方到底收的什么钱#
先把两个波动率讲清楚:
- 已实现波动率(RV):市场事后真正走出来的波动,用过去一段时间的日收益平方加总算出。它是”实际发生了什么”。
- 隐含波动率(IV):从期权价格反推出来的、市场对未来波动的定价。它是”市场愿意为波动保险付多少钱”。
理论上,如果市场是风险中性的,IV 应该等于 RV 的无偏预期。但现实里,IV 系统性地、持续地高于事后的 RV。这个差 VRP = IV − RV 长期为正,就是方差风险溢价。

为什么这条缝隙常年存在?和 VIX 期限结构升水同源——波动率保险的供需极度不对称:投资者害怕崩盘、愿意常年多付一点买保险(buy protection),而卖保险的一方要承担”平时赚小钱、崩盘巨亏”的凸性风险,必须收取补偿。这笔补偿就沉淀成 IV 高于 RV 的那条缝隙。数据里 IV 有 92.5% 的时间高于 RV,平均升水 4.33 个波动点。
卖波动率策略(卖跨式、卖方差互换、做空 VIX)本质上就是在赚这条缝隙。但麻烦在于:这条缝隙的宽窄一直在变,而且——最关键的——它在你最不该卖波动的时候会突然变窄甚至倒挂。
二、VRP 会呼吸:它不是常数,是信号#
朴素的理解是把 VRP 当一笔固定保费,无脑常年卖波动。这恰恰是爆仓的经典路径。Bollerslev-Tauchen-Zhou 的贡献在于指出:VRP 是一个缓慢移动、有预测力的状态变量。
它的动态有两个关键特征:
- 持续性:VRP 高的时候倾向于继续高、低的时候继续低(自相关很强),所以当前的 VRP 是对未来卖波动收益的有效预测。
- 崩盘前压缩:在市场即将进入动荡之前,VRP 往往会先变薄甚至倒挂(IV < RV)——这有点反直觉,但机制是:真正的恐慌来临前,隐含波动率的上涨常常”跟不上”已实现波动率的突然抬头,保费相对于风险变得极其便宜。此时卖波动是在飓风口捡钢镚儿。
我用一个 AR(1) 过程模拟这条会呼吸的 VRP,并让它在未来 RV 跳升之前被压薄:

把这个直觉量化——按当日 VRP 分五档,看每一档之后一个月卖波动策略的累计收益:

结果单调递增:Q1(VRP 最薄)未来一个月卖波动亏 1.62%,Q2 亏 0.26%,Q3、Q4 在零附近,Q5(最厚)赚 1.53%。这条单调关系就是 VRP 择时的全部依据——当前的溢价越厚,卖波动未来越赚;溢价越薄,越该收手。
三、造开关:厚则开、薄则关#
规则极简单:设一个阈值(这里用 VRP 的 35% 分位),VRP 高于阈值就开仓卖波动、低于就空仓。下面用 numpy 复现整条逻辑。
import numpy as np
np.random.seed(11235)
N = 252 * 10
# 已实现波动率:GARCH(1,1) 制造波动聚集
omega, alpha, beta = 1.2e-6, 0.09, 0.89
h = np.zeros(N); h[0] = omega/(1-alpha-beta); eps = np.zeros(N)
for t in range(1, N):
eps[t-1] = np.sqrt(h[t-1])*np.random.randn()
h[t] = omega + alpha*eps[t-1]**2 + beta*h[t-1]
eps[-1] = np.sqrt(h[-1])*np.random.randn()
ret = 0.0003 + eps
rv = np.sqrt(np.convolve(ret**2, np.ones(21)/21, mode="same")*252)
# VRP:缓慢均值回归的 AR(1),且在未来 RV 跳升前被压薄
rho, vrp_lr = 0.985, 0.038
vrp_true = np.zeros(N); vrp_true[0] = vrp_lr
for t in range(1, N):
vrp_true[t] = vrp_lr + rho*(vrp_true[t-1]-vrp_lr) + 0.006*np.random.randn()
future_jump = np.roll(np.maximum(np.diff(rv, append=rv[-1]), 0), -1)
vrp_true = vrp_true - 0.9*future_jump # 崩盘前溢价变薄
iv = np.clip(rv + np.clip(vrp_true, -0.03, None) + 0.008*np.random.randn(N), 0.05, None)
vrp = iv - rv # 可观测的方差风险溢价
# 卖波动腿:稳收保费(theta),realized 大幅超出 implied 时凸性巨亏(gamma)
iv_lag = np.roll(iv, 1); iv_lag[0] = iv[0]
theta_carry = vrp/np.sqrt(252)*0.30
surprise = ret**2 - (iv_lag/np.sqrt(252))**2
gamma_loss = np.maximum(surprise - 2e-5, 0) * 62.0
short_var_pnl = theta_carry - gamma_loss - 1e-4
# 开关:VRP 高于 35% 分位才持仓
thr = np.quantile(vrp, 0.35)
risk_on = (vrp > thr).astype(float)
timed_pnl = short_var_pnl * risk_on
eq_always = np.cumprod(1 + short_var_pnl)
eq_timed = np.cumprod(1 + timed_pnl)python代码里最重要的是卖波动腿的结构:theta_carry 是每天稳稳收的保费,随 VRP 缩放;gamma_loss 是当日已实现波动大幅超出隐含定价时的凸性巨亏——这两项加起来才是真实的短波动收益(左偏、有肥尾),而不是一条平滑的斜线。
四、效果:同一条腿,判若两人#

| 策略 | CAGR | Sharpe | 最大回撤 |
|---|---|---|---|
| 始终卖波动(无择时) | -1.6% | -0.26 | -51.7% |
| VRP 择时开关 | +5.3% | 1.20 | -27.9% |
同样一条卖波动腿,无择时版本长期是亏钱的(Sharpe -0.26),因为它在 VRP 变薄、崩盘临近的时刻依然满仓,把几年积累的保费一次次吐回去,回撤 -51.7%。加上 VRP 开关后,策略在溢价压缩时提前空仓,躲过了大部分凸性巨亏——CAGR 转正 5.3%、Sharpe 到 1.2、回撤几乎腰斩。
请注意:开关不是靠预测崩盘,而是靠观测溢价。它不需要知道明天会不会跌,只需要读当前 IV−RV 这条缝隙够不够厚。溢价变薄这个信号本身,就是市场在替你报警。
五、结果解读#
收益来源与形态。 卖波动的利润是”高频小额保费”累积型的:VRP 厚的时段每天收一点。这决定了它天生左偏——分布的右侧是密密麻麻的小额正收益,左侧拖着崩盘日的凸性巨亏。VRP 开关做的事,就是尽量让你只在右侧那片肥沃区收保费,在左尾即将展开前离场。
为什么 Sharpe 会骗人。 无择时版本在平静期的 Sharpe 其实很漂亮——低波动、稳收益。但一次崩盘就能把累计的 Sharpe 打成负数。对卖波动这类策略,Sharpe 严重高估了平静期、严重滞后于崩盘。看回撤和收益偏度远比看 Sharpe 诚实。VRP 择时的真正价值不在把 Sharpe 从 -0.26 抬到 1.2 这个数字,而在把 -51.7% 的回撤砍到 -27.9%——它买的是生存,不是超额收益。
开关的滞后代价。 VRP 用月度窗口的 RV 计算,本身有平滑滞后。当波动率跳升极快时(隔夜跳空、闪崩),VRP 可能来不及变薄你就已经挨了第一棍。开关能躲开大部分”有预警”的动荡,躲不开”零预警”的瞬时崩塌。这也是为什么择时版依然有 -27.9% 的回撤——不是没做好,是短波动策略的左尾无法被任何观测型信号完全清除。
适用边界。 VRP 择时在”波动率有节奏地起伏、崩盘前有溢价压缩预兆”的市场里最有效;在溢价与已实现波动同步跳变、毫无提前量的极端事件里会失灵。它也依赖阈值的稳定性——用历史分位设阈值本身是一种样本内校准,制度变化(如做市结构、期权供需长期漂移)会让阈值失准。
A. 实现细节#
- RV 计算:21 日滚动窗口的日收益平方和年化,代表”过去一个月的已实现波动”。
- VRP 定义:
IV − RV,单位是波动率点;本文 IV 由 RV 叠加一个 AR(1) 溢价合成,真实场景应取同期限的 ATM 隐含波动率或 VIX。 - 信号时点:卖波动腿用
iv_lag(昨日 IV)计价,避免用当日 IV 造成 look-ahead;开关用当日 VRP 判定持仓(生产环境应改为昨日 VRP 决定今日持仓)。 - 卖波动收益口径:
theta_carry(保费)−gamma_loss(凸性巨亏)− 成本,直接在收益空间建模短波动的左偏形态,而非用一条平滑斜线。 - 阈值:VRP 的 35% 分位,静态设定;实盘应滚动估计以避免用到未来样本。
B. 已知偏差#
- 阈值的样本内污染:用全样本 35% 分位设阈值,隐含地用到了未来信息。严格回测须用滚动/扩展窗口分位,且会因此损失一部分表现——本文数字是乐观上界。
- 合成 VRP 的”善意”:本文让 VRP 在未来 RV 跳升前被压薄(
future_jump项),这等于给了开关一个真实市场未必总有的提前量。真实 VRP 的预测力比合成数据弱得多,且崩盘前的压缩并非每次都出现。 - IV 数据的现实复杂度:真实 IV 有偏斜(skew)、期限结构、供需扰动,单一 ATM 隐含波动率无法完整刻画方差风险溢价;用 VIX 近似又混入了期限与偏斜效应。
- 凸性损失的建模粗糙:
gamma_loss用一个阈值化的平方项近似,真实卖波动在极端日的亏损取决于具体的期权组合(行权价、到期、对冲频率),可能比本文更肥、更突然。
C. 一句话总结#
方差风险溢价择时的本质是用市场自己报的价当风险开关:IV−RV 这条缝隙不只是期权卖方常年收的保费,它的宽窄还能预测卖波动未来赚不赚——溢价厚时开仓、溢价薄或倒挂时收手。同一条卖波动腿,无择时长期亏钱、回撤 -51.7%,加上 VRP 开关就变成 Sharpe 1.2、回撤腰斩到 -27.9%。它的价值不在多赚,而在别在飓风口捡钢镚儿——因为 VRP 会在崩盘前先变薄,那就是市场提前替你按下的警报。