halo 的技术博客

返回

做波动率交易的人, 几乎都听过一句话:「VIX 是会回家的。」

VIX 是市场恐慌的体温计。它平时趴在十几, 一遇危机就窜到三十、四十甚至八十。但无论窜多高, 它最后都会落回来——从来没有哪次恐慌是永久的。这种「冲到极端就往回走」的性质, 在量化里有个正经名字:均值回复(mean reversion)

本文要讲两件事:

  1. 用 OU 过程把 VIX 的回复特性量化出来——回复速度 κappa 有多大、半衰期多长、ACF 怎么衰减。
  2. 把这套回复特性做成波动率目标化(vol targeting)覆盖层——VIX 高(恐慌)自动去杠杆、VIX 低(平静)自动加杠杆。因为 VIX 强均值回复, 这套杠杆会「恐慌时收手、平静时出手」自动周期化, 给股票仓位装上「情绪减震器」。

一、先确认: VIX 到底是不是均值回复#

一个序列是不是均值回复, 最干净的判断是看它的**自相关函数(ACF)**怎么衰减。

  • 随机游走(非平稳)的 ACF 几乎不衰减, 长期≈1;
  • AR(1) 这类短记忆过程的 ACF 是指数衰减, 几步就贴到 0;
  • 均值回复过程的 ACF 也会衰减, 但比短记忆慢得多——因为它总被「拉回均值」的力拽着, 记忆拖得很长。

VIX 属于最后一种。我们生成一条带危机跳变的 VIX 路径(OU 动力学 + 小概率大幅跳升), 看它的 ACF:

def acf(x, lag=40):
    x = x - x.mean()
    n = len(x)
    denom = np.sum(x**2)
    out = np.array([np.sum(x[:n-k] * x[k:]) / denom for k in range(lag + 1)])
    return out

vix_acf = acf(vix, 40)
# lag1 自相关远高于股票收益 -> 慢衰减 = 均值回复
python

二、用 OU 过程把回复速度算出来#

把 VIX 建模成 Ornstein-Uhlenbeck 过程:

dVIXt=κ(θVIXt)dt+σdWtd\text{VIX}_t = \kappa(\theta - \text{VIX}_t)\,dt + \sigma\,dW_t

θ\theta 是长期均值, κ\kappa 是回复速度, σ\sigma 是波动。离散化后就是

VIXtθ=ϕ(VIXt1θ)+εt,ϕ=eκdt\text{VIX}_t - \theta = \phi\,(\text{VIX}_{t-1} - \theta) + \varepsilon_t, \quad \phi = e^{-\kappa\,dt}

只要对「去均值后的 VIX」跑一个 AR(1), 拿到 ϕ^\hat\phi, 就能反解出 κ=lnϕ^/dt\kappa = -\ln\hat\phi / dt, 半衰期 HL=ln2/κ\text{HL} = \ln 2 / \kappa

vbar = vix.mean()
x = vix[:-1] - vbar
y = vix[1:]  - vbar
phi_hat = np.sum(x * y) / np.sum(x * x)      # AR(1) 斜率
kappa   = -np.log(phi_hat) / dt              # 年化回复速度
half_life_days = np.log(2) / kappa * 252     # 半衰期(交易日)
python

本文合成样本拟合结果:

  • 估计持续性 ϕ^=0.9810\hat\phi = 0.9810, 年化回复速度 κ4.84\kappa \approx 4.84 / 年;
  • 半衰期 ≈ 36 个交易日(约 7.2 周)——也就是说 VIX 偏离均值后, 大约两周就回一半;
  • ACF 在 lag1 仍高达 0.978, 而同期股票收益的自相关几乎为 0(短记忆)——这正是「VIX 会回家、价格不回家」的数学差别。

VIX 自相关慢衰减 = 均值回复证据 (lag1=0.978)

三、核心动作: 把回复特性做成波动目标化覆盖层#

均值回复给了我们一个可交易的 asymmetry: VIX 高 = 当前波动大 = 该收手; VIX 低 = 当前波动小 = 该出手。把它写成一个波动率目标化覆盖层——目标波动恒定, 仓位随 VIX 推导的波动反向缩放:

target_vol = 0.16                       # 目标年化波动
vol_est    = vix / 100.0               # VIX 推导年化波动
pos = np.clip(target_vol / vol_est, 0.0, 2.0)   # 杠杆上限 2 倍

strat_ret = pos[:-1] * ret[1:]         # t 日仓位交易 t+1 日, 杜绝前视
python

注意一个铁律:仓位必须用 t 日已知信息算出, 去交易 t+1 日收益。用当天的 VIX 去交易当天的股票收益, 就是前视偏差——回测会漂亮得离谱, 实盘必死。

因为 VIX 强均值回复, 这套杠杆会自动周期化: 恐慌时 VIX 冲高 → 仓位自动砍到 0.4 倍 → 躲过最惨的崩跌段; 平静时 VIX 落到低位 → 仓位自动加到 1.3 倍 → 把低波动段的收益喝满。你不用判断「现在是不是底」, 只要承认「VIX 会回家」就够了。

四、效果: 波动率目标化削掉了尾部#

把策略净值和「始终满仓买入持有」摆在一起:

  • 年化收益: 波动目标化 2.4% vs 满仓 6.1%;
  • 年化波动: 波动目标化 13.3% vs 满仓 19.0%;
  • 最大回撤: 波动目标化 -34.2% vs 满仓 -42.0%;
  • Sharpe: 波动目标化 0.18 vs 满仓 0.32;
  • 样本内平均杠杆 0.71 倍, 其中约 1212 个交易日(≈4.8 年)触发恐慌去风险(仓位清零);
  • 与买入持有相关 0.71——注意它不是低相关: 它本质仍是股票多头, 只是把风险预算钉死 + 在 VIX 极端时退场, 区别在「波动与尾部」不在「方向」。

VIX 路径与净值对比: 波动率目标化 vs 满仓持有

VIX 推导波动 与 策略杠杆: 恐慌时去杠杆、平静时加杠杆

回撤对比: 波动率目标化削掉尾部深跌

关键不在「多赚」, 而在把最不可控的风险砍掉: 年化波动从 19.0% 压到 13.3%、最大回撤从 -42.0% 砍到 -34.2%、与满仓的相关从 1.0 降到 0.71。代价是 Sharpe 略低于满仓——因为去杠杆也避开了危机后的反弹, 这是风险控制的「对价」, 不是 bug。波动率目标化的本质, 是用一点收益换大幅降低的尾部风险与更分散的风险来源, 不是给你免费 alpha。

五、五类真实陷阱(实战必看)#

  1. VIX 不是可交易资产: 本文用「VIX 波动目标化股票」落地, 因为 VIX 本身要靠期货/ETF 才能交易, 而期货有期限结构 contango 损耗。直接做空 VIX 期货在 2018/2020 都发生过单日腰斩。
  2. VIX 推导波动≠真实未来波动: VIX 是隐含/前瞻波动, 用它缩放仓位有「用今天的恐慌决定明天的杠杆」的滞后。危机里 VIX 已经很高才去杠杆, 可能晚半拍。实战要叠加硬性危机止损。
  3. 杠杆上限必须设: 平静市 VIX 落到 10 以下时, 目标/VIX 会算出 1.6 倍以上杠杆, 不封顶会在极端平静后暴跌时爆仓。本文封在 2 倍。
  4. 低波动≠高收益: 波动目标化把波动和回撤压下来, 但长期收益可能不如满仓牛市(满仓在长牛里喝到的 Beta 它喝不到)。它是风险预算工具, 不是印钞机。
  5. 机制切换: VIX 的均值回复在平静市稳健, 但在「波动率 regime 长期高位」(如 2008、2020 初)会暂时失效——VIX 可以在高位停留远超预期, 杠杆一直被压在低位错过反弹。必须结合趋势/估值信号, 别迷信单一覆盖层。

六、小结: 恐慌会回家, 但别裸奔#

VIX 均值回归的真正价值, 不是「预测 VIX 点位」, 而是给你一个市场波动的温度计: 用它判断「现在该贪婪还是该恐惧」。把目标波动钉死、让仓位随 VIX 反向呼吸, 本质是把行为金融里最稳的一条规律——均值回复——写进风险管理。

但记住: 波动率目标化削的是风险, 不是给你免费 alpha。它最合适的角色, 是作为组合里的一层减震, 而不是孤注一掷的主策略。


代码与图表均由自包含 Python(numpy/matplotlib)真实计算, 随机种子固定为 20260717, 可完整复现。所有统计数字(VIX 回复速度 κ≈{kappa:.2f}/年、半衰期≈{half_life_days:.0f} 交易日、ACF lag1={vix_acf[1]:.3f}、波动目标化 Sharpe {sh_s:.2f}/满仓 {sh_b:.2f}、波动 {sd_s100:.1f}%/{sd_b100:.1f}%、回撤 {mdd_s100:.1f}%/{mdd_b100:.1f}%、平均杠杆 {avg_lev:.2f} 倍、与满仓相关 {corr_sb:.2f})均来自文中脚本输出。VIX 为合成 OU+马尔可夫危机 regime 过程, 实战须用真实 VIX 数据并叠加硬止损与多信号融合。

VIX 均值回归:用恐慌指数的回复特性做波动率择时
https://blog.halo26812.eu.org/blog/vix-mean-reversion
Author halo
Published at 2026年7月17日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨