3、蒙特卡洛模拟:随机数生成、路径模拟、方差缩减技术
蒙特卡洛模拟,说白了就是用大量随机样本来逼近真实结果。做路径依赖期权定价时,这招几乎是绕不开的。我个人习惯把它看作「用计算量换解析解」——既然很多随机微分方程没有闭式解,那就让计算机帮我们暴力求解。
3.1 随机数生成:一切模拟的起点
蒙特卡洛模拟的核心是随机数。但计算机生成的其实是伪随机数——嗯,这里要注意,真正的随机性在计算机里很难实现。我们用的是确定性算法生成的序列,只不过它看起来够随机。
我在项目中遇到过一个问题:用C++的rand()直接生成随机数,结果期权价格波动大得离谱。后来才发现,默认的线性同余生成器周期太短,高维模拟时相关性会出问题。
核心要点:金融模拟中,推荐使用梅森旋转算法(Mersenne Twister)或更现代的PCG系列。Python的numpy.random默认就是MT19937,周期长达2^19937-1,够用。
# Python示例:生成标准正态随机数
import numpy as np
# 设置种子,保证可复现
np.random.seed(42)
# 生成1000个标准正态随机数
z = np.random.standard_normal(1000)
# 或者用Box-Muller变换(自己实现时常用)
u1 = np.random.uniform(0, 1, 500)
u2 = np.random.uniform(0, 1, 500)
z_box = np.sqrt(-2 * np.log(u1)) * np.cos(2 * np.pi * u2)
个人经验:我建议每次模拟前都固定种子。不是为了「作弊」,而是为了调试和复现。你想想看,如果每次跑结果都不一样,你怎么排查代码bug?
3.2 路径模拟:从随机数到资产价格
有了随机数,下一步就是模拟资产价格路径。对于几何布朗运动,我们通常用欧拉离散化或精确离散化。
为什么会用两种方法?因为效率不同。欧拉法通用性强,但步长大了误差明显。精确法只适用于GBM,但一步到位。
| 方法 | 公式 | 适用场景 |
|---|---|---|
| 欧拉离散化 | S(t+Δt) = S(t) + μS(t)Δt + σS(t)√Δt·z | 通用,适合复杂SDE |
| 精确离散化 | S(t+Δt) = S(t)·exp((μ-σ²/2)Δt + σ√Δt·z) | 仅限GBM,精度高 |
# 路径模拟:几何布朗运动
def simulate_gbm(S0, mu, sigma, T, N, M):
"""
S0: 初始价格
mu: 漂移率
sigma: 波动率
T: 到期时间
N: 时间步数
M: 模拟路径数
"""
dt = T / N
# 生成随机数矩阵 (M x N)
z = np.random.standard_normal((M, N))
# 精确离散化
S = np.zeros((M, N+1))
S[:, 0] = S0
for t in range(1, N+1):
S[:, t] = S[:, t-1] * np.exp(
(mu - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * z[:, t-1]
)
return S
避坑指南:我曾经在模拟亚式期权时,直接用欧拉法取了100个时间步,结果价格偏差了3%。后来换成精确离散化,偏差降到0.2%。对于路径依赖期权,时间步数太少会引入离散化偏差,我建议至少取252步(对应交易日数)。
3.3 方差缩减技术:让模拟跑得更快
蒙特卡洛的收敛速度是O(1/√N)。想提高一倍精度,需要四倍计算量。这太慢了。所以我们需要方差缩减技术——说白了,就是用更少的路径达到同样的精度。
3.3.1 对偶变量法
这个方法很巧妙。每生成一个随机数z,同时用它的相反数-z。这样两条路径天然负相关,组合起来方差直接减半。
# 对偶变量法示例
def antithetic_simulation(S0, mu, sigma, T, N, M):
dt = T / N
z = np.random.standard_normal((M//2, N))
# 生成对偶路径
z_antithetic = -z
# 合并
z_all = np.vstack([z, z_antithetic])
# 后续模拟同上...
return S
效果:对偶变量法通常能减少30%-50%的方差。而且几乎不增加计算量——你想想看,生成随机数的成本远低于路径模拟本身。
3.3.2 控制变量法
这个思路更直接:找一个已知期望的变量Y,用它来修正我们关心的变量X。公式很简单:
X_cv = X + β · (Y - E[Y])
我在项目中遇到过用标的资产价格作为控制变量来定价亚式期权的情况。标的资产价格有解析期望,而亚式期权的路径平均值没有。用这个技巧,方差能降低80%以上。
个人建议:控制变量的选择很关键。理想情况下,Y应该和X高度相关,而且E[Y]容易计算。常见的控制变量包括:标的资产终值、离散红利、甚至另一个相近期权的价格。
3.3.3 重要抽样法
这个方法适合处理「小概率事件」——比如深度价外期权。直接模拟的话,大部分路径都归零,浪费计算资源。重要抽样法改变概率测度,让更多「有价值」的路径被采样。
嗯,这里要注意:重要抽样法需要计算Radon-Nikodym导数来修正偏差。用不好反而会放大方差。
3.4 知识体系总览
下面这张图总结了蒙特卡洛模拟的核心逻辑:
3.5 实际应用中的取舍
讲完理论,说说实际怎么选。我个人习惯遵循一个原则:
- 简单期权(欧式、美式):直接用精确离散化 + 对偶变量法。代码简单,效果稳定。
- 路径依赖期权(亚式、回望):欧拉离散化 + 控制变量法。控制变量选标的资产终值或离散红利。
- 奇异期权(障碍、双币种):重要抽样法。尤其是深度价外障碍期权,普通模拟几乎跑不出有效路径。
注意:方差缩减技术不是万能的。我曾经在一个项目中同时用了对偶变量、控制变量和重要抽样,结果方差反而变大了。原因是对偶变量和控制变量之间产生了正相关。所以,组合使用时一定要先测试相关性。
好了,蒙特卡洛模拟的核心就这些。随机数生成是地基,路径模拟是骨架,方差缩减技术是加速器。三者缺一不可。实际项目中,我建议先从最简单的方案开始,等发现精度不够时再逐步加入方差缩减技术——别一开始就搞得太复杂。