Monte Carlo 方差缩减:用更少样本拿相同精度
对偶变量、控制变量、重要性采样和分层采样,让 Monte Carlo 模拟更快收敛的四种技术。
Monte Carlo 是给衍生品定价的通用工具。它对任何模型、任何收益、任何维度都有效。但它收敛得慢,标准误随 缩放,其中 是样本数。要多一位精度,你需要 100 倍的样本。
方差缩减是用更少样本获得相同精度的艺术。对设计良好的方差缩减方案,误差可以比 缩放得好得多。一些技术给出 10 倍或 100 倍的加速几乎不需要额外工作。
这篇文章涵盖四种主要技术:对偶变量、控制变量、重要性采样和分层采样。每种都从头推导,用工作例子说明,并在金融场景中展示。
Monte Carlo 设置
价格 的标准 Monte Carlo 估计器是
其中 是 分布的 i.i.d. 样本。估计器的方差是 。标准误是 ,这给出 收敛速率。
方差缩减旨在降低 或使用更聪明的估计器以在相同 下达到更低方差。两个估计器的相对效率是它们对方差之比对于相同 。
对偶变量
想法:如果 有对称分布,生成对 ,其中 是 的”对偶”(例如如果 关于零对称,)。对函数值取平均:
对对称分布上的单调函数 , 和 是负相关的。该均值的方差是
如果协方差足够负,方差远小于 。
对 Black-Scholes 下的欧式看涨期权, 是终端对数收益。对偶是 (或者更精确地说,)。方差缩减通常是 30-50%,意味着你需要少 30-50% 的样本来达到相同精度。
技术推广:对任何有”对称”结构的分布(高斯、均匀、平移的指数),你可以构造对偶。
控制变量
想法:找到相关变量 ,其期望 已知。用它通过下式缩减 的方差
其中 是 的样本均值, 是回归系数。估计器的方差是
其中 是 和 之间的相关性。高相关性给出大方差缩减。
最优 是 ,可从数据估计。
对欧式看涨期权,控制变量可以是股票价格本身:风险中性测度下 。估计器变成
方差缩减显著,因为看涨收益和 高度相关(深度价内期权几乎完美相关)。
其他好的控制变量:
- 算术平均亚式的几何平均亚式期权(存在闭式公式)。
- 任何期权的 Black-Scholes delta(delta 近似是导数)。
- 已实现波动率 vs. 期望波动率。
- 债券价格(在许多模型中有闭式公式)。
对路径依赖或多资产期权,控制变量的选择更微妙。原则:选期望已知且与收益高相关的东西。
重要性采样
想法:从不同的分布采样,使重要结果更可能出现。用 Radon-Nikodym 导数计算期望:
对小概率事件模拟(例如深度虚值期权、信用违约),朴素 Monte Carlo 很少看到事件。重要性采样强迫模拟更经常看到它,然后重新加权样本来修正偏差。
对行权价远低于当前价格的欧式看跌期权,看跌很少被行权。朴素 Monte Carlo 给出估计方差很高因为大多数样本贡献零。重要性采样用倾斜分布使股票价格更可能下降,增加行权概率。
挑战:选择倾斜分布。最优选择是 ,按绝对收益加权的分布。这最小化重要性采样估计器的方差。实际中,这个分布不便处理,但你可以用高斯或另一个已知族近似它,集中在”重要”区域附近。
对深度虚值看跌期权,倾斜分布是带负漂移的 GBM(所以股票价格向下漂移)。倾斜 GBM 的均值在行权价,给出在行权价附近终止的最高概率。
方差缩减可以很显著。对深度虚值期权,100 或 1000 倍是常见的。代价是需要选择倾斜参数,这常常需要引导模拟。
分层采样
想法:把样本空间分成层,并从每层按比例采样。估计器是
其中 是层 中的样本均值, 是该层中的样本数。
如果函数 在每层内近似常数,方差缩减很大。最优分配是比例分配( 等于层 的概率)或 Neyman 分配(正比于层内标准差)。
对欧式看涨期权,你可以对终端股票价格分层。把 分成区间并从每个区间采样。这确保你在每个价格水平都有样本,不只接近均值附近。
分层采样在低维度(1-2)效果好但遭受”维度灾难”(层数指数增长)。对高维问题,拉丁超立方采样是使用随机分层的相关技术。
拉丁超立方采样
拉丁超立方是分层采样的多维扩展。对 维和 样本,你把每维分成 个层并确保 个样本中每个层被采样一次。样本使用拉丁方模式放置。
LHS 大致给出比朴素 MC 的 倍改善,类似于对偶变量。它在金融中广泛用于多资产模拟。
对高维问题(例如 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):用确定性低差异序列替换伪随机样本。收敛速率约 ,对中等维度比 好得多。
QMC 对高达约 20 的维度极其有效。对更高维度,效益减小。QMC 在下一篇文章详细涵盖。它是金融 MC 最强大的通用方差缩减技术。
整合起来
典型的生产级 Monte Carlo 设置:
- 生成样本用 Sobol 或 Halton 序列(QMC)。
- 应用布朗桥梁结构缩减有效维度。
- 用对偶变量通过利用任何对称性。
- 加控制变量带已知期望。
- 用重要性采样对尾部风险事件。
这个组合可以给出比朴素 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 的主力。让我们仔细推导并讨论实际实现。
假设我们想估计 。我们有相关随机变量 已知期望 。控制变量估计器是
其中 和 是 和 的样本均值。
极小化 方差的最优 是
可从数据估计。代回,最小方差是
其中 。缩减因子是 。
对高相关性,缩减显著。如果 ,方差缩减因子 10。如果 ,因子 50。
对欧式看涨期权用股票价格作控制变量,相关性依赖于价内程度。平价期权 (温和缩减)。深度价内期权 (大缩减)。深度价外期权 (小缩减)。所以控制变量对有显著内在价值的期权帮助更大。
多个控制变量
技术扩展到多个控制。对控制 有已知期望,最优估计器是
最优 向量是 对 的线性回归的解。矩阵形式,
其中 是 的协方差矩阵, 是 与 的协方差。
实际中,你从数据通过最小二乘估计 。结果估计器等价于 对 的回归(截距由于已知期望被去掉)。
对多资产期权,多个控制变量(每个资产一个)有用。对路径依赖期权,已实现平均或运行极值如果它们期望已知可以是控制。
重要性采样深入
重要性采样是最强大的罕见事件技术。设置:
重要性采样估计器是
其中 , 是似然比。
极小化方差的最优 是 。用这个 ,方差是零(估计器是常数)。实际中,我们用易处理族近似 。
对 GBM 下的深度虚值看跌期权,最优倾斜大约是带负漂移的 GBM,使倾斜分布的均值等于行权价。似然比修正倾斜。
对信用组合中的罕见违约事件,最优倾斜是强度过程漂移的偏移。似然比按偏移乘以时间积分强度成指数。
方差缩减依赖于事件的稀有性。对概率 的事件,朴素 MC 需要 个样本来观察一次。重要性采样可以给 100-1000 个样本足够准确估计。
分层采样实现
分层采样的最简实现:
- 把单位区间 分成 个等层 。
- 在每层采样 个均匀随机变量。
- 应用逆 CDF 得到目标分布的样本。
- 计算每个样本的函数值。
对 (每个样本一层),这等价于标准 Monte Carlo。对小 (少层),分层粗糙但确保分布覆盖。
最优层数 依赖于问题。对简单 1D 问题, 到 是典型的。对多维问题,维度灾难让分层不可行。
与重要性采样的联系
重要性采样和分层采样相关。两者都重新加权样本以关注重要区域。区别是:重要性采样从连续重新加权的分布采样;分层采样把空间分成离散区域并从每个区域采样。
对连续重新加权,重要性采样更灵活。对离散结构(例如事件/无事件),分层采样更自然。
实际中,两种技术调好的话给出相似结果。选择依赖于问题和从业者的偏好。
QMC 的魔力
Quasi-Monte Carlo(下篇文章)用确定性低差异序列替换伪随机样本。收敛速率从 改善到 ,对中等 显著更好。
对 5 维问题带 样本,朴素 MC 误差级别 。QMC 误差级别 。所以 QMC 对相同 精度高约 10 倍。效益随 增长。
对高维问题(例如 100 维篮子期权),QMC 仍有效但常数变差。对非常高维度,到 MC 的差距缩小。
方差缩减的实际配方
对典型衍生品定价问题:
- 从控制变量开始。 用底层作控制。它们的期望已知。这以最小努力给出 5-10 倍方差缩减。
- 加对偶。 对称收益受益。容易实现。给出 1.5-2 倍进一步缩减。
- 对路径依赖期权用布朗桥梁。 这重排序模拟以缩减有效维度。给出 2-5 倍进一步缩减。
- 如果合适,切换到 QMC。 对高达 20 的维度, Sobol 序列给出 5-50 倍进一步缩减。
- 对尾部风险事件,加重要性采样。 这对极罕见事件唯一有效技术。给出 100-1000 倍进一步缩减。
相对朴素 MC 的总加速可以容易达到 1000 倍。这区别于运行一晚的研究代码和运行秒级的生产代码。
为什么朴素 MC 常常错
令人惊讶的多从业者仍跑朴素 MC。他们引用简单性,但代价是真实的:相同精度多 1000 倍样本。对单次定价工作,这可能不重要。对需要数千次定价的校准,它区别于分钟和天。
如果你在金融中做 MC,至少用一种方差缩减技术。对偶变量免费。控制变量容易。QMC 需要更多设置但给出大效益。在生产中没有借口用朴素 MC。