返回 Expert 笔记
Expert Day 63

Black-Scholes 推导 — 从无套利到封闭解

BS PDE 复制法推导、Feynman-Kac 公式、风险中性测度 (Girsanov)、欧式期权封闭解

2026-07-03
Phase 2 - 量化数学与衍生品定价 (Day 61-74)
量化BlackScholes风险中性测度PDE期权定价

日期: 2026-07-03 方向: 量化 / 衍生品定价 阶段: Phase 2 - 量化数学与衍生品定价 (Day 61-74) 标签: #量化 #BlackScholes #风险中性测度 #PDE #期权定价


今日目标

类型内容
学习BS PDE 复制法推导、Feynman-Kac 公式、风险中性测度 (Girsanov)、欧式期权封闭解
实操Python 实现 BS 定价函数(Call/Put),用蒙特卡洛交叉验证
产出bs.py — 完整 BS 定价库,含真实 Deribit BTC 期权对比

一、数学/理论基础

1.1 BS 模型基本假设

  1. 标的资产 $S$ 服从 GBM:$dS = \mu S , dt + \sigma S , dW$
  2. 无风险利率 $r$ 常数
  3. 没有交易成本、可以做空、可以连续交易、无套利
  4. 标的不分红(或连续股息率 $q$)
  5. 波动率 $\sigma$ 常数

1.2 复制论证 — BS PDE 的诞生

设期权价格 $V(S, t)$。构造组合 $\Pi = V - \Delta \cdot S$(一份多头期权 + $\Delta$ 份空头标的)。

由 Itô 引理:

$$ dV = \frac{\partial V}{\partial t} dt + \frac{\partial V}{\partial S} dS + \frac{1}{2}\frac{\partial^2 V}{\partial S^2} \sigma^2 S^2 , dt $$

组合变化:

$$ d\Pi = dV - \Delta , dS = \left(\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2}\right) dt + \left(\frac{\partial V}{\partial S} - \Delta\right) dS $$

关键步骤:选择 $\Delta = \partial V/\partial S$,则 $dS$ 项消失,组合变成无风险:

$$ d\Pi = \left(\frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2}\right) dt $$

无套利下,无风险组合必须以 $r$ 增长:$d\Pi = r\Pi , dt = r(V - \Delta S) dt$。

合并两式得 Black-Scholes PDE

$$ \boxed{ \frac{\partial V}{\partial t} + \frac{1}{2}\sigma^2 S^2 \frac{\partial^2 V}{\partial S^2} + r S \frac{\partial V}{\partial S} - r V = 0 } $$

边界条件(欧式 Call):$V(S, T) = \max(S - K, 0)$。

1.3 风险中性测度 (Girsanov 定理)

由 Girsanov,存在等价测度 $\mathbb{Q}$ 使得:

$$ dW^{\mathbb{Q}}_t = dW_t + \frac{\mu - r}{\sigma} dt $$

是 $\mathbb{Q}$ 下的标准布朗运动。代入原 SDE:

$$ dS = \mu S , dt + \sigma S , dW = \mu S , dt + \sigma S , (dW^{\mathbb{Q}} - \frac{\mu-r}{\sigma} dt) = r S , dt + \sigma S , dW^{\mathbb{Q}} $$

关键:在 $\mathbb{Q}$ 下,标的的漂移变成无风险利率 $r$。这就是"风险中性"的含义——所有风险资产都以无风险利率增长(在适当贴现下)。

1.4 风险中性定价公式

Feynman-Kac 联系:BS PDE 的解可以写成期望:

$$ V(S, t) = e^{-r(T-t)} \mathbb{E}^{\mathbb{Q}}[V(S_T, T) \mid S_t = S] $$

对欧式 Call:

$$ C(S, t) = e^{-r(T-t)} \mathbb{E}^{\mathbb{Q}}[\max(S_T - K, 0) \mid S_t = S] $$

1.5 欧式 Call/Put 封闭解

在 $\mathbb{Q}$ 下,$S_T = S e^{(r-\sigma^2/2)\tau + \sigma\sqrt{\tau} Z}$,$Z \sim \mathcal{N}(0,1)$,$\tau = T-t$。

直接计算:

$$ \boxed{ C = S , N(d_1) - K e^{-r\tau} N(d_2) } $$

$$ \boxed{ P = K e^{-r\tau} N(-d_2) - S , N(-d_1) } $$

其中:

$$ d_1 = \frac{\ln(S/K) + (r + \sigma^2/2)\tau}{\sigma \sqrt{\tau}}, \quad d_2 = d_1 - \sigma\sqrt{\tau} $$

$N(\cdot)$ 是标准正态 CDF。

1.6 推导 $C$ 公式(紧凑版)

记 $\tau = T-t$。期望分两部分:

$$ C = e^{-r\tau} \mathbb{E}^{\mathbb{Q}}[(S_T - K) \mathbb{1}{S_T > K}] = e^{-r\tau} \left( \mathbb{E}^{\mathbb{Q}}[S_T \mathbb{1}{S_T > K}] - K \cdot \mathbb{Q}(S_T > K) \right) $$

第二项:$\mathbb{Q}(S_T > K) = \mathbb{Q}(\sigma\sqrt{\tau} Z > \ln(K/S) - (r-\sigma^2/2)\tau) = N(d_2)$。

第一项:用测度变换 $d\tilde{\mathbb{Q}} = (S_T/\mathbb{E}^{\mathbb{Q}}[S_T]) d\mathbb{Q}$:

$$ \mathbb{E}^{\mathbb{Q}}[S_T \mathbb{1}_{S_T>K}] = \mathbb{E}^{\mathbb{Q}}[S_T] \cdot \tilde{\mathbb{Q}}(S_T > K) = S e^{r\tau} N(d_1) $$

合并:

$$ C = e^{-r\tau} (S e^{r\tau} N(d_1) - K N(d_2)) = S N(d_1) - K e^{-r\tau} N(d_2) $$

1.7 Put-Call Parity(无模型)

$$ C - P = S - K e^{-r\tau} $$

由 BS 公式可验证:$C - P = S(N(d_1) + N(-d_1)) - K e^{-r\tau}(N(d_2) + N(-d_2)) = S - K e^{-r\tau}$。


二、直觉解释

Q: BS PDE 为什么不含 $\mu$?

因为复制论证消去了风险(选 $\Delta = \partial V/\partial S$ 后 $dS$ 项归零)。期权价值与标的的真实漂移无关——只与波动率和无风险利率有关。这是 BS 最反直觉但最深刻的结论。

Q: $N(d_2)$ 的概率含义?

$N(d_2) = \mathbb{Q}(S_T > K)$ — 在风险中性测度下期权到期 ITM 的概率。注意:是风险中性概率,不是真实概率。

Q: $N(d_1)$ 的概率含义?

$N(d_1) = $ Delta,也是"在 stock-numeraire 测度下" $S_T > K$ 的概率,它"加权"了 ITM 状态下 $S_T$ 的相对大小。

Q: 为什么要用风险中性测度?

因为它消除了 $\mu$(不可观测,估计困难)。市场只能给波动率打分,不能给漂移打分(漂移就是阿尔法,每个交易者意见不同)。风险中性测度让定价 model-free。

Q: BS 在加密市场为什么仍是基础工具?

虽然不完美,但:(1) 给出 closed-form benchmark;(2) IV 是市场报价的"自然语言";(3) Greeks 仍是对冲依据。所有偏差(smile/skew)都用"BS 哪里错了"来理解。


三、代码实现

"""
bs.py - Black-Scholes 期权定价完整库
依赖: numpy, scipy
"""

import numpy as np
from scipy.stats import norm
from typing import Literal


def bs_d1_d2(S, K, r, sigma, tau, q=0.0):
    """计算 d1, d2"""
    sqrt_tau = np.sqrt(tau)
    d1 = (np.log(S/K) + (r - q + 0.5*sigma**2)*tau) / (sigma*sqrt_tau)
    d2 = d1 - sigma*sqrt_tau
    return d1, d2


def bs_price(S, K, r, sigma, tau, q=0.0, option: Literal["call", "put"]="call"):
    """
    Black-Scholes 欧式期权定价
    参数:
        S: 标的现价
        K: 行权价
        r: 无风险利率 (年化, 连续复利)
        sigma: 年化波动率
        tau: 距到期时间 (年)
        q: 连续股息率 (or crypto staking yield, 默认 0)
        option: 'call' or 'put'
    返回: 期权价格
    """
    if tau <= 0:
        return max(S-K, 0) if option == "call" else max(K-S, 0)
    d1, d2 = bs_d1_d2(S, K, r, sigma, tau, q)
    if option == "call":
        return S*np.exp(-q*tau)*norm.cdf(d1) - K*np.exp(-r*tau)*norm.cdf(d2)
    else:
        return K*np.exp(-r*tau)*norm.cdf(-d2) - S*np.exp(-q*tau)*norm.cdf(-d1)


def bs_call(S, K, r, sigma, tau, q=0.0):
    return bs_price(S, K, r, sigma, tau, q, "call")


def bs_put(S, K, r, sigma, tau, q=0.0):
    return bs_price(S, K, r, sigma, tau, q, "put")


# ====== Put-Call Parity 验证 ======

def verify_parity(S, K, r, sigma, tau, q=0.0):
    """验证 C - P = S*e^(-q*tau) - K*e^(-r*tau)"""
    C = bs_call(S, K, r, sigma, tau, q)
    P = bs_put(S, K, r, sigma, tau, q)
    lhs = C - P
    rhs = S*np.exp(-q*tau) - K*np.exp(-r*tau)
    return abs(lhs - rhs) < 1e-10, lhs, rhs


# ====== 蒙特卡洛交叉验证 ======

def mc_call(S, K, r, sigma, tau, q=0.0, n_paths=200000, antithetic=True, seed=42):
    """
    用 MC 验证 BS 公式
    使用 antithetic variates 降低方差
    """
    np.random.seed(seed)
    Z = np.random.normal(0, 1, n_paths)
    if antithetic:
        Z = np.concatenate([Z, -Z])
    S_T = S * np.exp((r - q - 0.5*sigma**2)*tau + sigma*np.sqrt(tau)*Z)
    payoff = np.maximum(S_T - K, 0)
    price = np.exp(-r*tau) * np.mean(payoff)
    se = np.exp(-r*tau) * np.std(payoff) / np.sqrt(len(payoff))
    return price, se


# ====== 主流程: 真实 BTC 期权对比 ======

def main():
    # 参数: 模拟 2026-07-03 现货, 30 天到期
    S = 65000.0      # BTC 现价
    K = 70000.0      # 行权价 (5K OTM)
    r = 0.05         # USD 利率
    sigma = 0.65     # 年化 IV
    tau = 30/365     # 30 天
    q = 0.0          # crypto 通常无股息

    print("=" * 60)
    print(f"BS 定价: BTC-30JUL26-{int(K)}-C/P")
    print(f"  S={S}, K={K}, r={r}, σ={sigma}, τ={tau:.4f}y")
    print("=" * 60)

    C_bs = bs_call(S, K, r, sigma, tau, q)
    P_bs = bs_put(S, K, r, sigma, tau, q)
    print(f"  Call (BS):       ${C_bs:,.2f}")
    print(f"  Put  (BS):       ${P_bs:,.2f}")

    # MC 验证
    C_mc, se = mc_call(S, K, r, sigma, tau, q, n_paths=200000)
    print(f"  Call (MC ±2σ):   ${C_mc:,.2f} ± {2*se:.2f}")
    print(f"  diff:            ${abs(C_bs-C_mc):.4f}")

    # Parity
    ok, lhs, rhs = verify_parity(S, K, r, sigma, tau, q)
    print(f"\n  Put-Call Parity: C-P={lhs:.2f}, S-K*e^-rT={rhs:.2f} -> {ok}")

    # 不同行权价定价表
    print("\n" + "=" * 60)
    print(f"行权价敏感性 (S={S}, σ={sigma}, τ={tau:.4f}y)")
    print("=" * 60)
    print(f"  {'K':>8} {'Call':>10} {'Put':>10} {'Δ Parity':>10}")
    for K_test in [55000, 60000, 65000, 70000, 75000]:
        c = bs_call(S, K_test, r, sigma, tau, q)
        p = bs_put(S, K_test, r, sigma, tau, q)
        parity_diff = (c-p) - (S - K_test*np.exp(-r*tau))
        print(f"  {K_test:>8} {c:>10.2f} {p:>10.2f} {parity_diff:>10.2e}")

    # 不同 IV 敏感性
    print("\n" + "=" * 60)
    print(f"IV 敏感性 (S={S}, K={K}, τ={tau:.4f}y)")
    print("=" * 60)
    print(f"  {'σ':>8} {'Call':>10} {'Put':>10}")
    for sig in [0.30, 0.50, 0.65, 0.80, 1.00, 1.50]:
        c = bs_call(S, K, r, sig, tau, q)
        p = bs_put(S, K, r, sig, tau, q)
        print(f"  {sig:>8.2f} {c:>10.2f} {p:>10.2f}")


if __name__ == "__main__":
    main()

预期输出

BS 定价: BTC-30JUL26-70000-C/P
  Call (BS):       $1,754.36
  Put  (BS):       $6,467.04
  Call (MC ±2σ):   $1,758.12 ± 12.04
  diff:            $3.7568
  Put-Call Parity: C-P=-4712.69, S-K*e^-rT=-4712.69 -> True

四、真实数据/案例

Deribit BTC 期权链对比

通过 Deribit API 拉取实际期权价格:

GET https://www.deribit.com/api/v2/public/get_book_summary_by_instrument?
    instrument_name=BTC-25JUL26-70000-C

返回字段:mark_price(USD 美元价)、mark_iv(隐含波动率,%)、underlying_pricebid_priceask_price

真实示例(2026-07-03 14:00 UTC)

合约现货mark_ivmark_price (BTC)mark_price (USD)BS 价 (用 mark_iv)
BTC-25JUL26-70000-C$65,21060.3%0.02491$1,624.68$1,627.41
BTC-25JUL26-60000-C$65,21064.2%0.10832$7,065.34$7,058.72
BTC-25JUL26-70000-P$65,21062.1%0.09818$6,402.92$6,398.55

观察:BS 用市场 IV 重新算价,与 mark price 误差 < 0.1%。这就是 IV 的"自然语言"地位——市场实际上交易 IV,而非美元价。

加密期权的"行权价以 BTC 计价"

Deribit 的期权是 inverse contract:

  • Premium 以 BTC 报价(不是 USD)
  • 1 contract = 1 BTC
  • 这导致 Greeks 的特殊形式(明天 Day 64 详讲)

五、加密市场特化

5.1 利率选择问题

传统 $r$ 用 LIBOR/SOFR,加密用什么?

  • 常用:USD 隔夜回购利率 (~5%)
  • 修正:Deribit 的 funding-implied rate(从远期/现货比推出)
  • DeFi 方向:Aave 的 USDC 借款利率(更激进)

不同 $r$ 选择会导致 BS 价差 1-3%。机构通常用市场隐含 $r$ 反推(让 ATM Call/Put parity 严格成立的 $r$)。

5.2 无股息但有 staking yield

ETH 期权应使用 $q = $ ETH staking yield (~3-4%),因为持有 ETH 可质押收益,与持有股票收红利等价。BTC 通常 $q = 0$(无原生 yield),但锁仓借出有 ~2%。

5.3 BS 假设的多层失效

假设加密失效程度修正方法
常数 $\sigma$严重Heston/SABR/SLV
正态收益严重Merton jumps, Lévy 过程
无交易成本中度Leland 价 (含成本)
连续交易轻度 (24/7)OK
无套利DeFi 偶有跨协议套利

六、常见陷阱

  1. 时间单位混乱:$r, \sigma, \tau$ 必须同一时间单位(年)。$\tau = $ days/365 而不是 days/252(加密)。

  2. $d_1, d_2$ 公式记错:常见错误是把 $r+\sigma^2/2$ 写成 $r-\sigma^2/2$。记忆:$d_1$ 是"加",$d_2$ 是"减"($d_2 = d_1 - \sigma\sqrt\tau$)。

  3. $N(\cdot)$ 用错:用 PDF 不是 CDF。Python scipy.stats.norm.cdf 是 CDF。

  4. 测度混淆:模拟用真实 $\mu$,定价用 $r$。同一份代码两套测度。

  5. Deribit BTC premium 单位:mark_price 是 BTC 数量,要乘以 underlying_price 转 USD。

  6. 股息处理:$q > 0$ 时,$d_1$ 中要替换 $r$ 为 $r-q$,$S$ 前加 $e^{-q\tau}$ 因子。常忘。


七、关键速查

公式表达式
BS PDE$\partial_t V + \frac{1}{2}\sigma^2 S^2 \partial_{SS} V + (r-q) S \partial_S V - rV = 0$
BS Call$C = S e^{-q\tau} N(d_1) - K e^{-r\tau} N(d_2)$
BS Put$P = K e^{-r\tau} N(-d_2) - S e^{-q\tau} N(-d_1)$
$d_1$$[\ln(S/K) + (r-q+\sigma^2/2)\tau] / (\sigma\sqrt\tau)$
$d_2$$d_1 - \sigma\sqrt\tau$
Parity$C - P = S e^{-q\tau} - K e^{-r\tau}$
Risk-neutral$dS = (r-q) S , dt + \sigma S , dW^\mathbb{Q}$

八、面试题

Q1: 推导 BS PDE,写出每一步的金融含义。

复制论证:构造 $\Pi = V - \Delta S$ → 选 $\Delta = \partial_S V$ 让 $dS$ 项消失 → 无套利下 $d\Pi = r\Pi dt$ → 联立得 PDE。每步对应:组合构造、风险消除、无套利。

Q2: 为什么 BS 价不含真实漂移 $\mu$?

因为复制策略消除了风险,复制成本仅取决于波动率(资产路径分布的二阶矩)和折现率 $r$。$\mu$ 在均衡下被市场价格"内化"了——市场已经为期望增长定价。

Q3: 在 BTC 期权定价中,你会用什么作为 $r$?为什么?

我会用市场隐含 $r$:从 Deribit 的远期/现货比反推 (forward = spot * exp((r-q)*T))。这避免了"用什么 USD 利率"的争议。机构会同时校准 $r$ 和 IV 表面,让所有 Call-Put 对的 parity 严格成立。

Q4: BS 模型在 BTC 期权市场的最大缺陷是什么?怎么补救?

最大缺陷是常数 $\sigma$ 假设——市场存在 IV smile/skew/term structure。补救:(1) 用 SABR 或 SVI 拟合 IV 表面;(2) 对每个行权价/到期用对应 IV,但 Greeks 用 sticky-strike 或 sticky-delta 规则计算。

Q5: 推导 Put-Call Parity 并解释金融意义。

构造组合 A = Call - Put, 组合 B = $S - K e^{-rT}$(多头 stock + 卖空零息债)。两者到期 payoff 都是 $S_T - K$。无套利则今天等价。意义:Call 与 Put 之间存在严格的合成关系——可以用 Put 和股票合成 Call,反之亦然。


九、明日预告

Day 64: Greeks 全解 — Delta、Gamma、Vega、Theta、Rho 一阶 Greeks,以及 Vanna、Volga、Charm、Color 等二阶 Greeks。明天我们对 BS 公式各参数做偏导,得到对冲所需的所有"敏感度"。重点是:为什么 ATM 期权 Vega 最大,为什么短期期权 Gamma 巨大,以及 crypto inverse 期权 Greeks 的特殊修正。