Black-Scholes 推导 — 从无套利到封闭解
BS PDE 复制法推导、Feynman-Kac 公式、风险中性测度 (Girsanov)、欧式期权封闭解
日期: 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 模型基本假设
- 标的资产 $S$ 服从 GBM:$dS = \mu S , dt + \sigma S , dW$
- 无风险利率 $r$ 常数
- 没有交易成本、可以做空、可以连续交易、无套利
- 标的不分红(或连续股息率 $q$)
- 波动率 $\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_price、bid_price、ask_price。
真实示例(2026-07-03 14:00 UTC):
| 合约 | 现货 | mark_iv | mark_price (BTC) | mark_price (USD) | BS 价 (用 mark_iv) |
|---|---|---|---|---|---|
| BTC-25JUL26-70000-C | $65,210 | 60.3% | 0.02491 | $1,624.68 | $1,627.41 |
| BTC-25JUL26-60000-C | $65,210 | 64.2% | 0.10832 | $7,065.34 | $7,058.72 |
| BTC-25JUL26-70000-P | $65,210 | 62.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 偶有 | 跨协议套利 |
六、常见陷阱
-
时间单位混乱:$r, \sigma, \tau$ 必须同一时间单位(年)。$\tau = $ days/365 而不是 days/252(加密)。
-
$d_1, d_2$ 公式记错:常见错误是把 $r+\sigma^2/2$ 写成 $r-\sigma^2/2$。记忆:$d_1$ 是"加",$d_2$ 是"减"($d_2 = d_1 - \sigma\sqrt\tau$)。
-
$N(\cdot)$ 用错:用 PDF 不是 CDF。Python
scipy.stats.norm.cdf是 CDF。 -
测度混淆:模拟用真实 $\mu$,定价用 $r$。同一份代码两套测度。
-
Deribit BTC premium 单位:mark_price 是 BTC 数量,要乘以 underlying_price 转 USD。
-
股息处理:$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 的特殊修正。