1. 课程导入与随机微分方程初识
在确定性世界里,我们习惯用常微分方程描述系统:给定初值,轨迹就唯一确定。但真实系统几乎都受到噪声扰动——股票价格的无规则跳动、布朗微粒在液体中的碰撞、神经元膜电位的随机涨落、气温的日间波动。随机微分方程(Stochastic Differential Equation,SDE)正是为这类"确定性趋势 + 随机扰动"系统建立数学模型的工具。本课程的目标不是推导艰深定理,而是让你能够把 SDE 写成可运行的数值程序,并正确解读模拟结果。
学习目标
完成本课程后,你应当能够:
- 识别常见 SDE 形式(布朗运动驱动、几何布朗运动、Ornstein–Uhlenbeck 过程等),并说明各符号的物理或金融含义;
- 理解 Itô 积分与普通黎曼积分的差别,知道为什么数值格式中会出现"额外"的修正项;
- 独立实现 Euler–Maruyama、Milstein 等格式,并判断其强收敛与弱收敛阶;
- 用固定随机种子复现实验,用统计量(均值、方差、路径分位数)而非单条路径判断模拟是否正确;
- 使用 Python(NumPy/SciPy)完成从建模、离散化、模拟到结果分析的完整闭环。
随机微分方程的定义与常见形式
一维 Itô 型 SDE 的标准写法为
dX(t) = a(X(t), t) dt + b(X(t), t) dW(t), X(0) = x0
其中 a(·) 称为漂移系数(drift),刻画系统在无噪声时的平均运动方向;b(·) 称为扩散系数(diffusion),刻画噪声强度;W(t) 是标准布朗运动(维纳过程),满足 W(0)=0,增量 W(t)-W(s) ~ N(0, t-s) 且互不重叠的增量相互独立。注意 dW 的量纲是 √dt,这正是 SDE 与 ODE 在数值处理上分道扬镳的根源。
三个必须熟悉的例子:
- 算术布朗运动:
dX = μ dt + σ dW,解为X(t)=x0+μt+σW(t),是理解一切 SDE 的起点。 - 几何布朗运动:
dS = μS dt + σS dW,广泛用于股价建模,解为S(t)=S(0)·exp((μ-σ²/2)t+σW(t)),注意指数中的-σ²/2修正项来自 Itô 引理。 - Ornstein–Uhlenbeck 过程:
dX = θ(μ-X)dt + σ dW,具有均值回复特性,常用于利率与信号去噪建模。
为什么必须做数值模拟
除少数线性情形外,绝大多数 SDE 没有解析解。即便有解析解,我们往往关心的也不是"某一条路径",而是路径的分布、期望、首次穿越时间等统计量,这些量通常只能通过大量路径的数值模拟来估计。此外,工程中常需要把 SDE 嵌入更大的系统(如随机控制、滤波、风险度量),此时离散时间递推是唯一可行的实现方式。
但数值模拟并非"把 dt 取小就行"。以 Euler–Maruyama 格式为例:
X_{n+1} = X_n + a(X_n, t_n)·Δt + b(X_n, t_n)·ΔW_n
ΔW_n = sqrt(Δt) · Z_n, Z_n ~ N(0,1) 独立同分布
它沿用的是普通 Euler 思路,强收敛阶仅为 0.5;而 Milstein 格式通过加入 ½·b·(∂b/∂x)·(ΔW²-Δt) 修正项,把强收敛阶提升到 1.0。选择哪种格式、步长取多少、需要多少条路径,取决于你要估计的是单条路径精度(强收敛)还是分布统计量(弱收敛)。这是本课程后续章节的核心线索。
整体课程框架与工具准备
课程按"概念—格式—验证—应用"四条主线推进。前段建立布朗运动、Itô 积分与 SDE 基本语言;中段逐一实现 Euler–Maruyama、Milstein、随机 Runge–Kutta 等格式,并用已知解析解的模型(算术布朗运动、几何布朗运动、OU 过程)检验强/弱收敛阶;后段进入多维 SDE、数值稳定性、方差缩减与实际案例。上图给出了贯穿全课程的工作流:建模 → 离散化 → 模拟 → 统计 → 判读,偏差过大时回到离散化环节调整,而不是盲目调参。
工具方面,建议使用 Python 3.10 以上版本,核心依赖只有三个:
pip install numpy scipy matplotlib
一个最小可运行示例,用于确认环境正确并建立第一直觉——模拟算术布朗运动 dX = 0.5 dt + 0.3 dW,X(0)=1,取 T=1、Δt=0.001、1000 条路径:
import numpy as np
rng = np.random.default_rng(2024)
mu, sigma, x0, T, dt, N = 0.5, 0.3, 1.0, 1.0, 1e-3, 1000
n = int(T / dt)
dW = np.sqrt(dt) * rng.standard_normal((N, n))
X = np.empty((N, n + 1)); X[:, 0] = x0
for k in range(n):
X[:, k+1] = X[:, k] + mu*dt + sigma*dW[:, k]
print(X[:, -1].mean(), X[:, -1].std())
理论值为 E[X(1)] = 1 + 0.5 = 1.5,Std[X(1)] = 0.3。若运行结果均值在 1.5 附近、标准差在 0.3 附近(示例中允许约 1%–2% 的抽样误差),说明环境与随机数流程均正常。请特别注意 rng.standard_normal 与 sqrt(dt) 的配合:漏乘 sqrt(dt) 会让噪声强度随步长错误缩放,这是初学者最常见的错误之一。
本章不要求你立刻掌握 Itô 引理的全部细节,但请先记住一个判断标准:当你写下一个 SDE 时,应当能说清 a 代表什么趋势、b 代表什么噪声源、W 的增量服从什么分布。这三件事说清楚了,后续的离散化与编程才有落脚点。