第三站的舞台离物理最远、离扩散方程最近。1973 年 Black、Scholes 与 Merton 用一条偏微分方程给期权定价,衍生品市场从此有了公尺。本节把完整链条走一遍:从"复制对冲"的经济论证推出 Black-Scholes 方程,用变量替换把它化装成热传导方程(1.3 节埋下的伏笔在此兑现),由热核积分读出闭式公式;再用第四章的克兰克–尼科尔森数值定价,亲眼看看收益函数的棱角如何考验格式——一份方程迁移的完整标本。
推导只需要三条原料。其一,市场模型:标的资产价格 S 服从几何布朗运动,其期望回报被风险中性化后,价格演化的瞬时波动率为 σ·S——注意波动率正比于价格本身,这让后续方程的系数特殊。其二,期权价值 V(S, t) 是价格与时间的函数,用伊藤公式展开它的随机微分,其中出现 ∂V/∂S 与 ∂²V/∂S²。其三,构造组合:买入一份期权、卖出 Δ = ∂V/∂S 份标的——随机项恰好抵消,组合瞬间无风险。无套利要求这个组合的收益率等于无风险利率 r,整理后得到
∂V/∂t + (1/2)σ²S²·∂²V/∂S² + r·S·∂V/∂S − r·V = 0。
三个观察把这条方程接回本册。类型:二阶主部系数 0.5σ²S² 恒正、无混合项,判别式恒等于零——抛物型(2.1 的判定流程现学现用)。终值问题:期权价值已知的是到期时刻的收益(欧式看涨 max(S − K, 0)),时间倒着解——与热传导的正向初值问题互为镜像,换 τ = T − t 即化回标准形状。化归:令 x = ln(S/K)、把 τ 与 V 做伸缩平移,整条方程变成常数系数热方程 u_τ = u_xx 加一个源项——"换到特征的坐标系"(3.2 末尾预告的手筋)第二次建功。
化装成热方程后,收益函数的傅里叶展开(3.1 的系数公式)加热核演化直接给出解;翻回原变量,欧式看涨期权的闭式解是
V = S·N(d₁) − K·e^(−r(T−t))·N(d₂),d₁、d₂ 由 ln(S/K)、(r + σ²/2)(T − t)、σ√(T − t) 拼装,N 是标准正态分布函数。
解的结构远比公式本身值钱。它对 S 的偏导(对冲比率,业界叫 Delta)正是推导里卖出的份数——定价与对冲是同一条方程的一体两面;对 σ 的偏导(Vega)、对时间的偏导(Theta)定义了风险管理的全部词汇表——每个希腊字母都是一条偏导数。极值原理(2.2)在金融里同样上岗:看涨期权价值关于到期时间是单调的(Theta 符号固定),违反单调的数值解当场暴露格式错误——定性原理变成免费的单元测试。
闭式解只在常数 σ、欧式、无分红的理想化下成立。美式期权(含自由边界)、路径依赖、波动率随价格变化——这些现实情形没有闭式解,数值方法是行业标配。用 4.2 的克兰克–尼科尔森在 x = ln S 坐标下定价欧式看涨,与闭式解对表,然后换成收益不光滑的数字期权(到期收益是 0 或 1 的阶梯),观察振荡并用 4.2 提过的平衡步修复:
import numpy as np from math import erf S0, K, r, sig, T = 100.0, 100.0, 0.05, 0.2, 1.0 nx, nt = 400, 100 x = np.linspace(np.log(0.5), np.log(2.5), nx+1) # ln(S/K) 网格 dx = x[1] - x[0]; dt = T/nt a = 0.5*sig**2/dx**2 * np.ones(nx-1) # 二阶项系数(常系数化后) b = (r - 0.5*sig**2)/dx * np.ones(nx-1) # 一阶项系数 c = -r * np.ones(nx-1) # 零阶项 I = np.eye(nx-1) Lop = (np.diag((a - b/2)[:-1], -1) + np.diag(-2*a + c) + np.diag((a + b/2)[:-1], 1)) # 空间离散算子 A = I - 0.5*dt*Lop # 克兰克-尼科尔森左阵 Bm = I + 0.5*dt*Lop Ai = I - dt*Lop # 全隐式(平衡步用) def bs_call(S): tau = T d1 = (np.log(S/K) + (r + 0.5*sig**2)*tau)/(sig*np.sqrt(tau)) d2 = d1 - sig*np.sqrt(tau) N = lambda z: 0.5*(1 + np.vectorize(erf)(z/np.sqrt(2))) return S*N(d1) - K*np.exp(-r*tau)*N(d2) def price(payoff, smooth=0): V = payoff.copy() for j in range(nt): # 倒向演化:从到期走到今天 tau = (j + 1)*dt # 当前剩余到期时间 rhs = Bm @ V[1:-1] rhs[0] += 0.5*dt*(a[0] - b[0]/2) * 0.0 # 左边界:深价外取零 rhs[-1] += 0.5*dt*(a[-1] + b[-1]/2) * (np.exp(x[-1]) - np.exp(-r*tau)) M = Ai if j < smooth else A # 前几步全隐式=平衡步 V[1:-1] = np.linalg.solve(M, rhs) return V i0 = np.argmin(np.abs(x - np.log(S0/K))) call = price(np.maximum(np.exp(x) - 1.0, 0.0)) # 看涨收益 max(S/K - 1, 0) print("CN 数值:", round(call[i0], 4), " 闭式:", round(float(bs_call(np.array([S0]))[0]), 4)) dig_plain = price((x > 0).astype(float), smooth=0) # 数字期权 不开平衡步 dig_smooth = price((x > 0).astype(float), smooth=4) # 开四步全隐式平衡步 print("数字期权 普通CN:", round(dig_plain[i0], 5), " 含平衡步:", round(dig_smooth[i0], 5))
三组读数构成一份完整验收。欧式看涨:CN 与闭式解在千分位内重合——抛物机器在光滑收益上无可挑剔。数字期权不开平衡步:收益的阶梯在时间倒推中留下棋盘状振荡(4.2 的老病,Gibbs 的数值亲戚);开四步全隐式平衡步(Rannacher 技巧):振荡被阻尼,价格回到正确量级——收益函数的光滑度决定格式策略,与 4.5 谱方法"光滑是燃料"的判据遥相呼应。行业里更优雅的路线是先解析磨光收益(用看涨期权的线性组合逼近任何收益,即 Carr–Madan 分解),把棱角在进入格式之前先熨平——正则化思想(5.3)在定价里的又一现身。
⚠️ 常见坑:在 S 坐标直接差分会遇到系数随格点变化的烦恼与负值振荡,标准做法是先换 ln S 坐标再离散——坐标变换把变系数方程化成常系数,花小钱买大稳。2.1 与 3.2 反复预告的"先换坐标"在金融现场依然是第一动作。
最后一站回到像素世界:把照片当温度场,扩散方程去噪——保边与抹平的矛盾如何用"各向异性"化解,正则化与扩散如何在同一个泛函里会师。