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。选择哪种格式、步长取多少、需要多少条路径,取决于你要估计的是单条路径精度(强收敛)还是分布统计量(弱收敛)。这是本课程后续章节的核心线索。

从真实系统到统计结论:SDE 数值模拟的整体框架 真实随机系统 股价 / 微粒 / 膜电位 含确定性趋势与噪声 建立 SDE 模型 dX = a(X,t)dt + b(X,t)dW 确定漂移 a 与扩散 b 时间离散化 Euler–Maruyama / Milstein 步长 Δt 与 ΔW=√Δt·Z 路径模拟 固定随机种子 生成 N 条独立路径 统计量估计 均值 / 方差 / 分位数 首次穿越时间 结果判读 与解析解/理论值对比 收敛阶验证 偏差过大 → 调整步长 / 更换格式 / 增加路径数,重新模拟 工具链:Python 3 + NumPy(随机数生成与向量化) + SciPy(统计与积分) + Matplotlib(路径与分布可视化)

整体课程框架与工具准备

课程按"概念—格式—验证—应用"四条主线推进。前段建立布朗运动、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 的增量服从什么分布。这三件事说清楚了,后续的离散化与编程才有落脚点。