Black-Scholes 模型 + 隐含波动率(IV)求解
Black-Scholes 五大假设的真实含义、d1/d2 的几何意义、put-call parity、股息调整、IV 是「观点」不是「事实」
日期: 2026-05-26 方向: 期权 / BS / IV 阶段: Phase 1: 基础与工具链 标签: #BlackScholes #ImpliedVolatility #IV #PutCallParity #py_vollib #NumericalMethods
今日目标
| 类型 | 内容 |
|---|---|
| 学习 | Black-Scholes 五大假设的真实含义、d1/d2 的几何意义、put-call parity、股息调整、IV 是「观点」不是「事实」 |
| 实操 | 手写 BS call/put 定价 + 二分法解 IV + Newton-Raphson 解 IV + py_vollib 对照验证,跑 SPY 真实期权链对一遍 |
| 产出 | TR-DAY17 笔记 + tr_lib/options/bs.py + tr_lib/options/iv_solver.py + 与 py_vollib 偏差 < 1e-6 的单元测试 |
一、为什么是 Black-Scholes:站在 1973 年看 2026 年
1973 年 Fischer Black、Myron Scholes、Robert Merton 三人提出 BS 公式那一刻,期权市场还是「场外议价 + 凭感觉」的状态。BS 提供了第一个可计算、可复制对冲、可反推参数的连续时间定价框架。
50 多年后的今天,所有做市商的报价引擎、所有期权链的 IV/Greeks、所有书本里讲的 Delta-Hedging,根都是 BS。我们今天要学的不是 BS 公式本身(公式三行),而是:
- BS 五个假设里哪些必然错、错得多严重、错了之后怎么补
- 从「报价 → IV」反推(IV 求解)的数值方法到底在做什么
- 为什么 IV 是「市场对未来 σ 的观点」而不是 σ 本身
- 在 PM 视角,BS 是**「先用最简单的模型上线,再用补丁修正现实」**的样板工程
二、BS 模型的五大假设:每一条都不真实,每一条都有用
| 假设 | 真实含义 | 现实偏离 | 补丁 |
|---|---|---|---|
| 价格服从几何布朗运动(lognormal) | 收益率正态、价格永远 > 0、无跳跃 | 实际有跳跃(财报、闪崩)、肥尾、波动率聚类 | Merton 跳跃扩散 / Heston 随机波动率 / 蒙特卡洛 |
| 波动率 σ 是常数 | 整个生命周期、所有 strike、所有到期,σ 相同 | 不同 strike 的 IV 不同(volatility smile),不同到期的 IV 也不同(term structure) | Local Vol(Dupire)/ Heston / SVI 曲面拟合 |
| 无摩擦市场 | 无佣金、无 bid-ask spread、无税、可无限借券 | 全部都有,期权 bid-ask 可以达到中间价的 ±10% | 半静态对冲、限价单、做市商点差模型 |
| 连续交易 + 连续 Delta-hedging | 任意时刻可以无成本调仓 | 实际每次调仓有摩擦,离散调仓产生 hedging error | Whalley-Wilmott / Leland 修正 |
| 无套利、无风险利率 r 常数且可借贷 | 借入借出同利率,r 不变 | 借券有 fee(HTB 股票贵)、利率曲线非水平 | 用零息曲线 / repo rate |
核心认知:BS 是个已知有缺陷但极有用的模型。它的价值不在于「定价准」,在于:
- 提供了统一语言(IV/Delta/Gamma/Theta/Vega),让全市场可以对话
- 提供了可微的解析解,让 Delta-Hedging 实现可工程化
- 提供了baseline 价格,让套利者能发现偏离
PM 类比:BS 之于期权 ≈ 双因子认证之于身份认证。明知道短信验证码会被劫持,但「先有个能用的标准,再逐步加 TOTP/passkey 补丁」远好过「等到完美方案再上线」。
三、BS 完整公式与几何直觉
3.1 Call 公式
设标的当前价 S、行权价 K、到期时间 T(年)、无风险利率 r(连续复利)、波动率 σ、连续股息率 q(无股息时 q=0):
C = S·e^(-qT)·N(d1) - K·e^(-rT)·N(d2)
d1 = [ln(S/K) + (r - q + σ²/2)·T] / (σ·√T)
d2 = d1 - σ·√T
其中 N(·) 是标准正态分布的 CDF。
3.2 Put 公式
P = K·e^(-rT)·N(-d2) - S·e^(-qT)·N(-d1)
3.3 d1、d2 是什么
| 项 | 含义(直觉) |
|---|---|
| N(d2) | 风险中性测度下,期权在到期被行权的概率(即 S_T > K 的概率) |
| N(d1) | 风险中性测度下,条件期望 E[S_T · 1_{S_T>K}] / S 的折现因子,几何上 ≈ "如果被行权,预期能拿到的 S 的归一化值" |
| S·e^(-qT)·N(d1) | 期权被行权时,标的现值的「期望」部分 |
| K·e^(-rT)·N(d2) | 行权时支付的 K 的「期望」现值 |
不要被 d1/d2 公式吓到,记住一个直觉:
Call 价值 = 「行权时预期能得到的 S」 - 「行权时要支付的 K」
= S·e^(-qT)·N(d1) - K·e^(-rT)·N(d2)
3.4 Python 实现
# tr_lib/options/bs.py
from __future__ import annotations
import math
from dataclasses import dataclass
from scipy.stats import norm
@dataclass(frozen=True)
class BSInputs:
S: float # spot
K: float # strike
T: float # time to maturity in years
r: float # risk-free rate (cont. compounded)
sigma: float # volatility
q: float = 0.0 # continuous dividend yield
def _d1_d2(p: BSInputs) -> tuple[float, float]:
if p.T <= 0 or p.sigma <= 0:
# degenerate cases handled by callers
raise ValueError("T and sigma must be > 0")
d1 = (math.log(p.S / p.K) + (p.r - p.q + 0.5 * p.sigma ** 2) * p.T) / (p.sigma * math.sqrt(p.T))
d2 = d1 - p.sigma * math.sqrt(p.T)
return d1, d2
def bs_call(p: BSInputs) -> float:
if p.T <= 0:
return max(p.S - p.K, 0.0)
d1, d2 = _d1_d2(p)
return p.S * math.exp(-p.q * p.T) * norm.cdf(d1) - p.K * math.exp(-p.r * p.T) * norm.cdf(d2)
def bs_put(p: BSInputs) -> float:
if p.T <= 0:
return max(p.K - p.S, 0.0)
d1, d2 = _d1_d2(p)
return p.K * math.exp(-p.r * p.T) * norm.cdf(-d2) - p.S * math.exp(-p.q * p.T) * norm.cdf(-d1)
def bs_vega(p: BSInputs) -> float:
"""∂C/∂σ — 与 call/put 相同。单位:1 单位 σ 变化的价格变化(即 σ=0.01 时大约对应 vega/100 的报价变化)。"""
if p.T <= 0 or p.sigma <= 0:
return 0.0
d1, _ = _d1_d2(p)
return p.S * math.exp(-p.q * p.T) * norm.pdf(d1) * math.sqrt(p.T)
四、Put-Call Parity:免费的检查器
4.1 公式
无股息:
C - P = S - K·e^(-rT)
含连续股息率 q:
C - P = S·e^(-qT) - K·e^(-rT)
4.2 为什么这是「免费的」
Put-Call Parity 是纯无套利关系,不依赖 BS 假设、不依赖 σ。只要 r、q 合理,且期权是欧式(American 在无股息时对 call 等价),等式必然成立到 bid-ask spread 范围内。
4.3 三个实战用法
| 用法 | 说明 |
|---|---|
| 检查期权链的合理性 | 拉一组同 K 同 T 的 call/put,算 C - P 和 S·e^(-qT) - K·e^(-rT),差 > spread 中点 → 报价异常或数据有错 |
| 反推隐含股息率 q | 已知 C、P、S、K、T、r → 解出 q。指数 ETF(SPY/QQQ)的隐含 q 应与公告股息接近,否则报价可能有问题 |
| 构造合成头寸 | 想做空但不能借券?用 C - P - S·e^(-qT) + K·e^(-rT) = 0 → long P + short C 等价于 short S。期权来合成股票仓位的基础 |
4.4 代码
def parity_residual(call: float, put: float, S: float, K: float, T: float, r: float, q: float = 0.0) -> float:
"""Returns C - P - (S·e^(-qT) - K·e^(-rT)). Should be ~0 modulo bid-ask spread."""
return call - put - (S * math.exp(-q * T) - K * math.exp(-r * T))
五、股息红利的处理:指数 ETF 不能忽略
5.1 为什么 q 重要
| 标的 | 年化股息率 q | 忽略 q 的影响(1 年期 ATM call) |
|---|---|---|
| TSLA | ≈0% | 可以忽略 |
| AAPL | ≈0.5% | 价格偏差 ~0.5%,小但累计 |
| SPY | ≈1.4% | 价格偏差 ~1.4%,IV 解出来偏高 |
| MSFT | ≈0.7% | 中等 |
| HYG (债 ETF) | ≈5% | 完全不能忽略,否则 IV 错离谱 |
5.2 离散股息 vs 连续股息率
学术界用连续股息率 q,简洁。实务里股票发的是离散股息(每季一次)。两种处理方法:
- Escrowed Dividend Model:从 S 中减去到期前所有股息的现值,再用 BS 定价(更精确,常用于美式期权)
- 连续化近似:q = 年化股息总额 / S(简单,对长期合约够用,短期合约误差大)
对个人量化(90 天计划),用连续化近似够。把 IBKR 期权链里的 q 字段直接拿来用,或者用近 12 个月股息累计 / 当前股价。
5.3 期货合约
对期货期权,r 用 0(持有期货不用付资金成本,但保证金有),公式变成 Black-76,是 BS 的特例。这里不展开,Day 60+ 期货合约时再讲。
六、解 IV:报价 → σ 的反问题
6.1 IV 是什么
Inputs: S, K, T, r, q, σ
BS: σ → C(σ)
IV: C_market → σ_implied
给定一个市场报价 C_market,求 σ 使得 BS(S, K, T, r, q, σ) = C_market。这个 σ 就是隐含波动率(IV)。
注意:
- BS 公式没有 σ 的解析逆函数(不像 d1/d2 可以代入算 C)
- 必须用数值方法
- IV 必然存在且唯一(如果 C_market 在无套利边界内),因为 C 对 σ 严格单调递增(vega > 0)
6.2 二分法(Bisection)
最朴素,最稳。给定 σ 上下界 [σ_lo, σ_hi](例如 [1e-5, 5.0]):
# tr_lib/options/iv_solver.py
def iv_bisection(target_price: float, S: float, K: float, T: float, r: float, q: float = 0.0,
is_call: bool = True, tol: float = 1e-6, max_iter: int = 100) -> float:
lo, hi = 1e-5, 5.0
f = bs_call if is_call else bs_put
# boundary check — if target outside arbitrage bounds, return NaN
intrinsic = max((S - K) if is_call else (K - S), 0.0)
if target_price < intrinsic - 1e-8:
return float('nan')
for _ in range(max_iter):
mid = (lo + hi) / 2
price = f(BSInputs(S=S, K=K, T=T, r=r, sigma=mid, q=q))
if abs(price - target_price) < tol:
return mid
if price < target_price:
lo = mid
else:
hi = mid
return mid # best effort after max_iter
优点:保证收敛(只要解在区间内)、不需要 vega、对边界值鲁棒。 缺点:慢,每次只折半,要 100 次迭代才到 1e-6 精度(log2(5/1e-6) ≈ 23 次,实际更多因为浮点)。
6.3 Newton-Raphson
利用 vega 做切线逼近:
σ_{n+1} = σ_n - [BS(σ_n) - C_market] / vega(σ_n)
def iv_newton(target_price: float, S: float, K: float, T: float, r: float, q: float = 0.0,
is_call: bool = True, tol: float = 1e-8, max_iter: int = 50) -> float:
sigma = 0.3 # initial guess
f = bs_call if is_call else bs_put
for _ in range(max_iter):
p = BSInputs(S=S, K=K, T=T, r=r, sigma=sigma, q=q)
price = f(p)
diff = price - target_price
if abs(diff) < tol:
return sigma
v = bs_vega(p)
if v < 1e-12:
# fall back to bisection if vega ~ 0 (deep ITM/OTM)
return iv_bisection(target_price, S, K, T, r, q, is_call)
sigma = sigma - diff / v
if sigma <= 0:
sigma = 1e-5 # clamp
return sigma
优点:通常 5-10 次迭代到 1e-8 精度,比二分法快 10 倍。 缺点:
- 深度 ITM/OTM 时 vega 接近 0,分母不稳定,可能发散
- 初值差时可能跳出合理区间
- 对极短到期(DTE<2)数值很脆
实战建议:混合策略 — Newton 跑 8-10 次没收敛就 fallback 到 bisection。生产代码必须有 fallback。
6.4 py_vollib 用的方法
py_vollib(C 后端 py_lets_be_rational)实现的是 Peter Jäckel 2015 年的 "Let's Be Rational" 算法:
- 用 normalized Black formula 重写定价
- 选择更稳定的初值(基于 Householder 三阶逼近)
- 每次迭代利用 normal cdf 的特殊性质
- 平均 2-3 次迭代收敛到机器精度(1e-15)
- 对深度 OTM 也稳定
结论:生产用 py_vollib,自己写的代码用于学习和兜底。我们今天写一遍是为了理解原理,不是为了用自己写的版本。
6.5 三种方法对比
| 方法 | 平均迭代次数 | 精度 | 鲁棒性 | 实现复杂度 |
|---|---|---|---|---|
| Bisection | 20-30 | 1e-6 | ★★★★★ | 极简 |
| Newton-Raphson | 5-10 | 1e-8 | ★★★ | 简单 |
| Brent's method | 8-15 | 1e-10 | ★★★★ | 中等 |
| Let's Be Rational (py_vollib) | 2-3 | 1e-15 | ★★★★★ | 复杂(用现成的) |
七、自己写 vs py_vollib:跑一遍对比
7.1 验证脚本
# scripts/tr_day17_iv_check.py
import py_vollib.black_scholes_merton.implied_volatility as vlib
from tr_lib.options.bs import bs_call, bs_put, BSInputs
from tr_lib.options.iv_solver import iv_bisection, iv_newton
cases = [
# (S, K, T, r, q, sigma_true, flag)
(450, 450, 30/365, 0.045, 0.014, 0.15, 'c'), # SPY ATM 1M
(450, 470, 30/365, 0.045, 0.014, 0.18, 'c'), # OTM call
(450, 430, 30/365, 0.045, 0.014, 0.20, 'p'), # OTM put
(450, 450, 7/365, 0.045, 0.014, 0.12, 'c'), # short-dated
(450, 500, 90/365, 0.045, 0.014, 0.22, 'c'), # deep OTM 3M
]
print(f"{'S':>5} {'K':>5} {'T':>6} {'true σ':>7} {'mine':>10} {'pyvol':>10} {'diff':>10}")
for S, K, T, r, q, sigma, flag in cases:
p = BSInputs(S=S, K=K, T=T, r=r, sigma=sigma, q=q)
price = bs_call(p) if flag == 'c' else bs_put(p)
iv_mine = iv_newton(price, S, K, T, r, q, is_call=(flag == 'c'))
iv_lib = vlib.implied_volatility(price, S, K, T, r, q, flag)
print(f"{S:>5} {K:>5} {T:>6.3f} {sigma:>7.4f} {iv_mine:>10.6f} {iv_lib:>10.6f} {abs(iv_mine-iv_lib):>10.2e}")
7.2 预期输出
S K T true σ mine pyvol diff
450 450 0.082 0.1500 0.150000 0.150000 1.23e-08
450 470 0.082 0.1800 0.180000 0.180000 2.55e-09
450 430 0.082 0.2000 0.200000 0.200000 8.81e-10
450 450 0.019 0.1200 0.120000 0.120000 4.12e-09
450 500 0.247 0.2200 0.220000 0.220000 3.07e-09
两边差距 < 1e-6 就算自己的实现过关。如果 diff > 1e-3,说明:
- 公式 bug(最常见是 d1/d2 里的 q 漏了)
- Newton 初值不好导致发散
- norm.cdf 实现精度问题
八、IV 不是「σ 的真值」:理解 IV 是什么的「观点」
8.1 三个 σ
| 名称 | 定义 | 性质 |
|---|---|---|
| Realized Volatility (RV) | 过去 N 天对数收益率的标准差年化 | 历史,事后,确定值 |
| Forecast Volatility (FV) | 用模型预测未来 σ(GARCH/HAR-RV 等) | 估计,可能错 |
| Implied Volatility (IV) | 从期权报价反推的 σ | 市场共识的预期,可能与 RV/FV 都不同 |
8.2 IV 不等于「未来的真 σ」
经验性事实:
IV > RV(未来实现) 通常 (IV 平均高估 1-3 个 vol 点)→ 这是卖期权能赚钱的根本原因
IV < RV(未来实现) 偶尔 (黑天鹅前夕)
IV = RV 几乎从不
IV 是市场对未来 σ 的「报价共识」,包含三层东西:
- 统计预期(如果做市商用 GARCH 估的话)
- 风险溢价(做市商不愿白白承担 Gamma 风险,要 markup)
- 供需失衡(保险买盘多 → IV 抬高)
学术语言:IV = E^Q[σ](在风险中性测度 Q 下的期望),而 RV ≈ E^P[σ](在物理测度 P 下的期望)。两者差距就是 Variance Risk Premium (VRP)。
8.3 这对策略意味着什么
| 策略思路 | 依赖的 IV vs RV 关系 |
|---|---|
| 卖期权吃 VRP(covered call、CSP、credit spread) | IV > 未来 RV(统计上长期成立) |
| 买保险(protective put、tail hedge) | 接受 IV > RV 的成本,换尾部保护 |
| Vol arb(卖 IV 高的、买 IV 低的) | 同标的不同 K/T 的 IV 应该有结构,套利偏离 |
| 事件交易(earnings straddle) | 事件前 IV 涨、事件后崩;交易的是 IV 路径不是方向 |
Day 18 会用 IV Rank / IV Percentile 把这种「IV 在历史区间的位置」做成可交易的信号。
九、IV Smile / Skew:BS 假设失效的最直接证据
9.1 现象
如果 BS 假设成立(σ 常数),那么同一标的、同一到期日、不同 strike 的期权 IV 应该都一样。
实际市场:
SPY 30-DTE IV (2026-05-26 报价示意):
K=420 (deep OTM put) → IV = 28% ← 高(恐慌溢价)
K=440 (OTM put) → IV = 19%
K=450 (ATM) → IV = 15% ← 最低
K=460 (OTM call) → IV = 14%
K=480 (deep OTM call) → IV = 13% ← 略低
把 IV 对 K 画图,股票/股指呈现「左高右低」的曲线,叫 volatility skew(也叫 leverage smile、reverse smile)。 外汇/单股经常是对称的「两边高中间低」,叫 volatility smile。
9.2 为什么有 skew
- 股市崩盘历史:1987 黑色星期一之后,做市商对左尾保护要求更高溢价 → OTM put IV 抬升
- 杠杆效应:股票跌时,企业 D/E 比率上升 → 实际波动率确实在下跌时更大 → 左尾肥
- 保险需求:机构投资人长期是 put 的净买方(对冲 long 仓位),需求推高 OTM put 价
- 没有上方崩盘:股市不会突然大涨 50%,但会突然大跌 50% → 分布天然右偏(log return 左偏)
9.3 这意味着什么
- BS 公式给你「一个 σ」是不对的,市场实际有「σ(K, T)」的曲面
- 用 ATM IV 给 OTM 期权定价会低估 OTM put 的价格
- 但反向利用:把每个 K 的 IV 单独反推,你就有了一张 IV smile,可以用来发现「这个 K 的 IV 偏离 smile 太多 → 可能错价」
- Day 20-21 会画 SPY 真实 IV smile,并用 SVI 模型拟合
十、BS 在实战里的失败模式
10.1 杠杆型 ETF(TQQQ / SOXL / UVXY)
3x 杠杆 ETF 的日收益是底层标的的 3x,但长期对数收益不是 3x(volatility drag)。BS 假设 lognormal 完全不适用。这类标的的期权要用杠杆调整的 vol model,或者干脆不交易(个人量化建议直接 skip)。
10.2 Inverse ETF(SQQQ / SH)
价格有 floor(不会变负),但 BS 假设价格可以 → 0。深度 ITM call 定价偏差大。
10.3 Earnings Event
财报前一周 IV 会暴涨,因为期权价格里 priced-in 一个跳跃风险溢价,而 BS 没有跳跃项。这时候用 BS 反推的 IV 包含了 jump premium,不是真正的 diffusion vol。
应对方法:
- 把 earnings 期间的 IV 拆成 diffusion IV + event vol(earnings calendar 工具如 ORATS、Volga 提供)
- 不要用 earnings 前的 IV 直接做 IV percentile 排序(会严重偏高)
10.4 接近到期(< 5 DTE)
T → 0 时:
- vega → 0,IV 解出来对价格极敏感(spread 里的 1 美分能让 IV 跳 5%)
- gamma → ∞,hedging 几乎不可能
- BS 假设的连续 hedging 完全失效
- 个人量化建议:< 5 DTE 不持仓,不交易。机构 0DTE 玩家是另一套生态。
10.5 高股息密集付息日附近
离散股息 + 美式期权 + 行权决策,BS 完全失效。AAPL 季度股息日前的 deep ITM call 可能被提前行权。用 Cox-Ross-Rubinstein 二叉树 或 Bjerksund-Stensland 美式期权近似。
十一、PM 视角:BS 教给我做产品的 5 件事
-
先有模型,再有补丁 — BS 的伟大不在「准」,在于提供了一个能用的 baseline,让整个行业开始迭代。这正是产品做 MVP 的精髓:先上线最朴素的版本,让市场用,再用补丁修。
-
显式声明假设 — BS 把 5 个假设写得明明白白,所有人都知道在哪儿会失效。坏的产品文档把假设藏起来,好的产品文档把假设贴脸上。我们写 PRD、设计 API 时,应该学 BS:明确列出适用条件。
-
可观测的偏差就是产品 backlog — IV smile 不是 BS 的失败,是 BS 的「监控指标」。每次 smile 偏离正常形状,就是市场在告诉你「这里有信息」。产品的 backlog 不来自需求文档,来自指标偏离。
-
数值方法 = 实现细节,关键是方法的选择 — 二分法 vs Newton vs Let's Be Rational,选错了系统就崩。产品里类似的选择无处不在(同步 vs 异步、强一致 vs 最终一致)。没有最好的方法,只有最合适的方法。
-
「现成的」永远值得评估一次 — py_vollib 比自己写的快 10 倍、稳 100 倍、精度高 10^9 倍。自己写一遍是为了理解,生产用现成的是为了存活。产品里也一样:自建消息队列还是用 Kafka?写一遍 toy 版本理解原理,生产直接用 Kafka。
十二、Day 17 实操 Checklist
按顺序:
- (1) 装 py_vollib:
pip install py_vollib==1.0.1(注意是 py_vollib,不是 py-vollib) - (2) 创建
tr_lib/options/bs.py,把第 3.4 节代码抄进去 - (3) 创建
tr_lib/options/iv_solver.py,二分法 + Newton 都实现,Newton 失败时 fallback 到二分 - (4) 创建
tests/test_bs.py,验证:- bs_call + put-call parity 自洽(5 组随机参数,残差 < 1e-10)
- 自己的 IV solver 与 py_vollib 差距 < 1e-6(10 组参数)
- 极端值不崩(T=1e-6、σ=5、deep OTM)
- (5) 跑
scripts/tr_day17_iv_check.py,确认输出与第 7.2 节预期一致 - (6) 用 ib_insync 拉一次 SPY 30-DTE 完整期权链,对每个 strike 算 IV,画一条 smile(matplotlib 散点图)
- (7) 用 put-call parity 检查 SPY 期权链,找出 |residual| > 0.05 的异常报价(通常是 illiquid 或 stale 报价)
- (8) 更新
docs/daily/TR_PROGRESS.mdWeek 3 / Day 17 标 ✅ - (9) 本笔记最后填「实际执行记录」
十三、知识结构图(Day 15-17 串联)
Day 15: 期权基础(合约/Greek 概念)
│
▼
Day 16: Greeks 直觉(Delta/Gamma/Theta/Vega/Rho)
│
▼
Day 17: BS 模型 + IV 求解 ← 你在这里
│
├──→ Day 18: IV Rank / IV Percentile(IV 是观点 → 排序成信号)
│
├──→ Day 19: Vol smile / skew / term structure(曲面建模)
│
└──→ Day 20-21: Greeks 在期权组合里的合成与 hedging
│
▼
Week 4: 期权策略(CSP / CC / spread / Iron Condor)
十四、明日预告
Day 18: IV Rank / IV Percentile — 把 IV 从「值」变成「信号」
- 为什么单看 IV 的绝对值没意义(TSLA 50% IV 是低,SPY 50% IV 是天塌)
- IV Rank = (current IV - 1y min) / (1y max - 1y min)
- IV Percentile = % of past 1y days where IV < current IV
- 两者差异、各自适用场景
- 用 yfinance/IBKR 拉 1 年 IV30 历史,给 5 个标的算出 IV Rank
- 卖期权策略的 「IV Rank > 50 才入场」 规则的统计依据
- IV Mean Reversion 现象:IV 高了真的会回落吗?做一次 backtest 验证
实际执行记录
启动一项填一项,时间戳 + 卡点。
- [hh:mm] 装 py_vollib — ...
- [hh:mm]
bs.py写完 — ... - [hh:mm]
iv_solver.py写完 — ... - [hh:mm] test_bs.py 全过 — diff 最大 = ...
- [hh:mm] SPY 期权链 IV smile 画完 — ATM IV = ..., 25Δ put IV = ..., 25Δ call IV = ...
- [hh:mm] Put-call parity 异常报价数 — ...
- 今日最大认知收获:
- 卡点 / 困惑:
总字数:约 6,400 字 今日完成度:理论 ✓ / 实操(你自己执行)/ 笔记 ✓