4. Monte Carlo 原理:大数定律、中心极限定理、随机抽样与模拟收敛性
Monte Carlo 模拟并非一种“黑箱”算法,其数学根基建立在概率论的两大支柱之上:大数定律与中心极限定理。理解这两个定理,以及它们如何驱动随机抽样与模拟收敛,是搭建可靠风险复核流程的前提。
4.1 大数定律:模拟为什么能逼近真实值
大数定律(Law of Large Numbers, LLN)告诉我们:当独立同分布的随机变量样本量 \( n \) 足够大时,样本均值 \(\bar{X}_n\) 会依概率收敛于总体期望值 \(\mu\)。
在 Monte Carlo 模拟中,这意味着:
- 样本量越大,估计越准:你抽取的随机路径越多,模拟输出的平均值就越接近真实风险值(如 VaR、预期损失)。
- 收敛是概率性的:并非精确,但误差随 \( n \) 增大而缩小的概率趋近于 1。
风险复核启示: 不要因为一次模拟结果“看起来合理”就停止。大数定律要求你检查样本量是否足够支撑结论。在复核流程中,建议至少运行 10,000 次以上路径,并观察均值是否趋于稳定。
4.2 中心极限定理:误差的分布形态
中心极限定理(Central Limit Theorem, CLT)进一步刻画了误差的分布:当 \( n \) 足够大时,样本均值 \(\bar{X}_n\) 近似服从正态分布,其标准差(即标准误)为 \(\sigma / \sqrt{n}\)。
CLT 对 Monte Carlo 模拟的关键意义:
- 误差可量化:模拟估计值 \(\hat{\theta}\) 的误差服从正态分布,你可以构建置信区间。
- 收敛速度已知:误差以 \( 1/\sqrt{n} \) 的速度衰减。要将误差减半,样本量需要扩大 4 倍。
- 风险决策有依据:你可以回答“模拟结果与真实值相差超过 5% 的概率是多少”。
| 定理 | 核心结论 | 对 Monte Carlo 的意义 |
|---|---|---|
| 大数定律 (LLN) | 样本均值 → 总体期望(概率收敛) | 保证模拟最终会收敛到正确值 |
| 中心极限定理 (CLT) | 样本均值的分布 → 正态分布 | 提供误差的分布形态与置信区间 |
4.3 随机抽样:从理论到实践
Monte Carlo 模拟的核心操作是随机抽样。在风险复核中,你需要从已知的概率分布中生成随机数,模拟未来可能出现的各种情景。
常见的抽样方法包括:
- 逆变换法:适用于累积分布函数 (CDF) 可解析求逆的分布(如指数分布)。
- 接受-拒绝法:适用于 CDF 难以求逆的分布(如 Beta 分布)。
- Box-Muller 变换:专门用于生成标准正态分布随机数。
伪随机数生成器 (PRNG) 选择: 在风险复核中,推荐使用 Mersenne Twister (MT19937) 或 PCG 系列生成器。避免使用老旧的
rand() 函数,其周期短且存在低维空间相关性,可能导致模拟结果偏差。
4.4 模拟收敛性:如何判断模拟是否“跑够了”
收敛性判断是风险复核流程中不可省略的步骤。你需要一套客观标准来回答:“模拟结果是否已经稳定到可以用于决策?”
常用的收敛性诊断方法:
- 均值-样本量图:绘制累积均值随样本量变化的曲线,观察是否趋于水平。
- 标准误监控:计算当前估计值的标准误 \(\hat{\sigma} / \sqrt{n}\),当标准误低于预设阈值时停止。
- 置信区间宽度:设定 95% 置信区间,当区间宽度小于风险容忍度(如 VaR 的 ±1%)时认为收敛。
- Gelman-Rubin 诊断:运行多条独立链,比较链内方差与链间方差,当比例因子 \(\hat{R} < 1.1\) 时认为收敛。
4.5 收敛速度与样本量规划
根据 CLT,Monte Carlo 模拟的收敛速度为 \( O(1/\sqrt{n}) \)。这意味着:
- 精度提升成本高:要将估计误差降低到原来的 1/10,样本量需要扩大 100 倍。
- 风险复核中的实用策略:先运行 1,000 次快速预览,再根据预览结果的标准误决定最终样本量。
常见误区: 不要盲目追求“百万次模拟”。在风险复核中,10,000–50,000 次通常已足够。过度增加样本量会浪费计算资源,且对精度提升有限。关键在于使用方差缩减技术(如对偶变量、控制变量)来加速收敛。
4.6 随机抽样在风险复核中的代码示例
以下 Python 代码演示了如何从正态分布中抽样,并利用大数定律与中心极限定理监控模拟收敛性:
import numpy as np
import matplotlib.pyplot as plt
# 参数设置
mu, sigma = 0.05, 0.20 # 年化收益率与波动率
n_max = 50000 # 最大模拟次数
batch_size = 1000 # 每批增量
# 累积统计量
cumulative_mean = []
cumulative_std = []
n_values = []
for n in range(batch_size, n_max + 1, batch_size):
# 生成 n 个标准正态随机数,并转换为收益率
z = np.random.normal(0, 1, n)
returns = mu + sigma * z
# 计算累积均值与标准误
mean_est = np.mean(returns)
se_est = np.std(returns, ddof=1) / np.sqrt(n)
cumulative_mean.append(mean_est)
cumulative_std.append(se_est)
n_values.append(n)
# 检查收敛性:当标准误小于 0.001 时停止
converged_n = None
for i, se in enumerate(cumulative_std):
if se < 0.001:
converged_n = n_values[i]
break
print(f"模拟收敛所需样本量: {converged_n}")
print(f"最终均值估计: {cumulative_mean[-1]:.6f}")
print(f"最终标准误: {cumulative_std[-1]:.6f}")
4.7 风险复核中的收敛性检查清单
| 检查项 | 方法 | 通过标准 |
|---|---|---|
| 均值稳定性 | 绘制累积均值曲线 | 曲线在尾部无明显趋势性波动 |
| 标准误阈值 | 计算当前标准误 | 标准误 < 风险容忍度 × 估计值 |
| 置信区间宽度 | 95% CI = 均值 ± 1.96 × 标准误 | 区间宽度 < 预设阈值(如 VaR 的 1%) |
| 链间一致性 | Gelman-Rubin \(\hat{R}\) | \(\hat{R} < 1.1\) |
掌握大数定律与中心极限定理,你就能从“盲目运行模拟”转变为“有策略地规划模拟”。在风险复核流程中,这不仅是数学正确性的保障,更是向审计方、管理层证明模拟结果可信度的关键论据。