4. 蒙特卡洛模拟基础
在进入 Longstaff-Schwartz 算法之前,必须先打好蒙特卡洛模拟的地基。美式期权的定价之所以复杂,核心在于提前行权决策依赖于未来路径信息,而蒙特卡洛天然擅长处理高维、路径依赖的问题。本节将把随机过程、布朗运动、几何布朗运动、风险中性定价与路径生成这五个概念串成一条完整的逻辑链,为后续最小二乘回归定价铺路。
一、核心原理:从随机过程到风险中性世界
随机过程是描述资产价格随时间演化的数学工具。在期权定价中,我们最关心的是马尔可夫性与独立增量这两个性质:前者意味着未来只依赖当前状态,后者意味着不同时间段的随机扰动互不相关。标准布朗运动(Wiener 过程)正是同时满足这两点的连续时间随机过程,记作 \(W_t\),其增量服从正态分布:
W_0 = 0
W_t - W_s ~ N(0, t - s), 对任意 0 ≤ s < t
增量之间相互独立
但布朗运动本身不能直接描述股价,因为股价不能为负,且收益率应与价格水平无关。于是引入几何布朗运动(GBM):
dS_t = μ S_t dt + σ S_t dW_t
其中 μ 为漂移率,σ 为波动率。通过伊藤引理可得其解析解:
S_t = S_0 · exp[(μ - σ²/2)t + σ W_t]
在风险中性定价框架下,我们把漂移率 μ 替换为无风险利率 r,得到风险中性测度下的价格演化:
S_t = S_0 · exp[(r - σ²/2)t + σ W_t]
此时任意衍生品的价格等于其未来现金流的风险中性期望按无风险利率贴现。这一转换是蒙特卡洛定价的理论基石。
二、方法流程:路径生成的标准步骤
在代码实现中,路径生成通常遵循以下流程。以欧式期权为例,我们只需要终端价格;但美式期权需要完整路径,因此必须保存每个时间步的价格。
- 设定参数:初始价格 S₀、无风险利率 r、波动率 σ、到期时间 T、时间步数 N、模拟路径数 M。
- 计算时间步长:Δt = T / N。
- 生成标准正态随机数:为每条路径、每个时间步生成 Z ~ N(0,1)。
- 递推价格路径:利用 GBM 离散格式 Sₜ₊₁ = Sₜ · exp[(r - σ²/2)Δt + σ√Δt · Z]。注意这里使用风险中性漂移 r。
- 存储路径矩阵:得到 M × (N+1) 的矩阵,第一列为 S₀。
- 计算现金流并贴现:根据行权策略确定每条路径的现金流,再按无风险利率贴现到 0 时刻,取平均得到期权价格。
三、案例场景:用 Python 生成 5 条 GBM 路径
下面是一段可直接运行的 Python 代码,展示如何生成并可视化几何布朗运动路径。该代码也是后续 Longstaff-Schwartz 算法的路径生成模块。
import numpy as np
import matplotlib.pyplot as plt
S0 = 100 # 初始价格
r = 0.05 # 无风险利率
sigma = 0.2 # 波动率
T = 1.0 # 到期时间(年)
N = 50 # 时间步数
M = 5 # 路径数
dt = T / N
np.random.seed(42)
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((r - 0.5 * sigma**2) * dt
+ sigma * np.sqrt(dt) * Z[:, t-1])
plt.plot(np.linspace(0, T, N + 1), S.T)
plt.xlabel("Time (years)")
plt.ylabel("Stock Price")
plt.title("Geometric Brownian Motion Paths")
plt.show()
运行后你会看到 5 条从 100 出发、带有随机波动但整体呈上升趋势的路径。若把 M 增大到 10000,路径会形成一条“扇形”分布,终端价格近似服从对数正态分布。
四、误区与复盘:常见陷阱与检查清单
初学者在蒙特卡洛路径生成中经常踩坑,以下清单可作为代码审查的对照表。
| 误区 | 后果 | 正确做法 |
|---|---|---|
| 漂移项写成 rΔt | 价格系统性偏高 | 使用 (r - σ²/2)Δt |
| 忘记乘以 √Δt | 波动被严重低估 | σ√Δt · Z |
| 随机数未固定种子 | 结果不可复现 | 设置 np.random.seed() |
| 路径数太少 | 标准误过大 | M ≥ 10000,必要时用对偶变量法 |
| 时间步太少 | 离散误差大 | N ≥ 50,美式期权建议 N ≥ 100 |
复盘时建议做两个验证:第一,用蒙特卡洛给欧式看涨期权定价,与 Black-Scholes 解析解对比,误差应在标准误范围内;第二,检查路径矩阵的终端均值是否接近 S₀·e^{rT}。这两个检查能快速定位漂移项或波动项的错误。