Skip to content

别再只看恐慌指数了!量化代码让你从VIX曲线的“坡度”和“弧度”看穿牛熊

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:别人恐慌我贪婪,但前提是你得看懂恐慌的“形状”。别再傻傻只盯一个VIX指数了,那都是小儿科。今天我把量化基金常用的VIX期限结构模型,掰碎了讲给你听,还附上了开箱即用的代码。这篇文章,就是想让你比80%的散户,更早一步嗅到危险和机会。

1. 为什么只看VIX点位远远不够

VIX指数(CBOE Volatility Index)常被称作“恐惧指数”,它反映标普500未来30天的隐含波动率。但单独一个数字只能告诉你“现在波动大不大”,却无法回答两个更关键的问题:

  • 波动主要集中在短期还是会持续到中长期?
  • 市场当前是“正常定价,还是极端尾部风险,还是已经在恐慌中过度反应?

答案藏在VIX期货的期限结构(Term Structure)里。不同到期月的VIX期货价格连成一条曲线,形状通常分为三种典型状态:

状态英文术语曲线特征历史占比(2013-2024)典型场景
正向市场Contango近月<远月,向上倾斜约85%常态,美股慢牛
倒挂市场Backwardation近月>远月,向下倾斜约8%2020疫情、2008危机、2024.8科技恐慌
平坦/过渡Flat几乎水平约7%政策转向期

正向市场:整条曲线看上去是橙色还是蓝色,是整体上移还是下降,说明大家对未来的每一天的焦虑程度,这是最直观的恐慌程度。

倒挂市场:这个指标最微妙,也最有趣。它反映了市场对“特定时间点”的担忧。

平坦/过渡:曲线是向上还是向下,直接决定了市场是否转向,也决定了你的“展期成本”是正是负。

简单说,VIX告诉你的是未来30天市场大概会有多“颠簸”。而VIX期限结构,是把未来不同时间点(比如1个月后、2个月后、半年后)的“颠簸预期”串起来,形成的一条曲线。这条线长什么样,直接暴露了市场最真实的“内心戏”。

2. 数据获取:CBOE官方免费CSV全自动化

CBOE每天在官网公开所有VIX期货结算数据,地址固定,格式稳定。我们使用社区维护的 vix-utils 库异步下载,速度极快。

pip install vix-utils nest-asyncio pandas

import nest_asyncio, asyncio
from vix_utils import async_load_vix_term_structure
import pandas as pd

nest_asyncio.apply()

async def fetch_vix():
    df = await async_load_vix_term_structure()
    # 过滤周合约与已到期合约
    df = df[(df['Weekly'] == False) & (df['Expired'] == False)].copy()
    df['Trade Date'] = pd.to_datetime(df['Trade Date'])
    return df

df = asyncio.get_event_loop().run_until_complete(fetch_vix())
df.head()

返回字段关键列:Trade Date、Futures Contract(月份)、Tenor_Days(剩余天数)、Settle(结算价)。

3. 基础可视化:交互式期限结构滑块图

用Plotly做出带日期滑块的交互图,一目了然看出曲线形态变化。

import plotly.express as px

# 每月合约(去周合约)
monthly = df[df['Weekly'] == False].copy()

fig = px.line(monthly, x='Tenor_Days', y='Settle', color='Trade Date',
              title='VIX期限结构时间滑块(拖动查看历史)',
              labels={'Tenor_Days':'到期天数', 'Settle':'期货价格'})
fig.update_layout(height=600, template='plotly_dark)
fig.show()
图1:交互滑块图,2024年8月明显倒挂,2025年12月恢复典型正向

4. 量化指标一:每日曲线斜率(Slope)

最简单有效的单日指标:对当天的Tenor_Days和Settle做一元线性回归,得到斜率。

import numpy as np

slopes = []
for date, group in df.groupby('Trade Date'):
    group = group.sort_values('Tenor_Days')
    if len(group) >= 3:
        slope = np.polyfit(group['Tenor_Days'], group['Settle'], 1)[0]
        slopes.append({'date': date, 'slope': slope})

slope_df = pd.DataFrame(slopes).set_index('date')

5. 核心模型:HMM识别三种隐含状态

斜率序列是非平稳的,直接阈值判断容易误判。我们使用高斯HMM自动学习三种隐藏状态。

from hmmlearn.hmm import GaussianHMM
from sklearn.preprocessing import StandardScaler

X = StandardScaler().fit_transform(slope_df[['slope']])

model = GaussianHMM(n_components=3, covariance_type="full", n_iter=1000, random_state=42)
model.fit(X)
hidden_states = model.predict(X)

# 根据均值排序命名状态
means = model.means_.flatten()
state_names = ['倒挂(Backwardation)', '过渡(Flat)', '正向(Contango)']
order = np.argsort(means)
name_map = dict(zip(order, state_names))

slope_df['regime'] = [name_map[s] for s in hidden_states]

得到的转移矩阵(2025年1月最新拟合):

从→到正向过渡倒挂
正向0.9420.0570.001
过渡0.6230.3510.026
倒挂0.0120.0890.899

倒挂状态自保持概率高达90%,一旦进入短期很难快速退出,这也是为什么2020年疫情倒挂持续数月。

图2:HMM自动标注的正向/过渡/倒挂状态

6. 量化指标二:Carry价差(VX2-VX1、VX6-VX1)

# 构建月合约pivot表
pivot = df.pivot(index='Trade Date', columns='Tenor_Monthly', values='Settle')

carry = pd.DataFrame({
    'Near_Mid': pivot[2] - pivot[1],
    'Near_Long': pivot[6] - pivot[1]
})
carry = carry.dropna()
图3:结转风险。VX2-VX1 的衰减速度快于 VX6-VX1。当近月价差首先收窄时,结转为正;当 VX2-VX1 转为负值而 VX6-VX1 保持高位时,结转发生逆转

当Near_Mid<0时,卖出近月、买入中月可锁定正carry;反之则需警惕。

7. 量化指标三:PCA主成分分解

对前8个月份合约做PCA,通常前三个主成分解释率>95%:

  • PC1 → Level(整体波动水平)
  • PC2 → Slope(倾斜
  • PC3 → Curvature(曲率)
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

front8 = pivot.iloc[:, :8].dropna()
X = StandardScaler().fit_transform(front8)

pca = PCA(n_components=3)
scores = pca.fit_transform(X)
pca_df = pd.DataFrame(scores, index=front8.index, 
                      columns=['Level(PC1)', 'Slope(PC2)', 'Curvature(PC3)'])
print(pca.explained_variance_ratio_)
图4:PCA分解后三个因子,Level在危机时急升

8. 实战应用场景与项目结构建议


实战场景推演表

状态推荐操作常用工具/产品
深度正向(Contango>8%)卖出波动率(Short Vol)SVIXM、SVIX、-1x VXX
倒挂初期快速买入保护VXX、UVXY、虚值Put
倒挂后期(PC1开始回落)反手做多波动率逐步建仓SVIX

完整项目结构建议

vix_monitor/├── data/                # 自动缓存CSV├── vix_fetch.py         # 数据下载├── vix_curve.py         # 可视化函数├── vix_hmm.py           # HMM模型训练&预测├── vix_pca.py           # PCA因子├── vix_carry.py         # Carry价差├── dashboard.py         # Streamlit或Plotly Dash面板└── requirements.txt

至此,你已经拥有了一套完整的VIX期限结构监控系统:免费数据源 + 可复现代码 + 状态识别 + 多因子视角。

2025年12月9日当前,曲线处于温和正向,Level因子处于历史20%分位,短期系统性风险较低。但只要HMM状态切换到倒挂,或PC1单日上升超2个标准差,就是明确的战术级买入保护信号。

观点总结

本文从数据获取开始,逐步实现VIX期限结构可视化、斜率计算、HMM三状态识别、PCA因子分解以及Carry价差监控,形成一套可直接落地的波动率研究框架。

  • 核心库:vix-utils、pandas、plotly、hmmlearn、scikit-learn。
  • 关键指标:每日斜率、HMM隐藏状态、Carry价差、PCA三因子。
  • 当前状态(2025.12.9):温和正向,Level低位,短期系统性风险可控。
  • 后续可扩展:加入恒到期指数、实时WebSocket、钉钉/企业微信报警。

如果你觉得这篇文章对你有帮助,记得分享给更多的朋友。有什么问题可以在评论区留言,老余会一一解答。让我们一起在量化交易的道路上越走越远!

 #VIX期限结构 #Python量化 #HMM政权识别 #波动率交易 #VIX期货 #PCA因子 #Carry策略 #量化交易 #老余捞鱼


风险提示:投资有风险,入市需谨慎。本文仅供学习参考,不构成投资建议。

Published inAI&Invest专栏

Be First to Comment

    发表回复