作者:老余捞鱼
原创不易,转载请标明出处及原作者。

写在前面的话:别人恐慌我贪婪,但前提是你得看懂恐慌的“形状”。别再傻傻只盯一个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()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.942 | 0.057 | 0.001 |
| 过渡 | 0.623 | 0.351 | 0.026 |
| 倒挂 | 0.012 | 0.089 | 0.899 |
倒挂状态自保持概率高达90%,一旦进入短期很难快速退出,这也是为什么2020年疫情倒挂持续数月。
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()
当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_)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策略 #量化交易 #老余捞鱼
风险提示:投资有风险,入市需谨慎。本文仅供学习参考,不构成投资建议。
Be First to Comment