返回交易笔记
TR Day 19

IV Term Structure + Volatility Smile / Skew

IV 的时间维度(term structure)+ 行权价维度(smile/skew)+ 两者合成的 vol surface,以及背后的经济解释

2026-05-28
Phase 1: 基础与工具链
VolatilityTermStructureIVSmileIVSkewContangoBackwardationVolSurfaceVIX

日期: 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 提前剧透

  1. 你看到的 IV 永远是相对的——相对于 term structure 中的位置、相对于 skew 中的位置
  2. 高 IV 不等于「贵」,要看在 surface 哪个位置
  3. 卖期权赚钱的本质很多时候是赚 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

借用期货术语:

形态数学条件出现频率经济含义
ContangoIV(远期) > IV(近期)~80% 的时间市场平静,时间越远不确定性越大(正常物理)
BackwardationIV(近期) > IV(远期)危机时段市场恐慌,眼前的危险比远期更可怕
Flat近远期 IV 接近过渡态趋势变化的临界

2.3 历史上著名的 backwardation 时刻

事件时间VIX 峰值front/back ratio
COVID 崩盘2020 年 3 月82front 比 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 是常态

三个互相加强的力量:

  1. 不确定性随时间累积:未来越远,可能性树越宽,sqrt(T) 因子推高 IV
  2. 持有期权要支付 theta:长期期权时间价值更厚,必须有更高 IV 才能让卖方有利润
  3. 流动性溢价:远月期权流动性差,做市商要更宽 spread 才肯报价 → 推高隐含 IV

任何一个抵不过时,contango 就崩了。backwardation = 市场认为眼前的 jump risk 已经超越了上述三个力量

2.5 VIX term structure:宏观风险温度计

CBOE 不只是发布 VIX(30 天预期波动率),还发布:

指数时间窗
VIX9D9 天
VIX30 天
VIX3M3 个月
VIX6M6 个月
VIX1Y1 年

这五个连起来就是 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 独立报价,而是:

  1. 维护一个参数化的 surface 模型(SABR、SVI、Heston 都是经典选择)
  2. 实时校准模型参数(用最活跃的几个 strike 的市场价反推)
  3. 用模型外推/内插给整个 chain 报价
  4. 单点报价偏离 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
VXXfront-month + 2nd-month VIX 期货等权 ETN做多 VIX,但 contango 时有 roll cost
UVXY1.5× VIX 期货 ETF高杠杆做多 VIX,衰减更快
SVXY-0.5× VIX 期货 ETF做空 VIX,contango 时受益
VIX 期权期权 on VIX 期货复杂但精确表达观点

7.1 经典 contango 收割("短 VIX")

逻辑:

  1. VIX 期货 80% 时间在 contango
  2. VXX 每天 roll:卖近月(便宜)+ 买远月(贵)→ 持续亏损 → VXX 长期下跌
  3. 长期做空 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 视角:今天学到的迁移性思考

  1. 「平均值」是骗子,必须看分布

    • BS 用一个 σ 描述整只股票,是「平均化」的傲慢
    • 市场用 surface 告诉你:尾部、中间、上涨、下跌 各自的不确定性不一样
    • PM 看 KPI 时也一样:DAU 平均值是骗子,看 P50/P90/P99 留存才真实
    • 销售额平均值是骗子,看不同客户分层、不同 cohort 留存才真实
    • 一句话:任何一维数字描述多维世界,都在隐藏信息
  2. 结构性溢价的本质是「持续不对称的需求」

    • SPY put skew 永远存在是因为长仓机构对冲是结构性买盘
    • 在金融产品设计里,识别结构性需求 → 找到 sustainable monetization
    • 反过来,做卖方就是站在结构性需求的对面,收「保险费」
    • 类比到 PM:SaaS 续费率高的产品本质是「客户离开你比续费更贵」的结构性不对称
  3. 市场不是均衡,是均衡 + 流动

    • Smile 不是「定价错误」,是流动性、需求、风险偏好不对称的均衡产物
    • 任何系统的「异常」往往不是 bug,是约束条件造成的局部最优
    • PM 看到的「用户行为异常」常常也不是 bug,是产品架构的局部最优
    • 想改它,要改约束条件,不是直接改行为
  4. 历史改变模型 ≠ 模型错了,是输入分布变了

    • 1987 之后市场永久性给尾部加价 → BS 假设的对数正态分布不再成立
    • 不是 BS 错了,是 BS 假设的输入(normal distribution)和现实有差距
    • PM 处理用户行为模型也一样:COVID 之后用户预期变了,远程办公变了,老的留存模型必须重新校准
    • 永远问:今天的世界还满足模型当初的假设吗?
  5. 隐含 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 图)/ 笔记 ✓