1. 布朗运动与随机微积分基础:从物理布朗运动到维纳过程
各位同学,欢迎来到这门课的第一章。
说实话,每次讲随机微积分,我都有点感慨。十年前我刚入行时,第一次看到伊藤引理,整个人是懵的。那时候我就在想——这玩意儿到底怎么用在定价上?后来踩了不少坑,才慢慢摸清门道。
这一章,咱们就从最基础的东西说起:布朗运动。
1.1 物理布朗运动:花粉的随机舞蹈
1827年,植物学家布朗在显微镜下观察花粉颗粒。他发现花粉在水里不停地做无规则运动。一开始他以为是花粉有生命,后来发现死花粉、甚至玻璃粉末也这样。
为什么会这样?说白了,就是水分子在不停地撞击花粉颗粒。每个水分子都随机运动,撞击力大小方向都不确定。花粉颗粒就像被一群醉汉推来推去,走的路径自然毫无规律。
核心要点:物理布朗运动有三个特征——
- 路径连续,但处处不可导(你没法说它在某个时刻的「速度」是多少)
- 位移的方差与时间成正比(扩散速度是稳定的)
- 不同时间段的位移相互独立(没有记忆)
嗯,这里要注意。第三个特征「独立增量」是后面所有随机微积分的基石。我当年做利率模型时,就因为没理解清楚这个独立性,导致模拟出来的路径总是有奇怪的周期性。后来排查了三天才发现是随机数生成器的问题——但这是后话了。
1.2 从布朗运动到维纳过程:数学家的手术刀
物理学家看布朗运动,觉得是随机现象。数学家不一样,他们要把它变成严格的数学对象。
1900年,巴舍利耶在他的博士论文里第一次用数学描述了布朗运动。他当时想的是给期权定价——没错,比布莱克-舒尔斯早了70年。可惜他生不逢时,论文没引起重视。
后来,维纳在1923年给出了严格的数学定义。所以我们今天说的「维纳过程」,其实就是数学家们精心打磨过的布朗运动。
1.3 维纳过程的严格定义
一个随机过程 \( W(t) \) 被称为维纳过程(或标准布朗运动),如果它满足:
- 起点为零: \( W(0) = 0 \) 几乎必然成立
- 独立增量: 对任意 \( 0 \leq s < t \),增量 \( W(t) - W(s) \) 与过去 \( \{W(u): u \leq s\} \) 独立
- 正态增量: \( W(t) - W(s) \sim N(0, t-s) \)
- 连续路径: \( W(t) \) 是 \( t \) 的连续函数(几乎必然)
我的个人习惯:每次写代码模拟维纳过程时,我都会先检查随机数生成器是否真的产生了独立的正态样本。用 np.random.seed() 控制种子,然后用 scipy.stats.normaltest 做正态性检验。别嫌麻烦,我在生产环境里见过太多「伪随机」导致的定价偏差。
1.4 维纳过程的性质:你不得不知道的事
维纳过程有一些反直觉的性质。我第一次接触时觉得不可思议,后来做多了才习惯。
| 性质 | 数学表达 | 直观理解 |
|---|---|---|
| 均值为零 | \( E[W(t)] = 0 \) | 长期来看,上下波动抵消 |
| 方差随时间增长 | \( Var[W(t)] = t \) | 时间越长,不确定性越大 |
| 路径几乎处处不可导 | \( \frac{dW(t)}{dt} \) 不存在 | 你没法定义瞬时速度 |
| 二次变分非零 | \( [W, W](t) = t \) | 这是伊藤积分的核心 |
最后一条「二次变分非零」特别重要。你想想看,普通光滑函数的二次变分都是零。但维纳过程不一样——它的二次变分等于时间本身。这就是为什么伊藤积分和普通微积分不一样的根本原因。
我曾经踩过的坑:刚做利率衍生品时,我用欧拉法离散化短期利率模型。步长取太大,结果模拟出来的路径二次变分严重偏离理论值。定价结果自然一塌糊涂。后来我学乖了——模拟维纳过程时,步长一定要足够小,最好做收敛性测试。
1.5 多维维纳过程与相关性
实际定价中,我们很少只用一个布朗运动。比如你要给一个利率互换期权定价,可能需要同时模拟多个利率期限结构。这时候就需要多维维纳过程。
假设我们有 \( d \) 个相关的维纳过程 \( W_1, W_2, ..., W_d \),它们之间的相关系数矩阵为 \( \Sigma \)。那么我们可以用Cholesky分解来生成它们:
import numpy as np
def correlated_brownian(n_steps, n_paths, rho_matrix, dt=1.0):
"""
生成相关的多维维纳过程
参数:
n_steps: 时间步数
n_paths: 路径数
rho_matrix: 相关系数矩阵 (d x d)
dt: 时间步长
返回:
W: 形状为 (n_steps+1, n_paths, d) 的数组
"""
d = rho_matrix.shape[0]
L = np.linalg.cholesky(rho_matrix)
# 生成独立的标准正态随机数
Z = np.random.normal(size=(n_steps, n_paths, d))
# 应用Cholesky分解得到相关的增量
dW = np.einsum('ij,ktj->kti', L, Z) * np.sqrt(dt)
# 累积求和得到路径
W = np.zeros((n_steps + 1, n_paths, d))
W[1:] = np.cumsum(dW, axis=0)
return W
这段代码我用了好几年。注意 np.einsum 那行——很多人用矩阵乘法写,但 einsum 更清晰,也更快。我个人习惯在代码里加中文注释,方便团队里不太熟悉随机过程的同事理解。
1.6 本章知识体系总览
说了这么多,咱们用一张图来梳理一下本章的核心逻辑:
这张图把本章的逻辑串起来了。从物理现象出发,到数学定义,再到核心性质,最后落到多维情形和实际应用。后面的章节会沿着这个脉络一步步深入。
1.7 小结
这一章我们做了三件事:
- 理解了物理布朗运动是怎么一回事
- 掌握了维纳过程的严格定义和四个关键性质
- 学会了如何用Python生成多维相关的维纳过程
说实话,这些基础概念看着简单,但真正用起来处处是坑。我建议你把上面的代码跑一遍,改改参数,看看不同相关系数下路径长什么样。动手做一遍,比看十遍都管用。
嗯,今天就到这儿。下一章咱们开始碰真正的随机微积分——伊藤积分。那才是真正有意思的地方。
公众号:蓝海资料掘金营,微信deep3321