IV Term Structure + Volatility Smile / Skew
IV 的时间维度(term structure)+ 行权价维度(smile/skew)+ 两者合成的 vol surface,以及背后的经济解释
日期: 2026-05-28 方向: 期权 / 波动率结构 阶段: Phase 1: 基础与工具链 标签: #VolatilityTermStructure #IVSmile #IVSkew #Contango #Backwardation #VolSurface #VIX
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | IV 的时间维度(term structure)+ 行权价维度(smile/skew)+ 两者合成的 vol surface,以及背后的经济解释 |
| 实操 | 用 ib_insync 抓 SPY 一个 expiry 的完整 option chain,画 IV vs strike 看出 skew 形状 |
| 产出 | TR-DAY19 笔记 + IV surface 可视化代码 + skew 在策略选择中的应用清单 |
一、先回顾:BS 假设和现实之间的裂缝
Day 16-18 我们用 Black-Scholes 算 IV,假设是「同一只股票的所有期权,σ 是常数」——一个数字描述整个 underlying。
但 1987 年 10 月 19 日「黑色星期一」之后,市场上发生了永久性的结构变化:交易员开始为「尾部风险」明码标价。从此 BS 模型反推出来的 IV 不再是常数,而是:
IV = f(strike, expiry)
这个二元函数画出来就是 volatility surface(波动率曲面)。它有两条主要切片:
| 切片方向 | 名字 | 经济含义 |
|---|---|---|
| 固定 strike,看 IV 随 expiry 变化 | Term Structure(期限结构) | 市场对「短期 vs 长期不确定性」的相对定价 |
| 固定 expiry,看 IV 随 strike 变化 | Smile / Skew(笑容 / 偏斜) | 市场对「上涨风险 vs 下跌风险」的不对称定价 |
把它们叠起来 → 完整的 surface。机构做市商每天维护这个 surface 给 chain 上每个期权报价;个人量化主要看几个关键切片就够用。
今天的核心 takeaway 提前剧透:
- 你看到的 IV 永远是相对的——相对于 term structure 中的位置、相对于 skew 中的位置
- 高 IV 不等于「贵」,要看在 surface 哪个位置
- 卖期权赚钱的本质很多时候是赚 skew 上的结构性溢价,不是「赚波动」
二、IV Term Structure:时间维度的不确定性定价
2.1 定义与可视化
固定一个 strike(通常取 ATM,即等于当前 spot 的那个 strike),把不同 expiry 的 IV 连起来:
IV
^
30% - | . . . .
| . . (contango, normal)
20% - | .
| .
10% - | .
+-----+-----+-----+-----+-----+-----+----> DTE
7 14 30 60 90 180
横轴 DTE(days to expiry),纵轴 IV。典型形状:右上倾斜,远月 IV > 近月 IV。
2.2 Contango vs Backwardation
借用期货术语:
| 形态 | 数学条件 | 出现频率 | 经济含义 |
|---|---|---|---|
| Contango | IV(远期) > IV(近期) | ~80% 的时间 | 市场平静,时间越远不确定性越大(正常物理) |
| Backwardation | IV(近期) > IV(远期) | 危机时段 | 市场恐慌,眼前的危险比远期更可怕 |
| Flat | 近远期 IV 接近 | 过渡态 | 趋势变化的临界 |
2.3 历史上著名的 backwardation 时刻
| 事件 | 时间 | VIX 峰值 | front/back ratio |
|---|---|---|---|
| COVID 崩盘 | 2020 年 3 月 | 82 | front 比 back 高 70%+ |
| 俄乌战争开打 | 2022 年 2 月 | 36 | 短暂 backwardation |
| 美国通胀超预期 | 2022 年 6 月 | 35 | 短暂 backwardation |
| 日元套利平仓 | 2024 年 8 月 5 日 | 65 (intraday) | 极端 backwardation 1-2 周 |
| 2008 雷曼 | 2008 年 10 月 | 89 | 重度 backwardation 数月 |
直觉:contango → 市场认为「不会马上出事,但未来谁知道」。backwardation → 「现在就有事,先扛过这周再说」。
2.4 为什么 contango 是常态
三个互相加强的力量:
- 不确定性随时间累积:未来越远,可能性树越宽,sqrt(T) 因子推高 IV
- 持有期权要支付 theta:长期期权时间价值更厚,必须有更高 IV 才能让卖方有利润
- 流动性溢价:远月期权流动性差,做市商要更宽 spread 才肯报价 → 推高隐含 IV
任何一个抵不过时,contango 就崩了。backwardation = 市场认为眼前的 jump risk 已经超越了上述三个力量。
2.5 VIX term structure:宏观风险温度计
CBOE 不只是发布 VIX(30 天预期波动率),还发布:
| 指数 | 时间窗 |
|---|---|
| VIX9D | 9 天 |
| VIX | 30 天 |
| VIX3M | 3 个月 |
| VIX6M | 6 个月 |
| VIX1Y | 1 年 |
这五个连起来就是 VIX term structure。常态下右上倾斜(contango)。
简单宏观指标:
- VIX3M / VIX < 1 → backwardation → 市场恐慌中 → 谨慎加仓
- VIX3M / VIX > 1.15 → 深度 contango → 市场极度平静 → 警惕复杂性崩塌(最危险的时候往往看起来最安全)
- VIX3M / VIX ∈ [1.0, 1.15] → 正常区间
我个人会把这个 ratio 当作「不开新仓的开关」之一。
三、Volatility Smile:1987 之前不存在的曲线
3.1 历史背景:BS 出来之后的"乌托邦时代"
1973 年 Black-Scholes 发表,CBOE 同年开张。1973-1987 这十几年间,市场上的 IV 真的接近常数——不同 strike 的 IV 平坦。BS 模型几乎完美。
直到 1987 年 10 月 19 日,道琼斯单日跌 22.6%。
事后人们用 BS 算 1987 前的 OTM put:如果 IV 是 20%,OTM put 几乎一文不值。但这次崩盘把所有 OTM put 卖方扫地出门。
从此以后市场达成共识:BS 的对数正态假设低估了尾部。OTM put 不应该是「几乎免费的灾难保险」,它应该有显著溢价。这个溢价反推回 BS → OTM put 的 IV 高于 ATM 的 IV → smile 诞生。
3.2 Smile 的形状
IV (固定 expiry)
^
40% -|. .
| . .
30% -| . .
| . .
20% -| . . <- ATM 最低点
| . .
10% -| . . . . .
+------+------+------+------+------+----> Strike
80% 90% 100% 110% 120% (% of spot)
OTM put ATM OTM call
两边翘起来,中间最低,像一个"微笑"。
3.3 经济解释(三股力量同时作用)
| 力量 | 机制 | 影响 |
|---|---|---|
| 尾部风险溢价 | 投资者承认 1987 黑色星期一/2008/COVID 类极端事件不可忽略,对 OTM 期权要价更高 | 两端 IV 拉升 |
| Portfolio insurance 需求 | 大型基金长期持有股票,必须买 OTM put 对冲,结构性买盘推高 put IV | 左侧(OTM put)拉得更高 |
| 杠杆效应(Black 1976) | 股价下跌时 → 公司 D/E 上升 → 股权波动率上升 → put 应该更贵 | 左侧拉高 |
| 现金流约束 | 极端行情下投资者要被迫平仓 → 价格 gap → OTM 期权命中概率比对数正态预测高 | 两端拉高 |
3.4 不同标的的 smile 形状完全不同
| 标的类型 | 典型形状 | 原因 |
|---|---|---|
| SPY / SPX | 左偏 skew(put 比 call 贵很多) | 长仓投资者集中买 put 对冲 |
| 单股科技 (NVDA/TSLA) | 微笑或右偏 | 投资者也担心错过暴涨 → buy OTM call |
| 商品 (黄金/原油) | 右偏 skew | 大家担心「价格暴涨」(油价飙升/通胀) |
| 公用事业 (XLU/SO) | 接近平坦 smile | 价格变动温和、双向风险接近 |
| 农产品(玉米) | 右偏 | 担心干旱/灾害推高价格 |
| 极度恐慌时的 SPY | 形状变平甚至右偏 | OTM call 也被疯抢(短期反弹博弈) |
关键认识:Smile/skew 不是市场异常,是市场理性 + 资金流动结构的均衡。模型(BS)错了,市场对了。
四、Volatility Skew:股指期权的常态
对 SPY / SPX,完整对称的 smile 反而少见,更常见的是「向左倾斜的偏斜(put skew)」:
IV (SPX 30 DTE)
^
35% -|.
| .
25% -| .
| .
18% -| .
| . . . . . . . .
15% -| .
+------+------+------+------+------+----> Strike
90% 95% 100% 105% 110%
OTM put ATM OTM call
OTM put IV > ATM IV > OTM call IV。
4.1 为什么 SPY 有 put skew 而不是对称 smile
- 长仓机构(养老金/共同基金/家族办公室)必须对冲下跌,规模化买 put → 推高 put IV
- 同样这些机构卖 OTM covered call 收 income → 压低 call IV
- 散户买彩票(OTM call)的量级远小于机构买 put
- 杠杆效应也是单向的:下跌时 vol 飙升、上涨时 vol 平静
4.2 25-delta risk reversal:标准 skew 度量
RR_25 = IV(25Δ OTM call) - IV(25Δ OTM put)
(25-delta 是约定俗成的远值,对应 spot ± 1σ 附近的 strike)
| RR_25 | 含义 |
|---|---|
| RR_25 << 0(如 -5%) | 强烈 put skew,市场极度担心下跌 |
| RR_25 ≈ -2% 到 -3% | SPY 长期均值,正常风险情绪 |
| RR_25 ≈ 0 | 对称 smile,少见 |
| RR_25 > 0 | 右偏 skew,市场担心暴涨(科技股 / 商品) |
观察 RR_25 的变化方向比绝对值更有意义。SPY 的 RR_25 从 -3% 突然变到 -6% → 比 VIX 上涨更早期的恐慌信号。
4.3 Term skew:skew 自己也有期限结构
近月期权 skew 更陡(risk reversal 更负),远月期权 skew 更平。直觉:远期任何事情都有可能(包括上涨),市场不愿意单边定价;近期下跌恐慌更具体可感。
这也意味着 7DTE 期权的 skew 经常失真——流动性差 + gamma 极端 → IV 数字不稳定。
五、Vol Surface:把两个维度合起来
IV
↑
| ████████
| ████████████
| ████████ ████████
| ███████ ████████████
| ███████ ████████████████
| ████ ███████████████████
|_____________________________________ → Strike
/
/
↓ Expiry
3D 曲面:strike × expiry × IV。
5.1 机构怎么用 surface
做市商不是为每个 strike 独立报价,而是:
- 维护一个参数化的 surface 模型(SABR、SVI、Heston 都是经典选择)
- 实时校准模型参数(用最活跃的几个 strike 的市场价反推)
- 用模型外推/内插给整个 chain 报价
- 单点报价偏离 surface 太多 → 套利机会(或数据错误)
5.2 个人量化怎么用 surface
我们不需要 fit 整个 surface,但要会:
- 检查报价是否合理:某个 strike 的 IV 显著偏离邻居 → 可能流动性差,慎入
- 比较 term structure 上下:卖 weekly vs 卖 monthly,看 theta/vega 的 trade-off
- 比较 skew 高低:选 OTM put strike 时,IV 越高 = 收的 premium 越多(在做卖方时)
六、实操:抓 SPY 期权链画 IV smile
我们用 ib_insync 拿当前 SPY 离当前最近的 monthly expiry 全部 strike,画 IV vs strike,看出 skew 的形状。
# tr_day19_iv_smile.py
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from ib_insync import IB, Stock, Option, util
util.startLoop() # remove if running as a standalone script
ib = IB()
ib.connect('127.0.0.1', 7497, clientId=19) # Paper port
# 1) Get SPY spot
spy = Stock('SPY', 'SMART', 'USD')
ib.qualifyContracts(spy)
[ticker] = ib.reqTickers(spy)
spot = ticker.marketPrice()
print(f"SPY spot: {spot:.2f}")
# 2) Discover option params
chains = ib.reqSecDefOptParams(spy.symbol, '', spy.secType, spy.conId)
chain = next(c for c in chains if c.tradingClass == 'SPY' and c.exchange == 'SMART')
# 3) Pick the closest monthly expiry > 21 DTE (avoid super-near distortion)
from datetime import datetime, date
today = date.today()
expirations = sorted(chain.expirations)
target_expiry = None
for exp in expirations:
exp_date = datetime.strptime(exp, '%Y%m%d').date()
dte = (exp_date - today).days
if 21 <= dte <= 45:
target_expiry = exp
break
print(f"Target expiry: {target_expiry}")
# 4) Build strike grid: ±15% around spot
all_strikes = sorted(chain.strikes)
strikes = [s for s in all_strikes if 0.85*spot <= s <= 1.15*spot]
# 5) Build contract list (both puts and calls)
contracts = []
for s in strikes:
contracts.append(Option('SPY', target_expiry, s, 'P', 'SMART', tradingClass='SPY'))
contracts.append(Option('SPY', target_expiry, s, 'C', 'SMART', tradingClass='SPY'))
ib.qualifyContracts(*contracts)
# 6) Pull IV via reqMktData with modelGreeks
tickers = ib.reqTickers(*contracts)
rows = []
for t in tickers:
iv = t.modelGreeks.impliedVol if t.modelGreeks else None
rows.append({
'strike': t.contract.strike,
'right': t.contract.right,
'iv': iv,
'mid': (t.bid + t.ask) / 2 if t.bid and t.ask else None,
})
df = pd.DataFrame(rows).dropna(subset=['iv'])
# 7) Plot smile/skew
fig, ax = plt.subplots(figsize=(10, 5))
puts = df[df.right == 'P']
calls = df[df.right == 'C']
ax.plot(puts.strike, puts.iv * 100, 'o-', label='Put IV', color='crimson')
ax.plot(calls.strike, calls.iv * 100, 's-', label='Call IV', color='steelblue')
ax.axvline(spot, color='gray', linestyle='--', label=f'Spot ({spot:.2f})')
ax.set_xlabel('Strike')
ax.set_ylabel('IV (%)')
ax.set_title(f'SPY IV Skew — Expiry {target_expiry}')
ax.legend()
ax.grid(alpha=0.3)
plt.tight_layout()
plt.savefig('spy_skew.png', dpi=120)
plt.show()
# 8) Quick numeric skew check
atm_iv = df[(abs(df.strike - spot) < 1)].iv.mean()
otm_put_25d = df[(df.right == 'P') & (df.strike < 0.95*spot)].iv.mean()
otm_call_25d = df[(df.right == 'C') & (df.strike > 1.05*spot)].iv.mean()
print(f"ATM IV ~ {atm_iv*100:.2f}%")
print(f"OTM put IV ~ {otm_put_25d*100:.2f}%")
print(f"OTM call IV ~ {otm_call_25d*100:.2f}%")
print(f"RR proxy (call - put) = {(otm_call_25d - otm_put_25d)*100:+.2f}%")
ib.disconnect()
6.1 预期输出
正常市场下应该看到:
- ATM IV 在 14-18% 之间(SPY 在低 VIX 环境)
- OTM put IV 高于 ATM 3-6 个点
- OTM call IV 低于 ATM 1-3 个点
- RR proxy 显著为负(-3% 到 -6%)
如果今天 VIX 高(>22),整条曲线整体往上平移;如果 backwardation 严重,可能近月 ATM 反超 60 天 ATM。
6.2 简单画 term structure
把上面代码拆出三个 expiry(一个 weekly、一个 monthly、一个 quarterly),固定 strike = spot(ATM),把三个 IV 点画出来连线就是 term structure。
七、VIX term structure 经典 trade
VIX 自己不能交易(只是个指数),但可交易的工具有:
| 工具 | 标的 | 适合做什么 |
|---|---|---|
| VIX 期货 | 月度 VIX 期货合约 | 直接做 term structure |
| VXX | front-month + 2nd-month VIX 期货等权 ETN | 做多 VIX,但 contango 时有 roll cost |
| UVXY | 1.5× VIX 期货 ETF | 高杠杆做多 VIX,衰减更快 |
| SVXY | -0.5× VIX 期货 ETF | 做空 VIX,contango 时受益 |
| VIX 期权 | 期权 on VIX 期货 | 复杂但精确表达观点 |
7.1 经典 contango 收割("短 VIX")
逻辑:
- VIX 期货 80% 时间在 contango
- VXX 每天 roll:卖近月(便宜)+ 买远月(贵)→ 持续亏损 → VXX 长期下跌
- 长期做空 VXX(或买 SVXY)→ 收 contango 衰减 → 类似收 carry
但灾难场景:2018 年 2 月 5 日「Volmageddon」,VIX 单日从 17 跳到 37,XIV(-1× VIX 的 ETN,SVXY 同族)单日跌 96%,被强制清盘。短 vol 策略累积多年的利润可以被一次黑天鹅全部抹去。
教训:
- 短 vol carry 是「钓鱼竿赚硬币、压路机来碾压」
- 必须有硬止损或 OTM call 对冲
- 仓位永远不能超过净资产的小比例(5-10% max)
7.2 Backwardation 时反向 trade
当 VIX3M/VIX < 1(backwardation):
- 这时长 VIX 没有 roll cost(甚至 roll yield 为正)
- 可以小仓位买 VXX 或 UVXY
- 但必须有清晰退出条件(如 ratio 回到 1.0 即出)
- 不能 ride 太久,因为 backwardation 平均只持续几周
对我个人:90 天计划里我不打算交易 VIX 产品(复杂度高、ETN 衰减坑多),但用 VIX term structure 当宏观开关——backwardation 期间不卖 put,contango 极深期间警惕。
八、Skew 在策略选择中的实用应用
把 skew 知识转换成具体可执行的策略选择规则:
8.1 卖 OTM put:吃 put skew 溢价
- SPY 30 DTE OTM put IV 通常比 ATM 高 3-5 个点
- 等于市场每个月都在为「下跌保险」额外付费
- 卖方就是吃这个保险费
- 这是 cash-secured put(CSP)和 wheel 策略的本质收益来源
- 没有这个 structural skew,CSP 的胜率不可能这么高
8.2 卖 covered call:在 OTM call 偏低 IV 上面妥协
- OTM call IV 通常比 ATM 低
- 卖 CC 收的 premium 相对单纯卖 strangle 的 call 腿少一些
- 但好处是有股票背书,不怕大涨
- 实战中我会选 delta ≈ 0.20-0.25 的 OTM call(约 1σ 外),既收 premium 又不容易被 assign
8.3 Iron Condor:同时吃两边 IV 溢价
- 卖 OTM put + 买更 OTM put(保险) + 卖 OTM call + 买更 OTM call(保险)
- 同时利用 put skew 和 OTM call 还是比 ATM 高一点的事实
- 适合预期 underlying 横盘的区间
8.4 警惕反指标:skew 太平 / 反转
- 如果 SPY 25Δ RR 从 -3% 飙到 +1%(罕见)→ 市场情绪结构性变化
- 通常出现在大型上涨末期,机构开始担心错过暴涨多过担心下跌
- 这时不要继续卖 OTM call(IV 会被刺杀)
- 反过来如果 RR 跌到 -6% 以下 → 极度恐慌 → CSP 反而是好机会(但要小仓位)
九、常见坑(亲测)
9.1 Strike 离 ATM 太远,IV 不稳定
- 5Δ 以外的期权(深度 OTM)流动性极差
- bid-ask spread 可能比 mid 还宽
- 反推的 IV 可能是个无意义的数字(或 None)
- 画 skew 时通常只用 ±15% strike 范围内
9.2 Expiry 太近(<7DTE)skew 失真
- gamma 爆炸 + theta 急速衰减 → IV 数字波动剧烈
- 一只蝴蝶煽动翅膀就能让 0DTE 的 IV 跳 20%
- 画结构性 skew 选 21-45 DTE 最稳定
9.3 不同股票的 skew 形状完全不同
- 别拿 SPY 的 skew 直觉套 NVDA 或 TSLA
- 单股财报前 IV 会形成「双峰」结构(财报日附近 IV 飙高)
- 商品 ETF(USO/UNG)skew 经常右偏
- 每个新交易标的,先看一眼 skew 形状再设计策略
9.4 模型 IV vs 自己反推 IV
- IBKR 的 modelGreeks.impliedVol 用的是自家模型(接近 BS)
- 你用 BS + bid 反推 vs 用 mid 反推 vs 用 ask 反推,会得到不同结果
- 报告 IV 时永远说清楚是哪个价格反推的
9.5 Dividend 与 ex-div date
- SPY 季度分红会让 call 表面 IV 偏低、put 表面 IV 偏高
- 跨过 ex-div date 的 expiry 不能直接和不跨的比
- 严肃分析需要把 dividend 调整加进 BS
9.6 利率变化的影响
- BS 里 risk-free rate r 影响 call/put 平价
- 2024-2026 SOFR 大变化时期,旧版代码默认 r=0% 会给出错误 IV
- 始终用当前 SOFR 或 3-month T-bill rate
十、PM 视角:今天学到的迁移性思考
-
「平均值」是骗子,必须看分布
- BS 用一个 σ 描述整只股票,是「平均化」的傲慢
- 市场用 surface 告诉你:尾部、中间、上涨、下跌 各自的不确定性不一样
- PM 看 KPI 时也一样:DAU 平均值是骗子,看 P50/P90/P99 留存才真实
- 销售额平均值是骗子,看不同客户分层、不同 cohort 留存才真实
- 一句话:任何一维数字描述多维世界,都在隐藏信息
-
结构性溢价的本质是「持续不对称的需求」
- SPY put skew 永远存在是因为长仓机构对冲是结构性买盘
- 在金融产品设计里,识别结构性需求 → 找到 sustainable monetization
- 反过来,做卖方就是站在结构性需求的对面,收「保险费」
- 类比到 PM:SaaS 续费率高的产品本质是「客户离开你比续费更贵」的结构性不对称
-
市场不是均衡,是均衡 + 流动
- Smile 不是「定价错误」,是流动性、需求、风险偏好不对称的均衡产物
- 任何系统的「异常」往往不是 bug,是约束条件造成的局部最优
- PM 看到的「用户行为异常」常常也不是 bug,是产品架构的局部最优
- 想改它,要改约束条件,不是直接改行为
-
历史改变模型 ≠ 模型错了,是输入分布变了
- 1987 之后市场永久性给尾部加价 → BS 假设的对数正态分布不再成立
- 不是 BS 错了,是 BS 假设的输入(normal distribution)和现实有差距
- PM 处理用户行为模型也一样:COVID 之后用户预期变了,远程办公变了,老的留存模型必须重新校准
- 永远问:今天的世界还满足模型当初的假设吗?
-
隐含 vs 实现的永恒博弈
- IV 是市场预期的未来波动
- RV 是历史真实发生的波动
- 短 vol 策略本质是赌「IV 系统性高估 RV」
- PM 视角:用户「调研时说的偏好」是 IV,「实际行为」是 RV,两者差值常年存在,做产品就是去捕捉这个差
十一、明日预告
Day 20: IBKR 期权操作 + 第一笔 Cash-Secured Put
- 在 TWS / IB Gateway 上下期权单的完整流程
- Limit / Market / 中间价 + IBKR 智能路由对期权的影响
- Cash-Secured Put 选 strike / 选 expiry 的实战清单
- 第一笔 Paper CSP:选 SPY 30 DTE 25Δ put,下单 → 持仓 → 等收割
- 第一笔 CSP 后的复盘表:premium / theta / 余下天数 / 假设被 assign 的总成本
- Wheel 策略的下一步设计(assign → CC → 再 assign → CSP 循环)
实际执行记录
启动一项填一项,时间戳 + 卡点。
- [hh:mm] 阅读 IV term structure 部分 + VIX 期限结构观察当日 ratio
- [hh:mm] 阅读 smile/skew 部分 + 复习 1987 历史
- [hh:mm] 跑 tr_day19_iv_smile.py → 拿 SPY 当前 expiry 的 IV smile 图
- [hh:mm] 检查当日 RR_25 值,对比历史均值(约 -3%),判断当前市场风险情绪
- [hh:mm] 跑 term structure 版本(多个 expiry 的 ATM IV)
- [hh:mm] 整理 SPY skew 与 NVDA/TSLA skew 的对比观察
- [hh:mm] 更新 TR_PROGRESS.md Week 3 Day 19 标 ✅
- 卡点 / 学到的:
总字数:约 6,200 字 今日完成度:理论 ✓ / 实操(你自己跑代码画 skew 图)/ 笔记 ✓