返回交易笔记
TR Day 17

Black-Scholes 模型 + 隐含波动率(IV)求解

Black-Scholes 五大假设的真实含义、d1/d2 的几何意义、put-call parity、股息调整、IV 是「观点」不是「事实」

2026-05-26
Phase 1: 基础与工具链
BlackScholesImpliedVolatilityIVPutCallParitypy_vollibNumericalMethods

日期: 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 公式本身(公式三行),而是:

  1. BS 五个假设里哪些必然错、错得多严重、错了之后怎么补
  2. 从「报价 → IV」反推(IV 求解)的数值方法到底在做什么
  3. 为什么 IV 是「市场对未来 σ 的观点」而不是 σ 本身
  4. 在 PM 视角,BS 是**「先用最简单的模型上线,再用补丁修正现实」**的样板工程

二、BS 模型的五大假设:每一条都不真实,每一条都有用

假设真实含义现实偏离补丁
价格服从几何布朗运动(lognormal)收益率正态、价格永远 > 0、无跳跃实际有跳跃(财报、闪崩)、肥尾、波动率聚类Merton 跳跃扩散 / Heston 随机波动率 / 蒙特卡洛
波动率 σ 是常数整个生命周期、所有 strike、所有到期,σ 相同不同 strike 的 IV 不同(volatility smile),不同到期的 IV 也不同(term structureLocal Vol(Dupire)/ Heston / SVI 曲面拟合
无摩擦市场无佣金、无 bid-ask spread、无税、可无限借券全部都有,期权 bid-ask 可以达到中间价的 ±10%半静态对冲、限价单、做市商点差模型
连续交易 + 连续 Delta-hedging任意时刻可以无成本调仓实际每次调仓有摩擦,离散调仓产生 hedging errorWhalley-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,简洁。实务里股票发的是离散股息(每季一次)。两种处理方法:

  1. Escrowed Dividend Model:从 S 中减去到期前所有股息的现值,再用 BS 定价(更精确,常用于美式期权)
  2. 连续化近似: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 三种方法对比

方法平均迭代次数精度鲁棒性实现复杂度
Bisection20-301e-6★★★★★极简
Newton-Raphson5-101e-8★★★简单
Brent's method8-151e-10★★★★中等
Let's Be Rational (py_vollib)2-31e-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 是市场对未来 σ 的「报价共识」,包含三层东西:

  1. 统计预期(如果做市商用 GARCH 估的话)
  2. 风险溢价(做市商不愿白白承担 Gamma 风险,要 markup)
  3. 供需失衡(保险买盘多 → 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 smilereverse smile)。 外汇/单股经常是对称的「两边高中间低」,叫 volatility smile

9.2 为什么有 skew

  1. 股市崩盘历史:1987 黑色星期一之后,做市商对左尾保护要求更高溢价 → OTM put IV 抬升
  2. 杠杆效应:股票跌时,企业 D/E 比率上升 → 实际波动率确实在下跌时更大 → 左尾肥
  3. 保险需求:机构投资人长期是 put 的净买方(对冲 long 仓位),需求推高 OTM put 价
  4. 没有上方崩盘:股市不会突然大涨 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 件事

  1. 先有模型,再有补丁 — BS 的伟大不在「准」,在于提供了一个能用的 baseline,让整个行业开始迭代。这正是产品做 MVP 的精髓:先上线最朴素的版本,让市场用,再用补丁修。

  2. 显式声明假设 — BS 把 5 个假设写得明明白白,所有人都知道在哪儿会失效。坏的产品文档把假设藏起来,好的产品文档把假设贴脸上。我们写 PRD、设计 API 时,应该学 BS:明确列出适用条件。

  3. 可观测的偏差就是产品 backlog — IV smile 不是 BS 的失败,是 BS 的「监控指标」。每次 smile 偏离正常形状,就是市场在告诉你「这里有信息」。产品的 backlog 不来自需求文档,来自指标偏离

  4. 数值方法 = 实现细节,关键是方法的选择 — 二分法 vs Newton vs Let's Be Rational,选错了系统就崩。产品里类似的选择无处不在(同步 vs 异步、强一致 vs 最终一致)。没有最好的方法,只有最合适的方法。

  5. 「现成的」永远值得评估一次 — 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.md Week 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 字 今日完成度:理论 ✓ / 实操(你自己执行)/ 笔记 ✓