大数定律与中心极限定理
两个定理支配着平均值在收集更多数据时的行为。大数定律说平均值会收敛;中心极限定理说它们的分布会变成正态。
概率的两大支柱
大数定律(LLN)和中心极限定理(CLT)是概率论中两个最有用的结果。它们共同解释了金融和统计学中许多现象背后的原理。LLN 告诉我们,随着数据的增加,平均值会变得更加稳定。CLT 告诉我们更深一层的东西:即使底层数据不是正态分布,许多观测值的平均值也倾向于正态分布。
大数定律
想象抛一枚公平的硬币10次。你可能不会正好得到5个正面。也许你得到7个。正面比例是0.7,而不是真实概率0.5。现在抛同一枚公平的硬币10000次。你几乎肯定会非常接近5000个正面——即0.5的比例。这正是大数定律在发挥作用。
弱大数定律指出,样本均值 依概率收敛到真实均值 (当 时):
更正式地说,对任意 :
强大数定律是一个更强的结果:样本均值几乎必然收敛到 (概率为1)。两者的区别是技术性的,但在严格的概率论中很重要。
关键要求是随机变量是独立同分布(i.i.d.)且均值有限。如果均值不存在(如柯西分布的情况),LLN 就不适用。
蒙特卡洛直觉
蒙特卡洛模拟本质上是把大数定律计算化。为了估计 ,你可以随机向一个内含四分之一圆的正方形投飞镖。落在圆内飞镖的比例随着飞镖数量的增加收敛到 :
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42)
def estimate_pi_monte_carlo(n):
x = np.random.uniform(0, 1, n)
y = np.random.uniform(0, 1, n)
inside = x**2 + y**2 <= 1
return 4 * np.sum(inside) / n
n_values = [10, 50, 100, 500, 1000, 5000, 10000, 50000, 100000, 500000]
estimates = [estimate_pi_monte_carlo(n) for n in n_values]
plt.figure(figsize=(10, 5))
plt.semilogx(n_values, estimates, 'bo-', label='Monte Carlo estimate')
plt.axhline(y=np.pi, color='red', linestyle='--', label=f'True π = {np.pi:.6f}')
plt.xlabel('样本数量(对数刻度)')
plt.ylabel('π 的估计值')
plt.title('大数定律:蒙特卡洛收敛')
plt.legend()
plt.grid(alpha=0.3)
plt.show()
print(f"用500,000个样本的最终估计: {estimates[-1]:.6f}")
print(f"π 的真实值: {np.pi:.6f}")
提示词
用 numpy 蒙特卡洛模拟 π:在单位方框内随机采样,统计落在圆内的比例乘 4,画不同样本量下 π 的收敛曲线。
更多的样本总是意味着更精确的估计。这是 LLN 的实践转化。
中心极限定理
现在来了解一些了不起的事情。假设 是 i.i.d.,均值为 ,方差有限为 。样本均值为:
中心极限定理指出,当 时,标准化样本均值的分布收敛到标准正态分布:
等价地:
不同寻常的是:无论底层分布的形状如何,这都成立。掷骰子(均匀离散),取多次掷骰的平均值,这些平均值的分布将呈钟形且接近正态。这就是正态分布在实践中如此常见的根本原因——不是因为一切都是正态分布的,而是因为几乎任何东西的平均值都倾向于正态分布。
为什么标准误差随 减小
注意 的标准差中分母上的 :
要将标准误差减半,你需要四倍的观测数据——而不是两倍。这是噪声 reduction 的平方根定律,它对统计检验有直接影响:要获得更高的精度,需要不成比例地更多数据。
Python 演示:掷骰子与 CLT
import numpy as np
import matplotlib.pyplot as plt
from scipy import stats
np.random.seed(42)
# 模拟掷一枚公平的六面骰子
n_rolls = 1
n_experiments = 10_000
sample_means = []
for _ in range(n_experiments):
rolls = np.random.choice([1, 2, 3, 4, 5, 6], size=n_rolls)
sample_means.append(np.mean(rolls))
# 对于 n=1,分布是均匀的
fig, axes = plt.subplots(2, 2, figsize=(12, 10))
sample_sizes = [1, 2, 10, 30]
for ax, n in zip(axes.flat, sample_sizes):
sample_means = []
for _ in range(n_experiments):
rolls = np.random.choice([1, 2, 3, 4, 5, 6], size=n)
sample_means.append(np.mean(rolls))
ax.hist(sample_means, bins=50, density=True, alpha=0.6)
# 叠加正态近似
mu = 3.5
se = np.sqrt(35/12 / n) # Var(die) = 35/12
x = np.linspace(mu - 4*se, mu + 4*se, 100)
ax.plot(x, stats.norm.pdf(x, mu, se), 'r-', lw=2, label='Normal approximation')
ax.set_title(f'样本量 n={n} — SE={se:.4f}')
ax.legend()
ax.grid(alpha=0.3)
plt.suptitle('中心极限定理:掷骰子样本均值的分布', y=1.02)
plt.tight_layout()
plt.show()
提示词
用 numpy 演示中心极限定理:对不同样本量重复掷骰子实验,画样本均值的直方图,叠加正态近似曲线。
当 时,直方图是平的——均匀分布。到 时,直方图明显呈钟形,与叠加的正态曲线几乎完美吻合。
在金融中的应用
CLT 解释了我们为什么经常将资产收益建模为正态分布,即使日收益本身可能不是正态的。月度简单收益不是日收益的简单平均;它是日简单收益的复合乘积。等价地,对数收益在区间内求和,所以月度对数收益约为20个日对数收益之和。即使日收益是肥尾或偏斜的,CLT 也会将月度平均值(或者月度求和,对对数收益而言)的分布拉向正态。
这也解释了为什么金融中的标准误差(如回报估计的标准差)随 减小。如果你想更精确地估计年波动率,你需要四倍的数据才能将精度提高一倍——这是回测中的一个基本约束。
CLT 也是自助法(bootstrap)的理论基础:如果你有 个观测值,你可以多次有放回地重抽样,每次计算均值,然后用这些自助均值的分布来估计原始均值的抽样分布。
参考文献
Ross, S. M. A First Course in Probability, Chapters 6–7. Pearson. Grimmett, G. R. and Welsh, D. Probability, Chapter 4. Oxford University Press.