4. 一维布朗运动轨迹的离散模拟
布朗运动在连续时间下由随机微分方程 dX(t)=μdt+σdW(t) 描述,其中 W(t) 是标准维纳过程。要在计算机上生成它的轨迹,必须把连续时间切成有限步长 Δt,把维纳增量 dW 替换为独立同分布的高斯随机数。这一节我们就把这个替换过程讲清楚,并写出可直接运行的一维路径生成程序。
从随机游走到维纳过程
先回顾随机游走的极限。设每步以等概率取 +1 或 −1,步长 h,共走 n 步,则位移 Sn=h·Σξi,其中 ξi∈{−1,+1}。由中心极限定理,当 n→∞ 且 h→0、h√n 保持有限时,Sn 依分布收敛到正态分布。取 h=√Δt、n=t/Δt,则 Var(Sn)=h²n=Δt·(t/Δt)=t,恰好对应标准维纳过程在时刻 t 的方差。这说明:维纳过程是随机游走在“步长趋于零、步数趋于无穷”下的标度极限,而离散模拟正是把这个极限反过来用——用有限步长近似连续过程。
由此得到离散格式。把区间 [0,T] 分成 N 段,Δt=T/N,记 Xk=X(kΔt),则
X_{k+1} = X_k + μ·Δt + σ·√Δt·Z_k, Z_k ~ N(0,1) 独立同分布
X_0 = x0
这里 √Δt 因子是关键:维纳增量的标准差是 √Δt 而不是 Δt,这正是布朗运动“路径处处不可微、方差随时间线性增长”的离散体现。μ 是漂移率,σ 是波动率,二者量纲分别为“每单位时间”和“每 √时间”。
欧拉离散化的误差与选择
上述格式就是随机微分方程的欧拉–丸山(Euler–Maruyama)方法。对加性噪声(σ 为常数)的情形,它实际上是精确的:因为 X(t) 本身就是高斯过程,离散点上的联合分布与连续过程在采样点上的分布完全一致,误差只来自采样间隔而非格式本身。对乘性噪声(σ 依赖 X)才有强收敛阶 0.5、弱收敛阶 1.0 的问题。本节讨论常系数情形,因此可以放心使用欧拉格式。
步长 Δt 的选择需要权衡。Δt 越小,路径越细腻,但计算量与内存线性增长;Δt 越大,虽然采样点分布仍正确,但两点之间的路径细节丢失,画出的折线会显得“棱角分明”。实践中常取 N=1000~10000 观察单条路径,取 N=252 对应一年交易日(若按日采样)做金融类比。需要提醒:离散模拟不会改变终点分布,X(T) ~ N(x0+μT, σ²T),这一点可用来验证程序正确性。
可运行的生成程序
下面给出一个不依赖第三方库的 Python 实现,同时提供 NumPy 向量化版本,便于批量生成多条路径做统计。约定:时间从 0 开始,X(0)=x0,漂移 μ 与波动 σ 为常数,随机数种子可复现。
import numpy as np
def bm_path(T=1.0, N=1000, mu=0.0, sigma=1.0, x0=0.0, seed=None):
"""生成一维布朗运动路径,返回时间数组 t 与路径数组 x"""
rng = np.random.default_rng(seed)
dt = T / N
t = np.linspace(0.0, T, N + 1)
z = rng.standard_normal(N) # N 个独立标准正态增量
inc = mu * dt + sigma * np.sqrt(dt) * z
x = np.empty(N + 1)
x[0] = x0
x[1:] = x0 + np.cumsum(inc) # 累加得到路径
return t, x
# 示例:生成 5 条路径并检查终点均值与方差
paths = [bm_path(T=1.0, N=1000, mu=0.1, sigma=0.5, x0=0.0, seed=s)[1]
for s in range(5)]
ends = np.array([p[-1] for p in paths])
print("终点均值:", ends.mean(), "理论值:", 0.1)
print("终点方差:", ends.var(), "理论值:", 0.25)
代码中有三处值得注意。第一,np.cumsum 把增量累加,避免显式循环,N 很大时效率明显更高。第二,rng.standard_normal(N) 一次生成全部增量,保证各步独立;若在循环里反复调用,虽然也独立,但开销更大。第三,seed 参数让结果可复现,做对比实验或排错时非常必要。
若要做统计分析,通常需要成百上千条路径。此时应把上面的函数改造成一次生成 M×N 的增量矩阵,沿时间轴累加,得到 M 条路径的矩阵,再按列求均值、方差、分位数等。示例中只生成 5 条路径,终点均值与方差的抽样误差较大,不能据此判断程序对错;正确做法是取 M=10000 以上,观察样本均值是否接近 μT、样本方差是否接近 σ²T,误差量级约为 σ√(T/M)。
结果判读与常见问题
拿到一条路径后,可以从三个角度判断模拟是否合理。其一,看终点:多次重复后终点应围绕 x0+μT 波动,标准差为 σ√T。其二,看路径的“粗糙度”:相邻两点位移的标准差是 σ√Δt,若画出的折线过于平滑,多半是误把 √Δt 写成了 Δt。其三,看方差随时间的变化:在若干时刻 t 上计算多条路径的样本方差,应近似等于 σ²t,呈线性增长。
常见错误包括:把增量写成 σ·Δt·Z(方差被压缩,路径过平);忘记设置 X(0),导致起点随机;在循环中重复使用同一个随机数(路径变成直线);以及把 μ 与 σ 的量纲混淆,例如按年给定 μ 却按日步长累加而未做时间单位换算。排查时最有效的手段是固定种子、取 N 很小(如 N=5)手工核对前几步的数值,再逐步放大 N 观察统计量是否收敛到理论值。