Skip to content

11.5 蒙特卡洛定价进阶

概念详解

当遇到路径依赖期权(亚式、障碍、回望)或多资产期权(篮子、最优表现)时,解析方法和偏微分方程方法(FEM/FDM)都不太方便。蒙特卡洛(Monte Carlo, MC) 通过模拟大量随机路径计算期望,成为最通用的方法。

但 MC 的核心局限是 O(1/N) 收敛: 要把精度提升 10 倍,需要 100 倍的计算量。本章聚焦如何用方差缩减(Variance Reduction) 把 100 倍计算量降低到 10 倍甚至 3 倍。

主流方差缩减技术包括:

技术加速倍数适用场景
对偶变量 (Antithetic)2-4x单资产欧式期权
控制变量 (Control Variates)5-20x亚式/有解析近似解的产品
重要性采样 (Importance Sampling)5-50x深度 OTM/ITM
拟蒙特卡洛 (Quasi-MC)5-30x多维、低维问题
条件 MC (Conditional MC)2-10x篮子期权

此外,本章重点讲解 Longstaff-Schwartz 方法:用回归逼近"美式期权的持有价值",从而用 MC 定价美式期权。

名词解释:方差缩减(Variance Reduction)

在不增加随机路径数的前提下,通过更"聪明地"生成随机变量或利用相关性,降低估计量的方差。学术研究(Longstaff & Schwartz, 2001;Glasserman, 2003)表明在合适的应用下,方差缩减可以将 MC 的精度提升 100 倍以上。

名词解释:风险中性概率分布的重要性采样

重要性采样的本质是改变模拟用的概率分布(称为"修改后的概率测度"),让稀有事件(深度 OTM 期末)以更高频率发生,然后用"似然比"修正回原概率分布下的期望。

经典蒙特卡洛的局限

基本蒙特卡洛方法通过模拟大量标的价格路径来估计期权价格:

$$V_0 = e^{-rT} \mathbb{E}^{\mathbb{Q}}\left[ \text{Payoff}(S_T) \right] \approx e^{-rT} \frac{1}{N}\sum_{i=1}^N \text{Payoff}(S_T^{(i)})$$

标准误差为 O(1/N),意味着要提高一位有效数字,需要将模拟路径数增加100倍。在需要对大量期权定价或处理复杂奇异结构时,这一效率瓶颈尤为突出。

方差缩减技术

对偶变量法

对偶变量法(Antithetic Variates)利用对称性:对每一条路径 ST(i),同时生成其镜像路径 ST(i)(使用 ϵ 代替 ϵ)。取两条路径收益的均值作为该组的估计值:

$$\hat{V}_{\text{AV}} = e^{-rT} \frac{1}{N}\sum_{i=1}^{N/2} \frac{\text{Payoff}(S_T^{(i)}) + \text{Payoff}(S_T^{(-i)})}{2}$$
PYTHON32 行 · 1.1 KB
📄此处有展示代码32 行 · 1.1 KB展开 ▼
python
import numpy as np

def mc_antithetic(S0, K, T, r, sigma, n_paths, option_type='call'):
    """
    对偶变量法 Monte Carlo 期权定价
    每条模拟路径使用配对的正负随机数
    """
    n_pairs = n_paths // 2
    Z = np.random.randn(n_pairs, 2)  # 每对使用同一组随机数

    # 正路径
    ST_pos = S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z[:, 0])
    # 对偶路径
    ST_neg = S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*(-Z[:, 0]))

    if option_type == 'call':
        payoff_pos = np.maximum(ST_pos - K, 0)
        payoff_neg = np.maximum(ST_neg - K, 0)
    else:
        payoff_pos = np.maximum(K - ST_pos, 0)
        payoff_neg = np.maximum(K - ST_neg, 0)

    # 每对取平均
    payoff_avg = (payoff_pos + payoff_neg) / 2
    price = np.exp(-r * T) * payoff_avg.mean()
    se = payoff_avg.std() / np.sqrt(n_pairs)

    return price, se

# 对比标准MC与对偶变量法
price_av, se_av = mc_antithetic(100, 100, 1.0, 0.03, 0.20, 100000, 'call')
print(f"对偶变量法: {price_av:.6f} ± {1.96*se_av:.6f} (95% CI)")
点击展开可浏览运行结果
对偶变量法: 9.475561 ± 0.067648 (95% CI)

控制变量法

控制变量法(Control Variates)利用已知解析解的相关变量来减小方差。例如,用几何平均亚式期权(有解析解)作为算术平均亚式期权的控制变量:

$$\hat{V}_{\text{CV}} = \hat{V}_{\text{MC}} + \beta (Y_{\text{true}} - \hat{Y}_{\text{MC}})$$

其中 Y 为控制变量(已知解析解),β 为最优系数:

$$\beta^* = \frac{\text{Cov}(V, Y)}{\text{Var}(Y)}$$
PYTHON38 行 · 1.3 KB
📄此处有展示代码38 行 · 1.3 KB展开 ▼
python
def mc_control_variate(S0, K, T, r, sigma, n_paths):
    """
    使用几何亚式期权作为控制变量为算术亚式期权定价
    """
    n_steps = 12
    dt = T / n_steps

    Z = np.random.randn(n_paths, n_steps)
    S = np.zeros((n_paths, n_steps + 1))
    S[:, 0] = S0

    for t in range(1, n_steps + 1):
        S[:, t] = S[:, t-1] * np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*Z[:, t-1])

    # 算术平均亚式期权 payoff
    arith_avg = S[:, 1:].mean(axis=1)
    payoff_arith = np.maximum(arith_avg - K, 0)

    # 几何平均亚式期权 payoff(有解析解)
    geom_avg = np.exp(np.log(S[:, 1:]).mean(axis=1))
    payoff_geom = np.maximum(geom_avg - K, 0)

    # 几何平均亚式期权的解析价格
    sigma_adj = sigma * np.sqrt((n_steps+1)*(2*n_steps+1)/(6*n_steps**2))
    mu_adj = 0.5 * (r - 0.5*sigma**2) + 0.5 * sigma_adj**2
    # ... (完整解析解此处省略)

    # 控制变量
    cov = np.cov(payoff_arith, payoff_geom)[0, 1]
    var_geom = np.var(payoff_geom)
    beta = cov / var_geom

    price_raw = np.exp(-r*T) * payoff_arith.mean()
    price_geom = np.exp(-r*T) * payoff_geom.mean()
    geom_true = price_geom  # 此处应用解析解替代

    price_cv = price_raw - beta * (price_geom - geom_true)
    return price_cv, price_raw
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `mc_control_variate`(使用几何亚式期权作为控制变量为算术亚式期权定价)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

重要性采样

重要性采样(Importance Sampling)的核心思想是改变概率测度,使得稀有事件(如深度虚值期权的行权)发生频率更高,然后通过似然比进行修正。对于深度 OTM 期权,标准 MC 中绝大多数路径的 payoff 为零,效率极低:

PYTHON24 行 · 786 B
📄此处有展示代码24 行 · 786 B展开 ▼
python
def mc_importance_sampling(S0, K, T, r, sigma, n_paths, option_type='call'):
    """
    重要性采样 —— 将漂移项调整使标的更容易进入实值区域
    """
    # 找到使 S_T 期望接近 K 的漂移调整量
    mu_shift = (np.log(K/S0) - (r - 0.5*sigma**2)*T) / T
    mu_star = r + mu_shift

    Z = np.random.randn(n_paths)
    ST = S0 * np.exp((mu_star - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)

    # 似然比(Radon-Nikodym 导数)
    likelihood_ratio = np.exp(
        -0.5 * (mu_shift*np.sqrt(T)/sigma)**2
        - (mu_shift*np.sqrt(T)/sigma) * Z
    )

    if option_type == 'call':
        payoff = np.maximum(ST - K, 0)
    else:
        payoff = np.maximum(K - ST, 0)

    price = np.exp(-r * T) * (payoff * likelihood_ratio).mean()
    return price
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `mc_importance_sampling`(重要性采样 —— 将漂移项调整使标的更容易进入实值区域)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

多资产路径模拟与 Cholesky 分解

当期权涉及多个标的资产时,需要模拟具有特定相关结构的多元随机过程。对于 n 个资产,给定相关系数矩阵 Σ,通过 Cholesky 分解生成相关的随机变量:

$$\mathbf{L}\mathbf{L}^T = \Sigma, \quad \mathbf{Z}_{\text{correlated}} = \mathbf{L} \cdot \mathbf{Z}_{\text{independent}}$$
PYTHON26 行 · 843 B
📄此处有展示代码26 行 · 843 B展开 ▼
python
def multi_asset_mc(S0_vec, K, T, r, sigma_vec, corr_matrix, n_paths):
    """
    多资产篮子期权蒙特卡洛定价
    S0_vec: 各资产的初始价格
    sigma_vec: 各资产的波动率
    corr_matrix: 相关系数矩阵
    """
    n_assets = len(S0_vec)
    L = np.linalg.cholesky(corr_matrix)  # Cholesky 下三角矩阵

    Z_independent = np.random.randn(n_paths, n_assets)
    Z_correlated = Z_independent @ L.T  # 生成相关的随机变量

    ST = np.zeros((n_paths, n_assets))
    for i in range(n_assets):
        ST[:, i] = S0_vec[i] * np.exp(
            (r - 0.5*sigma_vec[i]**2)*T
            + sigma_vec[i]*np.sqrt(T)*Z_correlated[:, i]
        )

    # 一篮子看涨期权
    basket_avg = ST.mean(axis=1)
    payoff = np.maximum(basket_avg - K, 0)
    price = np.exp(-r * T) * payoff.mean()

    return price
点击展开可浏览运行结果
📘 本段代码定义了 1 个函数/类:函数 `multi_asset_mc`(多资产篮子期权蒙特卡洛定价)。该片段为教学展示(未包含独立运行的输入数据),可在实战练习中结合真实数据调用。

Cholesky 分解的优势在于其计算效率高(O(n3/3)),但其要求相关系数矩阵必须是正定的。当矩阵接近奇异时(如高相关性资产),可能需要使用正则化或替代分解方法。

Longstaff-Schwartz 最小二乘蒙特卡洛 (LSM)

对于美式期权(或百慕大期权)的蒙特卡洛定价,核心难点在于需要比较每个时间点的持有价值立即行权价值,而持有价值依赖于未来的最优决策。

Longstaff 和 Schwartz (2001) 提出了一个巧妙方案:

  1. 从最后一期向前递推
  2. 在每个时间点,使用少量基函数(如 Laguerre 多项式)对持有价值进行回归
  3. 比较持有价值的拟合值与行权价值,做出最优行权决策
PYTHON69 行 · 2.0 KB
📄此处有展示代码69 行 · 2.0 KB展开 ▼
python
def lsm_american_put(S0, K, T, r, sigma, n_paths=10000, n_steps=50):
    """
    Longstaff-Schwartz 最小二乘蒙特卡洛 —— 美式看跌期权定价
    """
    dt = T / n_steps
    disc = np.exp(-r * dt)

    # 生成所有价格路径
    S = np.zeros((n_paths, n_steps + 1))
    S[:, 0] = S0
    for t in range(1, n_steps + 1):
        Z = np.random.randn(n_paths)
        S[:, t] = S[:, t-1] * np.exp((r - 0.5*sigma**2)*dt + sigma*np.sqrt(dt)*Z)

    # 初始 payoff(终端行权价值)
    V = np.maximum(K - S[:, -1], 0)

    # 逐时间步向后递推
    for t in range(n_steps - 1, 0, -1):
        V = V * disc  # 贴现到当前时间步

        # 当前标的价
        St = S[:, t]

        # 仅对实值期权进行回归(裁剪以加速)
        itm = np.where(St < K)[0]

        if len(itm) < 10:
            continue

        # 基函数:1, S, S^2
        X = np.column_stack([
            np.ones(len(itm)),
            St[itm],
            St[itm]**2
        ])

        # 对持有价值进行回归
        Y = V[itm]
        try:
            beta = np.linalg.lstsq(X, Y, rcond=None)[0]
            continuation_value = X @ beta
        except np.linalg.LinAlgError:
            continuation_value = np.zeros(len(itm))

        # 立即行权价值
        exercise_value = K - St[itm]

        # 选择最优策略
        exercise = exercise_value > continuation_value
        V[itm[exercise]] = exercise_value[exercise]
        V[itm[~exercise]] = V[itm[~exercise]]

    return V.mean() * disc

# LSM 定价示例
from scipy.stats import norm

S0, K, T, r, sigma = 100, 100, 1.0, 0.03, 0.25

lsm_price = lsm_american_put(S0, K, T, r, sigma, n_paths=50000, n_steps=50)
bs_eu_price = (
    K*np.exp(-r*T)*norm.cdf(-(np.log(S0/K)+(r-sigma**2/2)*T)/(sigma*np.sqrt(T)))
    - S0*norm.cdf(-(np.log(S0/K)+(r+sigma**2/2)*T)/(sigma*np.sqrt(T)))
)

print(f"LSM 美式看跌: {lsm_price:.4f}")
print(f"BS 欧式看跌: {bs_eu_price:.4f}")
print(f"美式溢价: {lsm_price - bs_eu_price:.4f}")
点击展开可浏览运行结果
LSM 美式看跌: 8.6887
BS 欧式看跌: 8.3930
美式溢价: 0.2957

LSM 方法的局限:回归的基函数选择对定价精度影响很大。对于高维问题(多资产),基函数数量呈指数增长(维数灾难)。此外,LSM 倾向于低估美式期权的真实价值(因为回归误差会导致次优的行权决策),这在高维度问题中更为显著。

常见误区

误区 1:"路径数越多越准"

蒙特卡洛的 O(1/N) 收敛意味着 10 倍精度提升需要 100 倍路径数。盲目加路径只是浪费时间和算力。方差缩减(对偶变量、控制变量)在工程上性价比更高。

误区 2:"对偶变量一定加速 2 倍"

对偶变量加速的关键前提: pay-off 函数关于 ST 单调。对单边期权(看涨)效果显著,对双侧产品(跨式)加速有限。

误区 3:"控制变量的最优 β 一定是最小化 Var(VβY) 的系数"

应该用 β=Cov(V,Y)/Var(Y),不是随手设 β=1错误的最优系数反而扩大方差

误区 4:"LSM 适合所有美式期权"

LSM 对单一标的的简单美式期权效果很好;对高维(多资产美式)或奇异美式(百慕大、可转债)效果较差。长持仓的可转债通常需要专门的最小二乘 + 网格法结合。

误区 5:"MC 总是比 PDE 慢"

不一定。多资产美式期权用 PDE 计算量呈指数增长,而 MC 仍然线性。故多资产美式 basket 产品的定价只能用 LSM 类 MC 方法,FDM 无法扩展。

题目 1
小测验
题目 1:蒙特卡洛方法的核心收敛速度为?
  • AA. O(1/N)
  • BB. O(1/N)
  • CC. O(1/N2)
  • DD. O(eN)
💡查看答案与解析展开 ▼
正确答案:B
MC 估计量的标准误为 σ/N:由 Var(X¯)=σ2/N 开方得到,故收敛速度是 O(1/N)。这意味着精度每提高一位有效数字就要 100 倍路径,正是 MC 的核心瓶颈,也是方差缩减技术的价值所在。A 的 O(1/N) 是方差(而非误差)的收敛速度;C 的 O(1/N2) 与 D 的指数收敛在标准 MC 下都不成立,只有拟蒙特卡洛的低差异序列才可能优于 O(1/N)
题目 2
对偶变量法的本质是?
  • AA. 增加一倍路径
  • BB. 利用 pay-off 关于 ST 的单调性,用配对路径 + 平均降低方差
  • CC. 改变概率分布
  • DD. 减去解析近似
💡查看答案与解析展开 ▼
正确答案:B
对偶变量对每条路径同时用 ZZ 生成镜像配对,再取两条路径 pay-off 的平均。当 pay-off 关于 ST 单调时,配对收益负相关,平均后方差显著下降,实测常给出 2-4 倍加速。A 错:它并不增加有效路径数,只是配对取均值;C 描述的是重要性采样(改变概率测度);D 是控制变量法——减去已知解析解的偏差项。
题目 3
Longstaff-Schwartz 方法的核心思路是?
  • AA. 直接对历史数据回归
  • BB. 增加大量路径
  • CC. 从后向前反向递推,用回归函数逼近每一时间步的"持有价值",判断是否提前行权
  • DD. 用 BS 近似代替
💡查看答案与解析展开 ▼
正确答案:C
LSM 从到期日向前反向递推,在每个可行权时点用基函数(如 1,S,S2 或 Laguerre 多项式)对已贴现的未来现金流做回归,拟合出"持有价值",再与立即行权价值比较来决定是否行权,从而把 MC 用于美式期权定价。A 错:回归对象是模拟路径的贴现值,不是历史数据;B 单纯加路径解决不了提前行权的决策问题;D 用 BS 近似会丢掉美式溢价。还要注意 LSM 因回归误差倾向于低估真实价值。

实战练习

  1. 对偶变量加速测试: 编写 BS Call 的 MC 定价函数,比较标准 MC 与对偶变量法的收敛速度。绘制"N vs 标准误差"图(用 5 个 N 阶梯),观察对偶变量是否真的"减半"了误差。

  2. 几何 vs 算术亚式期权: 用对偶变量 + 控制变量(以几何亚式作为控制变量)为算术亚式期权定价。验证:控制变量将误差降低 5-20 倍,对比不开控制变量的效果。

  3. 重要性采样 on 深度 OTM 期权: 选 K=120(深度 OTM)的 30 天到期的 Call(标的价格 S0=100)。分别用:

    • 标准 MC (1M 路径)
    • 重要性采样(漂移调整到 K) (200K 路径)

    对比两种方法的精度差异。

  4. LSM 美式 Put 价格收敛: 用 LSM 美式 Put,测试不同的基函数(常数、SS2S3、Laguerre 多项式)。绘制"基函数 vs 价格"图,理解过拟合精度提升之间的取舍。

  5. 多资产篮子期权: 实现 5 资产篮子期权的定价(相关系数矩阵 5×5),对比 FDM(无法实现)与 MC(可实现)。

延伸阅读

  • Glasserman, P. (2003). Monte Carlo Methods in Financial Engineering. Springer. 蒙特卡洛在金融领域的权威教材。
  • Longstaff, F.A. & Schwartz, E.S. (2001). "Valuing American Options by Simulation: A Simple Least-Squares Approach." Review of Financial Studies. LSM 的原始论文。
  • Boyle, P. (1977). "Options: A Monte Carlo Approach." Journal of Financial Economics. 蒙特卡洛定价期权的最早论文。
  • Broadie, M. & Kaya, O. (2006). "Exact Simulation of Stochastic Volatility and Other Affine Jump Diffusion Models." 高效模拟随机波动率模型。
  • Jäckel, P. (2002). Monte Carlo Methods in Finance. Wiley. 偏工程视角,讲解随机数生成、方差缩减技巧。
  • 拟蒙特卡洛参考:Niederreiter, H. (1992). Random Number Generation and Quasi-Monte Carlo Methods. SIAM. 关于低差异序列的理论基础。

本章要点

  • 蒙特卡洛 是路径依赖期权、多资产期权定价的"通用引擎",O(1/N) 收敛速度是其主要局限。
  • 对偶变量法 利用 pay-off 关于 ST 的单调性,简单且常给出 2-4 倍加速。
  • 控制变量法 利用相关解析解(几何亚式)降低方差,典型加速 5-20 倍,是最常用的方差缩减技术。
  • 重要性采样 改概率分布让稀有事件高频发生,适合深度 OTM/ITM、障碍等尾部定价。
  • 拟蒙特卡洛 用低差异序列(Sobol、Halton)替代随机数,可获得 5-30 倍加速,但对高维问题效果减弱。
  • Longstaff-Schwartz 方法 用反向递推 + 回归逼近"持有价值",用 MC 定价美式期权;但倾向于低估真实价值。
  • 多资产美式/百慕大期权 LSM 仍然适用,但基函数数量需指数增长,会遭遇维数灾难,实务中需谨慎处理。
  • 实务选择: 欧式单资产 → BS(优先)或对偶变量 MC;欧式多资产 → Cholesky MC;美式单资产 → LSM;美式多资产 → LSM 改良或 PSOR。

至此,模块十一的 量化计算工具链 已经完整。从 Black-Scholes 定价、Greeks,到波动率曲面、奇异期权,再到期权数值方法(二叉树、FDM、MC),读者应具备完整的期权定价工程能力

11.6-11.10 章将进一步把上述工具应用于中国市场:场内期权合约(11.6)、IV vs HV(11.7)、波动率策略(11.8)、套保实战(11.9)、中国 A 股期权 8 大策略(11.10)。