衍生品定价与希腊字母

衍生品定价与希腊字母的系统拆解:Black-Scholes-Merton 框架与它的假设边界、二叉树与蒙特卡洛两类数值方法、隐含波动率的求解与波动率曲面拟合、希腊字母与动态对冲的工程实现、奇异期权与路径依赖的定价难点,回答为什么 BSM 的假设不成立却仍被广泛使用。

衍生品定价是量化金融里数学味最浓的一块。它的核心问题是:给定标的资产的价格过程,一个未来现金流不确定的合约值多少钱?Black-Scholes-Merton(BSM)在 1973 年给出了一个闭式解,至今仍是所有定价系统的基石。

但 BSM 的假设在真实市场里几乎全不成立:收益不是正态的、波动率不是常数、市场有摩擦、不能连续对冲。真正难的地方在于:明知道模型是错的,还要用它,并且知道错在哪里、错多少。这就是波动率曲面、校准与对冲要解决的问题。

本文按「方法 → BSM → 数值 → 曲面 → 偏斜 → 希腊字母 → 奇异期权 → 工程」的顺序展开。组合层面的风险约束属于组合层的问题,本文聚焦单个合约的定价与对冲。

目录

  1. 衍生品定价的三种方法
  2. Black-Scholes-Merton 框架
  3. 二叉树与美式期权
  4. 蒙特卡洛与方差缩减
  5. 隐含波动率与曲面拟合
  6. 波动率微笑与偏斜
  7. 希腊字母与动态对冲
  8. 奇异期权与路径依赖
  9. 定价系统的工程实现

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 年股灾之后,尾部风险溢价被永久性地定价进了虚值看跌。

微笑/偏斜的成因有三:

  1. 厚尾:真实收益分布比正态分布有更厚的尾,深度虚值期权按 BSM 定价会低估,市场用更高的隐含波动率补偿。
  2. 跳跃:价格有跳跃(隔夜跳空、突发事件),BSM 的连续扩散假设不成立。
  3. 随机波动率:波动率本身是随机的,且与价格负相关(跌时波动率上升),这直接产生偏斜。

这也是为什么交易台用 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 的框架上打补丁,让定价更贴近现实。

常见坑清单

  1. 用真实收益率 μ 而非 r 定价:风险中性测度下漂移率是 r,用 μ 会系统性偏差。
  2. 隐含波动率无初值:牛顿法不收敛,用 0.2 或上一时点的值做初值。
  3. 期权价格违反平价关系:任何 C/P 不满足 C−P=S−Ke^(−rt) 的实现都有 bug。
  4. 离散对冲当成连续对冲:Gamma 暴露导致对冲误差,必须模拟评估。
  5. 蒙特卡洛路径太少:标准误被忽略,定价误差不可控。
  6. 障碍期权不做边界修正:蒙特卡洛在障碍附近收敛极慢,结果偏差大。
  7. 曲面插值产生套利:未约束的样条插值可能违反日历/蝶式套利,需检查。
  8. 用 BSM 希腊字母对冲偏斜:偏斜下 Vega 不是常数,需用随机波动率风险度量。
  9. 定价引擎无缓存:每次报价都重算曲面校准,延迟不可接受。
  10. 忽略提前行权:美式期权用欧式公式定价,低估价值。

小结

衍生品定价的核心是在错误的模型上做正确的工程。BSM 的假设不成立,但它的闭式解、希腊字母和报价语言仍然不可或缺。真正的专业能力体现在:知道模型错在哪里(微笑、偏斜、跳跃)、用数值方法处理解析解覆盖不了的结构、用波动率曲面和随机波动率模型弥补 BSM 的不足。

判断一个定价系统是否可靠,最快的自检是三件事:算出的价格是否满足无套利关系(平价、日历、蝶式)?对冲模拟的误差是否与理论预期一致?隐含波动率曲面的形状是否稳定可解释? 三件事都过关,定价才具备上生产的资格。

下一步建议阅读 组合优化与风险模型 ,看多个合约的头寸如何被聚合成组合层面的风险;如果你关心结算侧的保证金与盯市,可以看 清结算与对账体系 。

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「量化交易」更多文章

  1. 风险模型与因子归因
  2. 回测偏差与过拟合防范
  3. 市场微结构与流动性