衍生品定价是量化金融里数学味最浓的一块。它的核心问题是:给定标的资产的价格过程,一个未来现金流不确定的合约值多少钱?Black-Scholes-Merton(BSM)在 1973 年给出了一个闭式解,至今仍是所有定价系统的基石。
但 BSM 的假设在真实市场里几乎全不成立:收益不是正态的、波动率不是常数、市场有摩擦、不能连续对冲。真正难的地方在于:明知道模型是错的,还要用它,并且知道错在哪里、错多少。这就是波动率曲面、校准与对冲要解决的问题。
本文按「方法 → BSM → 数值 → 曲面 → 偏斜 → 希腊字母 → 奇异期权 → 工程」的顺序展开。组合层面的风险约束属于组合层的问题,本文聚焦单个合约的定价与对冲。
目录
- 衍生品定价的三种方法
- Black-Scholes-Merton 框架
- 二叉树与美式期权
- 蒙特卡洛与方差缩减
- 隐含波动率与曲面拟合
- 波动率微笑与偏斜
- 希腊字母与动态对冲
- 奇异期权与路径依赖
- 定价系统的工程实现
1. 衍生品定价的三种方法
定价方法按「解析程度」分三类,各有适用边界:
| 方法 | 原理 | 速度 | 适用 |
|---|---|---|---|
| 解析解 | 求解偏微分方程 | 极快 | 欧式、简单结构 |
| 树 / 有限差分 | 离散时间 / 空间 | 中 | 美式、提前行权 |
| 蒙特卡洛 | 模拟路径求期望 | 慢 | 路径依赖、高维 |
选择依据是期权的结构复杂度:欧式看涨期权有闭式解,直接算;美式期权要处理提前行权,用树或有限差分;亚式、障碍这类路径依赖期权,用蒙特卡洛。
所有方法的共同基础是风险中性定价:在风险中性测度下,任何衍生品的价格等于其未来现金流的期望按无风险利率贴现:
V₀ = e^(−rT) · E^Q[Payoff(S_T)]
关键:期望是在风险中性测度 Q 下取的,标的漂移率为 r(不是真实收益 μ)
风险中性测度不是「假设投资者风险中性」,而是一个数学上的等价测度,使得贴现后的价格过程成为鞅。理解这一点,就不会纠结「为什么用 r 而不是 μ」。
2. Black-Scholes-Merton 框架
BSM 的欧式看涨期权定价公式:
C = S·N(d₁) − K·e^(−rT)·N(d₂)
d₁ = [ln(S/K) + (r + σ²/2)T] / (σ√T)
d₂ = d₁ − σ√T
N(·):标准正态累积分布函数
import numpy as np
from scipy.stats import norm
def bs_call(S, K, T, r, sigma):
d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * T) / (sigma * np.sqrt(T))
d2 = d1 - sigma * np.sqrt(T)
return S * norm.cdf(d1) - K * np.exp(-r * T) * norm.cdf(d2)
print(f"{bs_call(100, 100, 1.0, 0.03, 0.20):.4f}") # 平价看涨,约 9.41
看跌看涨平价(put-call parity) 是无套利关系,与模型无关:
C − P = S − K·e^(−rT)
它意味着只要知道看涨价格就能推看跌价格。任何定价系统都应该把平价关系作为单元测试:如果算出来的 C 和 P 不满足平价,代码一定有 bug。
BSM 的假设清单值得逐条记住,因为每一条的失效都对应一类真实风险:
| 假设 | 现实 | 后果 |
|---|---|---|
| 波动率恒定 | 波动率随行权价/期限变化 | 需要波动率曲面 |
| 收益正态 | 厚尾、跳跃 | 深度虚值被低估 |
| 连续对冲 | 只能离散对冲 | 对冲误差 |
| 无摩擦 | 有手续费、买卖价差 | 成本 |
| 无风险利率恒定 | 利率有期限结构 | 长期期权偏差 |
3. 二叉树与美式期权
二叉树把时间离散成 N 步,每步价格按「上涨 u 倍 / 下跌 d 倍」演化,然后用逆向归纳从到期日往前推:
CRR 参数:u = e^(σ√Δt), d = 1/u, p = (e^(rΔt) − d) / (u − d)
import numpy as np
def binomial_american(S, K, T, r, sigma, N=500, is_call=True):
dt = T / N
u = np.exp(sigma * np.sqrt(dt))
d = 1 / u
p = (np.exp(r * dt) - d) / (u - d)
disc = np.exp(-r * dt)
# 到期日各节点价格
j = np.arange(N + 1)
ST = S * u ** (2 * j - N)
V = np.maximum(ST - K, 0) if is_call else np.maximum(K - ST, 0)
# 逆向归纳:每步比较「继续持有」与「立即行权」
for i in range(N - 1, -1, -1):
j = np.arange(i + 1)
Si = S * u ** (2 * j - i)
cont = disc * (p * V[1:i+2] + (1 - p) * V[0:i+1])
exercise = np.maximum(Si - K, 0) if is_call else np.maximum(K - Si, 0)
V = np.maximum(cont, exercise) # 美式:可取行权价值
return V[0]
美式期权与欧式的唯一区别就是这一行 np.maximum(cont, exercise)——提前行权权利。这个权利对无分红看涨期权没有价值(所以美式看涨 = 欧式看涨),但对看跌期权、有分红的看涨期权有实质价值。
二叉树的收敛是 O(1/N),需要几百到几千步才能达到可用精度。三叉树收敛更快,有限差分法(求解 BSM 的 PDE)在同等精度下效率更高,是生产系统更常用的选择。
4. 蒙特卡洛与方差缩减
蒙特卡洛通过模拟大量路径来估计期望。几何布朗运动的路径模拟:
def mc_european_call(S, K, T, r, sigma, n_paths=100_000, steps=252):
dt = T / steps
z = np.random.standard_normal((n_paths, steps))
# 对数价格的对数增量,避免直接模拟价格(更稳定)
log_incr = (r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * z
ST = S * np.exp(log_incr.sum(axis=1)) # 到期价格
payoff = np.maximum(ST - K, 0)
return np.exp(-r * T) * payoff.mean(), payoff.std() / np.sqrt(n_paths) # 价格与标准误
蒙特卡洛的标准误随 √n 下降,要把误差减半,路径数要翻四倍。所以方差缩减技术至关重要:
| 技术 | 原理 | 提速 |
|---|---|---|
| 对偶变量 | 用 z 和 −z 成对模拟 | 2~10x |
| 控制变量 | 用已知解析解的资产对冲 | 5~50x |
| 重要性抽样 | 向深度实值区域加权采样 | 视场景 |
| 拟蒙特卡洛 | 低差异序列替代随机数 | 10~100x |
对偶变量法最简单有效:对每个随机数 z,同时用 −z 模拟一条路径,两条路径的偏差相互抵消:
def mc_antithetic(S, K, T, r, sigma, n_paths=50_000, steps=252):
dt = T / steps
z = np.random.standard_normal((n_paths // 2, steps))
incr = (r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * z
ST_pos = S * np.exp(incr.sum(axis=1))
ST_neg = S * np.exp((-z * sigma * np.sqrt(dt) + (r - 0.5 * sigma ** 2) * dt).sum(axis=1))
payoff = (np.maximum(ST_pos - K, 0) + np.maximum(ST_neg - K, 0)) / 2
return np.exp(-r * T) * payoff.mean()
蒙特卡洛的希腊字母可以用有限差分(对 S 上下扰动重跑)、路径导数法(直接对路径求导)或似然比法(对密度函数求导)。有限差分实现最简单但要跑 2~N 次,路径导数法一次搞定但对不连续 payoff 不适用。
5. 隐含波动率与曲面拟合
市场上的期权价格是被给定的,我们用 BSM 反解出隐含波动率——即「让 BSM 价格等于市场价格的 σ」:
def implied_vol(price, S, K, T, r, tol=1e-6, max_iter=100):
sigma = 0.2 # 初始猜测
for _ in range(max_iter):
diff = bs_call(S, K, T, r, sigma) - price
if abs(diff) < tol:
break
vega = S * norm.pdf(d1_of(S, K, T, r, sigma)) * np.sqrt(T)
sigma -= diff / vega # 牛顿法
return sigma
隐含波动率把「价格」这个随行权价和期限变化的量,转换成更直观的「波动率」,但它是BSM 假设下的产物,本身没有唯一的经济含义。这是衍生品定价的一个哲学问题:用错误的模型反解出来的参数,为什么有意义?答案是——它是一个约定俗成的「报价语言」,市场参与者用它来比较不同期权贵贱。
波动率曲面是 (行权价 K, 到期 T) → σ 的三维曲面。生产系统需要对它做插值:
| 方法 | 特点 | 是否无套利 |
|---|---|---|
| 双线性 | 简单 | 不保证 |
| 三次样条 | 平滑 | 可能违反 |
| SVI | 参数化,5 参数 | 可约束 |
| SABR | 随机波动率模型 | 近似无套利 |
SVI(Stochastic Volatility Inspired) 是业界常用参数化形式,它对每个到期日拟合一条曲线,且可以施加无套利约束(禁止日历套利与蝶式套利)。
6. 波动率微笑与偏斜
如果 BSM 正确,隐含波动率应该是一条水平线——所有行权价的 σ 都相同。但真实市场的隐含波动率呈 U 形(微笑)或斜线(偏斜):
隐含波动率
│ ╲ ╱
│ ╲___ ___╱
│ ╲___________╱
└──────────────────────────► 行权价 K
深度虚值卖 平值 深度虚值买
股票指数期权的偏斜(skew)通常是「左高右低」:虚值看跌(低行权价)的隐含波动率高于虚值看涨。原因是市场对下跌的恐慌——1987 年股灾之后,尾部风险溢价被永久性地定价进了虚值看跌。
微笑/偏斜的成因有三:
- 厚尾:真实收益分布比正态分布有更厚的尾,深度虚值期权按 BSM 定价会低估,市场用更高的隐含波动率补偿。
- 跳跃:价格有跳跃(隔夜跳空、突发事件),BSM 的连续扩散假设不成立。
- 随机波动率:波动率本身是随机的,且与价格负相关(跌时波动率上升),这直接产生偏斜。
这也是为什么交易台用 BSM 的希腊字母对冲,但用随机波动率模型(SABR、Heston)来理解风险。BSM 是「报价语言」,随机波动率模型是「风险语言」。
7. 希腊字母与动态对冲
希腊字母是期权价格对各风险因子的偏导:
| 希腊字母 | 含义 | 对冲手段 |
|---|---|---|
| Delta (∂V/∂S) | 标的价格敏感度 | 买卖标的 |
| Gamma (∂²V/∂S²) | Delta 的变化率 | 用其他期权 |
| Vega (∂V/∂σ) | 波动率敏感度 | 波动率互换、期权 |
| Theta (∂V/∂t) | 时间衰减 | 无法直接对冲 |
| Rho (∂V/∂r) | 利率敏感度 | 利率工具 |
Delta 对冲是最基本的操作:持有一个看涨期权(Delta = 0.6),就卖空 0.6 份标的,使组合对标的的小幅波动免疫:
def delta_hedge_simulation(S0, K, T, r, sigma, n_steps=252, rebal=1):
dt = T / n_steps
S = S0
hedge = 0.0
cost = 0.0
for i in range(n_steps):
d1 = (np.log(S / K) + (r + 0.5 * sigma ** 2) * (T - i * dt)) / (sigma * np.sqrt(T - i * dt))
target = norm.cdf(d1) # 目标 delta 持仓
trade = target - hedge
cost += abs(trade) * S * 0.0002 # 假设 2 bp 交易成本
hedge = target
S *= np.exp((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * np.random.standard_normal())
return cost
离散对冲的误差是不可避免的。理论上连续对冲可以完美复制期权,但现实中只能定期调仓(如每天或每几分钟),两次调仓之间的 Gamma 暴露会导致对冲误差。调仓越频繁,误差越小,但交易成本越高——这是一个明确的优化问题。
Gamma 是「对冲的敌人」:Gamma 高意味着 Delta 变化快,需要频繁调仓。临近到期的平值期权 Gamma 极高,此时对冲成本可能吃掉大部分理论收益。
8. 奇异期权与路径依赖
奇异期权(exotic)的 payoff 依赖价格的整条路径,而非仅到期价格,这使定价难度陡增:
| 类型 | 结构 | 定价难点 |
|---|---|---|
| 障碍期权 | 触及某价格则生效/失效 | 边界处理、不连续 |
| 亚式期权 | 依赖平均价 | 平均的分布非对数正态 |
| 回望期权 | 依赖最大/最小值 | 极值分布 |
| 雪球/自动赎回 | 多障碍 + 敲入敲出 | 多条件路径依赖 |
| Quanto | 计价货币与标的货币不同 | 汇率相关性 |
障碍期权是最常见的一类。它的 payoff 有「不连续」——当价格触及障碍时,期权价值会跳变。这导致蒙特卡洛定价在障碍附近收敛很慢,需要特殊处理(如布朗桥修正)。
def barrier_knockout_call(S, K, B, T, r, sigma, n_paths=200_000, steps=252):
# 向上敲出看涨:路径触及障碍 B 则作废
dt = T / steps
z = np.random.standard_normal((n_paths, steps))
log_paths = np.cumsum((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * z, axis=1)
ST = S * np.exp(log_paths[:, -1])
max_path = S * np.exp(log_paths.max(axis=1)) # 路径最大值
alive = max_path < B # 未触及障碍
return np.exp(-r * T) * np.maximum(ST - K, 0)[alive].mean()
雪球(autocallable)是国内券商大量发行的一类结构,它的定价与对冲是 2022 年以来行业关注的重点——因为集中敲入时,做市商的对冲盘会形成正反馈的抛压,这是典型的「模型外风险」。
9. 定价系统的工程实现
生产级定价系统要在精度、速度、可维护性之间平衡:
行情 → 曲面校准 → 定价引擎 → 希腊字母 → 风控/交易
↑
校准缓存(按标的+到期缓存,避免重复计算)
关键工程点:
- 向量化:定价函数要能一次算一万个合约,用 numpy 而非循环。C++ 实现的关键路径参考 C++ 高性能计算 里的内存布局与 SIMD 优化。
- 缓存校准结果:波动率曲面校准(尤其是 SABR 这类带优化的模型)很贵,应该按标的分组缓存,行情变动超过阈值才重算。
- 并行化:蒙特卡洛天然可并行,大规模路径模拟可以分布到多机,调度思路参考 分布式系统 。
- 希腊字母用解析式:能用解析式就用解析式(如 BSM 的 Delta/Vega),比有限差分快且精确。
定价的精度要与用途匹配:风控用 P99 精度、报价用毫秒级速度、结算用最高精度。用同一套引擎服务所有场景,往往两头不讨好。
权衡取舍
| 维度 | 解析解 | 树 / 有限差分 | 蒙特卡洛 |
|---|---|---|---|
| 速度 | 极快 | 中 | 慢 |
| 美式期权 | 不适用 | 好 | 需 LSMC |
| 路径依赖 | 不适用 | 难 | 好 |
| 高维 | 不适用 | 差 | 好 |
| 实现复杂度 | 低 | 中 | 中 |
模型选择的核心是「结构复杂度」与「维度」:欧式低维用解析解;美式用有限差分;路径依赖或高维用蒙特卡洛;美式 + 路径依赖的组合用最小二乘蒙特卡洛(LSMC),但收敛和稳定性都更难保证。
模型与现实的关系上,要接受一个现实:没有模型是完全正确的,只有「足够好且知道边界」的模型。BSM 的价值不在于它是真的,而在于它提供了一个共同的报价语言和一套可计算的风险指标;波动率曲面和随机波动率模型,则是在 BSM 的框架上打补丁,让定价更贴近现实。
常见坑清单
- 用真实收益率 μ 而非 r 定价:风险中性测度下漂移率是 r,用 μ 会系统性偏差。
- 隐含波动率无初值:牛顿法不收敛,用 0.2 或上一时点的值做初值。
- 期权价格违反平价关系:任何 C/P 不满足 C−P=S−Ke^(−rt) 的实现都有 bug。
- 离散对冲当成连续对冲:Gamma 暴露导致对冲误差,必须模拟评估。
- 蒙特卡洛路径太少:标准误被忽略,定价误差不可控。
- 障碍期权不做边界修正:蒙特卡洛在障碍附近收敛极慢,结果偏差大。
- 曲面插值产生套利:未约束的样条插值可能违反日历/蝶式套利,需检查。
- 用 BSM 希腊字母对冲偏斜:偏斜下 Vega 不是常数,需用随机波动率风险度量。
- 定价引擎无缓存:每次报价都重算曲面校准,延迟不可接受。
- 忽略提前行权:美式期权用欧式公式定价,低估价值。
小结
衍生品定价的核心是在错误的模型上做正确的工程。BSM 的假设不成立,但它的闭式解、希腊字母和报价语言仍然不可或缺。真正的专业能力体现在:知道模型错在哪里(微笑、偏斜、跳跃)、用数值方法处理解析解覆盖不了的结构、用波动率曲面和随机波动率模型弥补 BSM 的不足。
判断一个定价系统是否可靠,最快的自检是三件事:算出的价格是否满足无套利关系(平价、日历、蝶式)?对冲模拟的误差是否与理论预期一致?隐含波动率曲面的形状是否稳定可解释? 三件事都过关,定价才具备上生产的资格。
下一步建议阅读 组合优化与风险模型 ,看多个合约的头寸如何被聚合成组合层面的风险;如果你关心结算侧的保证金与盯市,可以看 清结算与对账体系 。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。