主题切换
11.5 蒙特卡洛定价进阶
概念详解
当遇到路径依赖期权(亚式、障碍、回望)或多资产期权(篮子、最优表现)时,解析方法和偏微分方程方法(FEM/FDM)都不太方便。蒙特卡洛(Monte Carlo, MC) 通过模拟大量随机路径计算期望,成为最通用的方法。
但 MC 的核心局限是
主流方差缩减技术包括:
| 技术 | 加速倍数 | 适用场景 |
|---|---|---|
| 对偶变量 (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)})$$
标准误差为
方差缩减技术
对偶变量法
对偶变量法(Antithetic Variates)利用对称性:对每一条路径
$$\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}$$
此处有展示代码展开 ▼
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}})$$
其中
$$\beta^* = \frac{\text{Cov}(V, Y)}{\text{Var}(Y)}$$
此处有展示代码展开 ▼
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 为零,效率极低:
此处有展示代码展开 ▼
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 分解
当期权涉及多个标的资产时,需要模拟具有特定相关结构的多元随机过程。对于
$$\mathbf{L}\mathbf{L}^T = \Sigma, \quad \mathbf{Z}_{\text{correlated}} = \mathbf{L} \cdot \mathbf{Z}_{\text{independent}}$$
此处有展示代码展开 ▼
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 分解的优势在于其计算效率高(
Longstaff-Schwartz 最小二乘蒙特卡洛 (LSM)
对于美式期权(或百慕大期权)的蒙特卡洛定价,核心难点在于需要比较每个时间点的持有价值和立即行权价值,而持有价值依赖于未来的最优决策。
Longstaff 和 Schwartz (2001) 提出了一个巧妙方案:
- 从最后一期向前递推
- 在每个时间点,使用少量基函数(如 Laguerre 多项式)对持有价值进行回归
- 比较持有价值的拟合值与行权价值,做出最优行权决策
此处有展示代码展开 ▼
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:"路径数越多越准"
蒙特卡洛的
误区 2:"对偶变量一定加速 2 倍"
对偶变量加速的关键前提: pay-off 函数关于
误区 3:"控制变量的最优 一定是最小化 的系数"
应该用
误区 4:"LSM 适合所有美式期权"
LSM 对单一标的的简单美式期权效果很好;对高维(多资产美式)或奇异美式(百慕大、可转债)效果较差。长持仓的可转债通常需要专门的最小二乘 + 网格法结合。
误区 5:"MC 总是比 PDE 慢"
不一定。多资产美式期权用 PDE 计算量呈指数增长,而 MC 仍然线性。故多资产美式 basket 产品的定价只能用 LSM 类 MC 方法,FDM 无法扩展。
题目 1
小测验
题目 1:蒙特卡洛方法的核心收敛速度为?
题目 1:蒙特卡洛方法的核心收敛速度为?
- AA.
- BB.
- CC.
- DD.
查看答案与解析展开 ▼
正确答案:B
MC 估计量的标准误为 :由 开方得到,故收敛速度是 。这意味着精度每提高一位有效数字就要 100 倍路径,正是 MC 的核心瓶颈,也是方差缩减技术的价值所在。A 的 是方差(而非误差)的收敛速度;C 的 与 D 的指数收敛在标准 MC 下都不成立,只有拟蒙特卡洛的低差异序列才可能优于 。
题目 2
对偶变量法的本质是?
- AA. 增加一倍路径
- BB. 利用 pay-off 关于
的单调性,用配对路径 + 平均降低方差 - CC. 改变概率分布
- DD. 减去解析近似
查看答案与解析展开 ▼
正确答案:B
对偶变量对每条路径同时用 与 生成镜像配对,再取两条路径 pay-off 的平均。当 pay-off 关于 单调时,配对收益负相关,平均后方差显著下降,实测常给出 2-4 倍加速。A 错:它并不增加有效路径数,只是配对取均值;C 描述的是重要性采样(改变概率测度);D 是控制变量法——减去已知解析解的偏差项。
题目 3
Longstaff-Schwartz 方法的核心思路是?
- AA. 直接对历史数据回归
- BB. 增加大量路径
- CC. 从后向前反向递推,用回归函数逼近每一时间步的"持有价值",判断是否提前行权
- DD. 用 BS 近似代替
查看答案与解析展开 ▼
正确答案:C
LSM 从到期日向前反向递推,在每个可行权时点用基函数(如 或 Laguerre 多项式)对已贴现的未来现金流做回归,拟合出"持有价值",再与立即行权价值比较来决定是否行权,从而把 MC 用于美式期权定价。A 错:回归对象是模拟路径的贴现值,不是历史数据;B 单纯加路径解决不了提前行权的决策问题;D 用 BS 近似会丢掉美式溢价。还要注意 LSM 因回归误差倾向于低估真实价值。
实战练习
对偶变量加速测试: 编写 BS Call 的 MC 定价函数,比较标准 MC 与对偶变量法的收敛速度。绘制"
vs 标准误差"图(用 5 个 阶梯),观察对偶变量是否真的"减半"了误差。 几何 vs 算术亚式期权: 用对偶变量 + 控制变量(以几何亚式作为控制变量)为算术亚式期权定价。验证:控制变量将误差降低 5-20 倍,对比不开控制变量的效果。
重要性采样 on 深度 OTM 期权: 选
(深度 OTM)的 30 天到期的 Call(标的价格 )。分别用: - 标准 MC (1M 路径)
- 重要性采样(漂移调整到
) (200K 路径)
对比两种方法的精度差异。
LSM 美式 Put 价格收敛: 用 LSM 美式 Put,测试不同的基函数(常数、
、 、 、Laguerre 多项式)。绘制"基函数 vs 价格"图,理解过拟合与精度提升之间的取舍。 多资产篮子期权: 实现 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. 关于低差异序列的理论基础。
本章要点
- 蒙特卡洛 是路径依赖期权、多资产期权定价的"通用引擎",
收敛速度是其主要局限。 - 对偶变量法 利用 pay-off 关于
的单调性,简单且常给出 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)。