3、大数定律与中心极限定理:为什么蒙特卡洛模拟会收敛?收敛速度有多快?

好,咱们接着聊。上一章我们搭好了蒙特卡洛模拟的架子,扔了十万次骰子,算出了π的近似值。你可能会问:凭什么我扔的次数越多,结果就越准?这背后有没有数学撑腰?

当然有。而且这两个定理,说白了就是蒙特卡洛模拟的“定海神针”。一个是大数定律,告诉你“会收敛”;另一个是中心极限定理,告诉你“收敛多快”。

我个人习惯,讲理论之前先讲直觉。你想想看,你抛一枚硬币,抛10次可能正面7次,但抛10000次,正面比例是不是就死死咬在50%附近?这就是大数定律在起作用。我在项目中遇到过不少新人,跑完1000次模拟就急着下结论,结果误差大得离谱。嗯,这就是没理解“收敛速度”这个概念。

3.1 大数定律:为什么模拟会收敛?

大数定律(Law of Large Numbers, LLN)讲的是:当样本量足够大时,样本均值会无限逼近总体均值

用数学语言说:

设 X₁, X₂, ..., Xₙ 是独立同分布的随机变量,期望为 μ。
那么样本均值 X̄ₙ = (X₁ + X₂ + ... + Xₙ) / n
当 n → ∞ 时,X̄ₙ 依概率收敛到 μ。

说白了,你扔的骰子越多,平均结果就越接近理论期望值3.5。蒙特卡洛模拟就是靠这个吃饭的——我们用大量随机样本来逼近真实值。

核心要点:大数定律保证了蒙特卡洛模拟的一致性。只要样本量足够大,结果一定收敛到真值。但注意,它没告诉你“多大才算足够大”。

这里有个坑,我曾经踩过。大数定律要求样本是独立同分布的。如果你在模拟中用了有偏的随机数生成器,或者样本之间存在相关性,那大数定律就不灵了。结果可能收敛到错误的值,你还浑然不觉。

3.2 中心极限定理:收敛速度有多快?

大数定律只说了“会收敛”,但没告诉我们“多快”。这时候中心极限定理(Central Limit Theorem, CLT)就登场了。

中心极限定理说:样本均值的分布,会随着样本量增大,趋近于正态分布

更精确一点:

设 X₁, X₂, ..., Xₙ 独立同分布,期望 μ,方差 σ²。
那么样本均值 X̄ₙ 的标准化形式:
  Zₙ = (X̄ₙ - μ) / (σ / √n)
当 n → ∞ 时,Zₙ 的分布趋近于标准正态分布 N(0, 1)。

你想想看,这意味着什么?意味着我们可以用正态分布的性质,来量化蒙特卡洛模拟的误差。

具体来说,样本均值的标准差(也就是标准误)是:

SE = σ / √n

这里 σ 是总体标准差,n 是样本量。你看,收敛速度是 1/√n。也就是说,要想把误差减半,样本量需要变成原来的4倍。要想误差变成原来的十分之一,样本量需要变成100倍。

实战经验:我在做期权定价时,经常需要权衡精度和计算时间。如果要求误差在0.01以内,而σ大约是0.2,那么需要的样本量大约是 (0.2/0.01)² = 400。但实际中我通常会多跑一些,因为还要考虑随机波动。

3.3 收敛速度的直观理解

咱们用个表格来感受一下这个“1/√n”的收敛速度有多慢:

样本量 n 标准误 SE (假设 σ=1) 误差缩小倍数
100 0.100 1x
1,000 0.032 3.16x
10,000 0.010 10x
100,000 0.003 31.6x
1,000,000 0.001 100x

看到了吗?从100到10000,样本量增加了100倍,误差才缩小了10倍。这就是为什么蒙特卡洛模拟在要求高精度时,计算量会变得非常恐怖。

3.4 知识体系:一张图看懂

下面我用一张SVG图,把这两个定理的关系和蒙特卡洛模拟的收敛逻辑串起来:

蒙特卡洛模拟收敛的理论基础 大数定律 (LLN) 样本均值 → 总体均值 保证模拟会收敛 但没说多快 中心极限定理 (CLT) 样本均值分布 → 正态分布 标准误 = σ / √n 量化了收敛速度 蒙特卡洛模拟的收敛特性 收敛速度:O(1/√n) —— 慢,但稳定 误差减半 → 样本量需增4倍 实战建议 先跑小样本估算σ,再根据目标精度反推n 必要时使用方差缩减技术加速收敛

3.5 代码验证:用实验说话

光说不练假把式。咱们写段Python代码,直观感受一下收敛过程:

import numpy as np
import matplotlib.pyplot as plt

# 模拟抛硬币:正面=1,反面=0,期望值=0.5
np.random.seed(42)
n_trials = 100000
results = np.random.binomial(1, 0.5, n_trials)

# 计算累积均值
cumulative_mean = np.cumsum(results) / np.arange(1, n_trials + 1)

# 计算理论标准误
std_dev = 0.5  # 伯努利分布标准差
se = std_dev / np.sqrt(np.arange(1, n_trials + 1))

# 打印关键节点
for n in [100, 1000, 10000, 100000]:
    print(f"n={n:6d}: 均值={cumulative_mean[n-1]:.4f}, "
          f"理论值=0.5000, 误差={abs(cumulative_mean[n-1]-0.5):.4f}, "
          f"标准误={se[n-1]:.4f}")

输出结果:

n=   100: 均值=0.4900, 理论值=0.5000, 误差=0.0100, 标准误=0.0500
n=  1000: 均值=0.4970, 理论值=0.5000, 误差=0.0030, 标准误=0.0158
n= 10000: 均值=0.4995, 理论值=0.5000, 误差=0.0005, 标准误=0.0050
n=100000: 均值=0.5001, 理论值=0.5000, 误差=0.0001, 标准误=0.0016

你看,随着n增大,误差确实在缩小,而且缩小的速度跟标准误的下降速度基本一致。n从100到10000增加了100倍,误差从0.01降到了0.0005,大约缩小了20倍,接近√100=10倍的预期。

注意:中心极限定理要求样本量足够大。对于偏态分布(比如对数正态分布),可能需要更大的样本量才能让样本均值近似正态。我曾经在模拟信用损失分布时吃过这个亏——尾部太厚,n=1000时均值分布还是歪的。

3.6 实际应用中的收敛判断

在量化风控实战中,我们怎么判断模拟是否收敛?我个人习惯用三个指标:

  1. 标准误阈值:设定一个目标标准误,比如0.001,然后反推需要的样本量。
  2. 置信区间宽度:用样本均值 ± 1.96×标准误构造95%置信区间,看区间宽度是否满足业务要求。
  3. 稳定性检查:把样本分成若干块,看各块的均值是否稳定。如果波动很大,说明还没收敛。

举个例子,我在做VaR(风险价值)计算时,通常要求标准误不超过VaR估计值的1%。如果VaR大约是100万,那标准误就要控制在1万以内。根据σ/√n ≤ 10000,反推出n至少需要多少。

小技巧:先跑一个5000次的预模拟,估算出σ,然后用公式 n = (z × σ / 目标误差)² 算出所需样本量。这样不会一上来就跑几百万次,浪费计算资源。

好了,这一章的核心就这些。大数定律给了我们信心,中心极限定理给了我们工具。记住那个1/√n的收敛速度,下次做蒙特卡洛模拟时,你就能心里有数:跑多少样本,能达到什么精度。


专注资料整理