跳到正文

Monte Carlo 方差缩减:用更少样本拿相同精度

对偶变量、控制变量、重要性采样和分层采样,让 Monte Carlo 模拟更快收敛的四种技术。

第 8 篇 · 共 12 篇 约 12 分钟

Monte Carlo 是给衍生品定价的通用工具。它对任何模型、任何收益、任何维度都有效。但它收敛得慢,标准误随 1/N1/\sqrt{N} 缩放,其中 NN 是样本数。要多一位精度,你需要 100 倍的样本。

方差缩减是用更少样本获得相同精度的艺术。对设计良好的方差缩减方案,误差可以比 1/N1/\sqrt{N} 缩放得好得多。一些技术给出 10 倍或 100 倍的加速几乎不需要额外工作。

这篇文章涵盖四种主要技术:对偶变量、控制变量、重要性采样和分层采样。每种都从头推导,用工作例子说明,并在金融场景中展示。

Monte Carlo 设置

价格 V=E[f(X)]V = \mathbb{E}[f(X)] 的标准 Monte Carlo 估计器是

V^N=1N∑i=1Nf(Xi)\hat{V}_N = \frac{1}{N} \sum_{i=1}^N f(X_i)

其中 XiX_i 是 XX 分布的 i.i.d. 样本。估计器的方差是 Var[f(X)]/N\text{Var}[f(X)] / N。标准误是 Var[f(X)]/N\sqrt{\text{Var}[f(X)]/N},这给出 1/N1/\sqrt{N} 收敛速率。

方差缩减旨在降低 Var[f(X)]\text{Var}[f(X)] 或使用更聪明的估计器以在相同 NN 下达到更低方差。两个估计器的相对效率是它们对方差之比对于相同 NN。

对偶变量

想法:如果 XX 有对称分布,生成对 (X,X′)(X, X'),其中 X′X' 是 XX 的”对偶”(例如如果 XX 关于零对称,X′=−XX' = -X)。对函数值取平均:

V^anti=1N∑i=1N/2f(Xi)+f(Xi′)2\hat{V}_{\text{anti}} = \frac{1}{N} \sum_{i=1}^{N/2} \frac{f(X_i) + f(X'_i)}{2}

对对称分布上的单调函数 ff,f(X)f(X) 和 f(X′)f(X') 是负相关的。该均值的方差是

Var[V^anti]=1N(Var[f(X)]+Cov[f(X),f(X′)])\text{Var}[\hat{V}_{\text{anti}}] = \frac{1}{N}\left(\text{Var}[f(X)] + \text{Cov}[f(X), f(X')]\right)

如果协方差足够负,方差远小于 Var[f(X)]/N\text{Var}[f(X)]/N。

对 Black-Scholes 下的欧式看涨期权,XX 是终端对数收益。对偶是 −X-X(或者更精确地说,−log⁡ST+2log⁡S0-\log S_T + 2 \log S_0)。方差缩减通常是 30-50%,意味着你需要少 30-50% 的样本来达到相同精度。

技术推广:对任何有”对称”结构的分布(高斯、均匀、平移的指数),你可以构造对偶。

控制变量

想法:找到相关变量 YY,其期望 E[Y]\mathbb{E}[Y] 已知。用它通过下式缩减 V^\hat{V} 的方差

V^cv=V^N−β(YˉN−E[Y])\hat{V}_{\text{cv}} = \hat{V}_N - \beta (\bar{Y}_N - \mathbb{E}[Y])

其中 YˉN\bar{Y}_N 是 YY 的样本均值,β\beta 是回归系数。估计器的方差是

Var[V^cv]=Var[V^N](1−ρ2)\text{Var}[\hat{V}_{\text{cv}}] = \text{Var}[\hat{V}_N](1 - \rho^2)

其中 ρ\rho 是 f(X)f(X) 和 YY 之间的相关性。高相关性给出大方差缩减。

最优 β\beta 是 Cov[f(X),Y]/Var[Y]\text{Cov}[f(X), Y] / \text{Var}[Y],可从数据估计。

对欧式看涨期权,控制变量可以是股票价格本身:风险中性测度下 E[ST]=S0erT\mathbb{E}[S_T] = S_0 e^{rT}。估计器变成

V^cv=e−rT⋅1N∑imax⁡(STi−K,0)−β(1N∑iSTi−S0erT)\hat{V}_{\text{cv}} = e^{-rT} \cdot \frac{1}{N} \sum_i \max(S_T^i - K, 0) - \beta \left(\frac{1}{N} \sum_i S_T^i - S_0 e^{rT}\right)

方差缩减显著,因为看涨收益和 STS_T 高度相关(深度价内期权几乎完美相关)。

其他好的控制变量:

  • 算术平均亚式的几何平均亚式期权(存在闭式公式)。
  • 任何期权的 Black-Scholes delta(delta 近似是导数)。
  • 已实现波动率 vs. 期望波动率。
  • 债券价格(在许多模型中有闭式公式)。

对路径依赖或多资产期权,控制变量的选择更微妙。原则:选期望已知且与收益高相关的东西。

重要性采样

想法:从不同的分布采样,使重要结果更可能出现。用 Radon-Nikodym 导数计算期望:

V=EP[f(X)]=EQ[f(X)⋅dP/dQ]V = \mathbb{E}_P[f(X)] = \mathbb{E}_Q[f(X) \cdot dP/dQ]

对小概率事件模拟(例如深度虚值期权、信用违约),朴素 Monte Carlo 很少看到事件。重要性采样强迫模拟更经常看到它,然后重新加权样本来修正偏差。

对行权价远低于当前价格的欧式看跌期权,看跌很少被行权。朴素 Monte Carlo 给出估计方差很高因为大多数样本贡献零。重要性采样用倾斜分布使股票价格更可能下降,增加行权概率。

挑战:选择倾斜分布。最优选择是 dQ∗∝∣f(X)∣dPdQ^* \propto |f(X)| dP,按绝对收益加权的分布。这最小化重要性采样估计器的方差。实际中,这个分布不便处理,但你可以用高斯或另一个已知族近似它,集中在”重要”区域附近。

对深度虚值看跌期权,倾斜分布是带负漂移的 GBM(所以股票价格向下漂移)。倾斜 GBM 的均值在行权价,给出在行权价附近终止的最高概率。

方差缩减可以很显著。对深度虚值期权,100 或 1000 倍是常见的。代价是需要选择倾斜参数,这常常需要引导模拟。

分层采样

想法:把样本空间分成层,并从每层按比例采样。估计器是

V^strat=∑k=1KNkNVˉk\hat{V}_{\text{strat}} = \sum_{k=1}^K \frac{N_k}{N} \bar{V}_k

其中 Vˉk\bar{V}_k 是层 kk 中的样本均值,NkN_k 是该层中的样本数。

如果函数 ff 在每层内近似常数,方差缩减很大。最优分配是比例分配(Nk/NN_k / N 等于层 kk 的概率)或 Neyman 分配(正比于层内标准差)。

对欧式看涨期权,你可以对终端股票价格分层。把 STS_T 分成区间并从每个区间采样。这确保你在每个价格水平都有样本,不只接近均值附近。

分层采样在低维度(1-2)效果好但遭受”维度灾难”(层数指数增长)。对高维问题,拉丁超立方采样是使用随机分层的相关技术。

拉丁超立方采样

拉丁超立方是分层采样的多维扩展。对 dd 维和 NN 样本,你把每维分成 NN 个层并确保 NN 个样本中每个层被采样一次。样本使用拉丁方模式放置。

LHS 大致给出比朴素 MC 的 N\sqrt{N} 倍改善,类似于对偶变量。它在金融中广泛用于多资产模拟。

对高维问题(例如 10 个标的的篮子期权),LHS 是少数几个实际方差缩减技术之一。对偶和控制变量可以在其上添加以进一步改善。

一个工作例子:欧式看涨定价

让我们通过 Monte Carlo 给欧式看涨定价并看看方差缩减怎么帮忙。

import numpy as np

def call_payoff(ST, K):
    return np.maximum(ST - K, 0)

def bs_call(S0, K, r, sigma, T):
    """Black-Scholes call price for comparison."""
    from scipy.stats import norm
    d1 = (np.log(S0/K) + (r + 0.5*sigma**2)*T) / (sigma*np.sqrt(T))
    d2 = d1 - sigma*np.sqrt(T)
    return S0*norm.cdf(d1) - K*np.exp(-r*T)*norm.cdf(d2)

def simulate_terminal_prices(S0, r, sigma, T, n_paths, rng):
    Z = rng.standard_normal(n_paths)
    return S0 * np.exp((r - 0.5*sigma**2)*T + sigma*np.sqrt(T)*Z)

# Naive Monte Carlo
rng = np.random.default_rng(42)
ST = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 100000, rng)
payoff = call_payoff(ST, 100)
naive_price = np.exp(-0.05) * payoff.mean()
naive_se = np.exp(-0.05) * payoff.std() / np.sqrt(100000)
print(f"Naive MC: {naive_price:.4f}, SE: {naive_se:.4f}")

# Antithetic variates
rng = np.random.default_rng(42)
Z = rng.standard_normal(50000)
ST_plus = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 50000, rng)
# Use the same Z but flip sign for antithetic
rng2 = np.random.default_rng(43)
Z_anti = -Z
ST_anti = 100 * np.exp((0.05 - 0.5*0.20**2)*1.0 + 0.20*np.sqrt(1.0)*Z_anti)
payoff_anti = (call_payoff(ST_plus, 100) + call_payoff(ST_anti, 100)) / 2
anti_price = np.exp(-0.05) * payoff_anti.mean()
anti_se = np.exp(-0.05) * payoff_anti.std() / np.sqrt(50000)
print(f"Antithetic MC: {anti_price:.4f}, SE: {anti_se:.4f}")

# Control variate using stock price
rng = np.random.default_rng(42)
ST = simulate_terminal_prices(100, 0.05, 0.20, 1.0, 100000, rng)
payoff = call_payoff(ST, 100)
expected_ST = 100 * np.exp(0.05)
# Estimate beta
beta = np.cov(payoff, ST)[0,1] / np.var(ST)
cv_payoff = payoff - beta * (ST - expected_ST)
cv_price = np.exp(-0.05) * cv_payoff.mean()
cv_se = np.exp(-0.05) * cv_payoff.std() / np.sqrt(100000)
print(f"Control variate MC: {cv_price:.4f}, SE: {cv_se:.4f}")

# Compare with analytical
print(f"BS analytical: {bs_call(100, 100, 0.05, 0.20, 1.0):.4f}")

典型输出:

  • Naive MC: 10.42, SE: 0.13
  • Antithetic MC: 10.43, SE: 0.10
  • Control variate MC: 10.42, SE: 0.04

控制变量给出标准误的 10 倍缩减。对偶给出约 1.5 倍。两种方法都容易实现。

每种技术何时最好

对偶变量: 对对称分布和单调收益最好。容易实现。温和方差缩减。

控制变量: 当你有已知期望的相关变量时最好。如果相关性高,方差缩减可以很大(10-100 倍)。需要选对控制。

重要性采样: 对罕见事件和尾部概率最好。可以给出 100-1000 倍方差缩减。需要仔细设计倾斜分布。

分层采样: 对低维问题(1-3)最好。拉丁超立方推广到更高维。容易实现,温和方差缩减。

条件 Monte Carlo: 通过解析计算条件期望来缩减方差。对障碍期权、亚式期权和其他有路径依赖的权益有用,那里的条件期望可以基于部分路径信息计算。

实际中,组合最有效。对偶 + 控制变量,或重要性采样 + 控制变量,叠加方差缩减。许多生产系统用所有四种。

条件 Monte Carlo

对路径依赖期权,收益依赖整个路径,但通常你可以计算条件于部分路径信息的条件期望。这给出新随机变量,其期望等于期权价格但方差较低。

对带算术平均的亚式期权,条件于除最后一个之外的所有价格计算条件期望(这是带少一个平均区间的收益)。解析计算这给出带更低方差的条件 MC 估计器。

对障碍期权,条件于障碍前路径的条件期望是条件于生存的期权价值。这正是 Black-Scholes 公式条件于生存。

条件 MC 在与其他技术组合时特别强大。方差缩减可以是 10-100 倍,实现常常只是计算收益的不同方式。

闲话:Quasi-Monte Carlo

终极方差缩减是 quasi-Monte Carlo (QMC):用确定性低差异序列替换伪随机样本。收敛速率约 O(log⁡dN/N)O(\log^d N / N),对中等维度比 O(1/N)O(1/\sqrt{N}) 好得多。

QMC 对高达约 20 的维度极其有效。对更高维度,效益减小。QMC 在下一篇文章详细涵盖。它是金融 MC 最强大的通用方差缩减技术。

整合起来

典型的生产级 Monte Carlo 设置:

  1. 生成样本用 Sobol 或 Halton 序列(QMC)。
  2. 应用布朗桥梁结构缩减有效维度。
  3. 用对偶变量通过利用任何对称性。
  4. 加控制变量带已知期望。
  5. 用重要性采样对尾部风险事件。

这个组合可以给出比朴素 MC 多 100-1000 倍方差缩减。代价是实现复杂性。好处是合理样本大小的准确价格。

对典型衍生品定价问题需要朴素 MC 1,000,000 个样本来达到 1% 精度,这个组合可能只需 1,000-10,000 个样本来达到相同精度。加速是真实的。

需要带走的要点

方差缩减是高效 Monte Carlo 的关键。对偶变量、控制变量、重要性采样和分层采样是四种主要技术。每种都有清晰的使用场景。组合给出叠加方差缩减。

对金融 MC 问题,经验法则:总是用带股票价格或基于 delta 的控制的控制变量。对对称收益加对偶。对罕见事件加重要性采样。为了高精度加 QMC(下篇文章)。

参考文献:Glasserman (2004),第 4-5 章;Boyle (1977) 控制变量在期权定价;Glynn and Szechtman (2002) 一些理论结果。Glasserman 的书是金融 MC 的标准参考。第 4 章涵盖方差缩减技术(控制变量、对偶变量、重要性采样和分层采样)。第 5 章涵盖 quasi-Monte Carlo 和确定性低差异序列。理论背景在 Asmussen and Glynn (2007),Stochastic Simulation。

带回家的信息:不要在生产中跑朴素 MC。方差缩减技术容易实现并给出大加速。对朴素 MC 唯一的借口是当你不知道用什么控制变量或对偶,即使那时,对偶变量本质上免费。

控制变量详述

控制变量技术是金融 MC 的主力。让我们仔细推导并讨论实际实现。

假设我们想估计 μ=E[f(X)]\mu = \mathbb{E}[f(X)]。我们有相关随机变量 YY 已知期望 E[Y]=μY\mathbb{E}[Y] = \mu_Y。控制变量估计器是

μ^cv(β)=fˉ−β(Yˉ−μY)\hat{\mu}_{\text{cv}}(\beta) = \bar{f} - \beta (\bar{Y} - \mu_Y)

其中 fˉ\bar{f} 和 Yˉ\bar{Y} 是 ff 和 YY 的样本均值。

极小化 μ^cv\hat{\mu}_{\text{cv}} 方差的最优 β\beta 是

β∗=Cov[f(X),Y]Var[Y]\beta^* = \frac{\text{Cov}[f(X), Y]}{\text{Var}[Y]}

可从数据估计。代回,最小方差是

Var[μ^cv(β∗)]=Var[f](1−ρ2)N\text{Var}[\hat{\mu}_{\text{cv}}(\beta^*)] = \frac{\text{Var}[f](1 - \rho^2)}{N}

其中 ρ=Corr[f(X),Y]\rho = \text{Corr}[f(X), Y]。缩减因子是 1−ρ21 - \rho^2。

对高相关性,缩减显著。如果 ρ=0.95\rho = 0.95,方差缩减因子 10。如果 ρ=0.99\rho = 0.99,因子 50。

对欧式看涨期权用股票价格作控制变量,相关性依赖于价内程度。平价期权 ρ≈0.6−0.7\rho \approx 0.6-0.7(温和缩减)。深度价内期权 ρ≈0.95\rho \approx 0.95(大缩减)。深度价外期权 ρ≈0.3\rho \approx 0.3(小缩减)。所以控制变量对有显著内在价值的期权帮助更大。

多个控制变量

技术扩展到多个控制。对控制 Y1,…,YKY_1, \ldots, Y_K 有已知期望,最优估计器是

μ^mcv=fˉ−∑k=1Kβk(Yˉk−μYk)\hat{\mu}_{\text{mcv}} = \bar{f} - \sum_{k=1}^K \beta_k (\bar{Y}_k - \mu_{Y_k})

最优 β\beta 向量是 ff 对 YY 的线性回归的解。矩阵形式,

β∗=ΣYY−1σfY\beta^* = \Sigma_{YY}^{-1} \sigma_{fY}

其中 ΣYY\Sigma_{YY} 是 YY 的协方差矩阵,σfY\sigma_{fY} 是 ff 与 YY 的协方差。

实际中,你从数据通过最小二乘估计 β\beta。结果估计器等价于 ff 对 YY 的回归(截距由于已知期望被去掉)。

对多资产期权,多个控制变量(每个资产一个)有用。对路径依赖期权,已实现平均或运行极值如果它们期望已知可以是控制。

重要性采样深入

重要性采样是最强大的罕见事件技术。设置:

V=EP[f(X)]=∫f(x) dP(x)=∫f(x)dPdQ(x) dQ(x)=EQ[f(X)dPdQ(X)]V = \mathbb{E}_P[f(X)] = \int f(x) \, dP(x) = \int f(x) \frac{dP}{dQ}(x) \, dQ(x) = \mathbb{E}_Q\left[f(X) \frac{dP}{dQ}(X)\right]

重要性采样估计器是

V^is=1N∑i=1Nf(Xi)L(Xi)\hat{V}_{\text{is}} = \frac{1}{N} \sum_{i=1}^N f(X_i) L(X_i)

其中 Xi∼QX_i \sim Q,L=dP/dQL = dP/dQ 是似然比。

极小化方差的最优 QQ 是 dQ∗∝∣f∣ dPdQ^* \propto |f| \, dP。用这个 QQ,方差是零(估计器是常数)。实际中,我们用易处理族近似 Q∗Q^*。

对 GBM 下的深度虚值看跌期权,最优倾斜大约是带负漂移的 GBM,使倾斜分布的均值等于行权价。似然比修正倾斜。

对信用组合中的罕见违约事件,最优倾斜是强度过程漂移的偏移。似然比按偏移乘以时间积分强度成指数。

方差缩减依赖于事件的稀有性。对概率 10−610^{-6} 的事件,朴素 MC 需要 10810^8 个样本来观察一次。重要性采样可以给 100-1000 个样本足够准确估计。

分层采样实现

分层采样的最简实现:

  1. 把单位区间 [0,1][0, 1] 分成 KK 个等层 Ik=[(k−1)/K,k/K)I_k = [(k-1)/K, k/K)。
  2. 在每层采样 NkN_k 个均匀随机变量。
  3. 应用逆 CDF 得到目标分布的样本。
  4. 计算每个样本的函数值。

对 K=NK = N(每个样本一层),这等价于标准 Monte Carlo。对小 KK(少层),分层粗糙但确保分布覆盖。

最优层数 KK 依赖于问题。对简单 1D 问题,K=10K = 10 到 100100 是典型的。对多维问题,维度灾难让分层不可行。

与重要性采样的联系

重要性采样和分层采样相关。两者都重新加权样本以关注重要区域。区别是:重要性采样从连续重新加权的分布采样;分层采样把空间分成离散区域并从每个区域采样。

对连续重新加权,重要性采样更灵活。对离散结构(例如事件/无事件),分层采样更自然。

实际中,两种技术调好的话给出相似结果。选择依赖于问题和从业者的偏好。

QMC 的魔力

Quasi-Monte Carlo(下篇文章)用确定性低差异序列替换伪随机样本。收敛速率从 O(1/N)O(1/\sqrt{N}) 改善到 O(log⁡dN/N)O(\log^d N / N),对中等 NN 显著更好。

对 5 维问题带 N=10,000N = 10,000 样本,朴素 MC 误差级别 1/1001/100。QMC 误差级别 log⁡5(10000)/10000≈1.2/10000≈1/1000\log^5(10000)/10000 \approx 1.2/10000 \approx 1/1000。所以 QMC 对相同 NN 精度高约 10 倍。效益随 NN 增长。

对高维问题(例如 100 维篮子期权),QMC 仍有效但常数变差。对非常高维度,到 MC 的差距缩小。

方差缩减的实际配方

对典型衍生品定价问题:

  1. 从控制变量开始。 用底层作控制。它们的期望已知。这以最小努力给出 5-10 倍方差缩减。
  2. 加对偶。 对称收益受益。容易实现。给出 1.5-2 倍进一步缩减。
  3. 对路径依赖期权用布朗桥梁。 这重排序模拟以缩减有效维度。给出 2-5 倍进一步缩减。
  4. 如果合适,切换到 QMC。 对高达 20 的维度, Sobol 序列给出 5-50 倍进一步缩减。
  5. 对尾部风险事件,加重要性采样。 这对极罕见事件唯一有效技术。给出 100-1000 倍进一步缩减。

相对朴素 MC 的总加速可以容易达到 1000 倍。这区别于运行一晚的研究代码和运行秒级的生产代码。

为什么朴素 MC 常常错

令人惊讶的多从业者仍跑朴素 MC。他们引用简单性,但代价是真实的:相同精度多 1000 倍样本。对单次定价工作,这可能不重要。对需要数千次定价的校准,它区别于分钟和天。

如果你在金融中做 MC,至少用一种方差缩减技术。对偶变量免费。控制变量容易。QMC 需要更多设置但给出大效益。在生产中没有借口用朴素 MC。