1. 随机漫步与布朗运动:从物理直觉到数学定义
做量化这些年,我越来越觉得布朗运动是个神奇的东西。它看起来杂乱无章,却藏着金融市场的底层密码。今天我们就从最直观的物理图像出发,一步步把它变成严谨的数学工具。
1.1 物理直觉:花粉为什么会跳舞?
1827年,植物学家布朗在显微镜下观察花粉颗粒。他本来想看细胞结构,结果发现花粉在水里不停地抖动,像喝醉了酒一样。这就是布朗运动的由来。
为什么会这样?说白了,水分子在不停地撞击花粉颗粒。每个水分子撞一下,花粉就动一下。你想想看,每秒有数亿次撞击,花粉的运动轨迹自然就变得毫无规律。
我刚开始学这个的时候,总觉得这跟股票走势有点像。后来做量化回测,发现还真有相通之处——市场里无数交易者的买卖行为,就像水分子撞击花粉一样,形成了价格的随机波动。
1.2 数学定义:从离散到连续
1900年,巴舍利耶把布朗运动用到了期权定价上。但真正给出严格数学定义的,是维纳。所以我们也叫它维纳过程。
先看离散版本。假设一个粒子在直线上随机游走:
import numpy as np
import matplotlib.pyplot as plt
def random_walk(steps=1000):
# 每一步等概率向左或向右
steps_direction = np.random.choice([-1, 1], size=steps)
position = np.cumsum(steps_direction)
return position
# 模拟三条路径
for i in range(3):
path = random_walk(1000)
plt.plot(path, label=f'路径{i+1}')
plt.legend()
plt.title('离散随机游走')
plt.show()
嗯,这里要注意。离散随机游走的时间步长是固定的,但布朗运动是连续时间的。怎么从离散到连续?
我们把时间间隔 Δt 无限缩小,步长也相应调整。数学上,布朗运动 B(t) 满足三个条件:
- B(0) = 0:从原点出发
- 独立增量:不同时间段的运动互不影响
- 正态增量:B(t) - B(s) ~ N(0, t-s)
核心理解:布朗运动的增量服从正态分布,方差等于时间间隔。这意味着时间越长,不确定性越大。
1.3 三大性质:为什么布朗运动如此特别?
我在项目中遇到过一个问题:用布朗运动模拟股价时,发现路径太"光滑"了。后来才意识到,布朗运动其实处处不可导。这就是它的第一个性质。
性质一:处处连续,处处不可导
布朗运动的路径是连续的,但你在任何一点都找不到切线。为什么?因为它的变化太快了。在任意小的时间区间内,它的变化幅度跟时间开平方成正比。
你想想看,如果 Δt 是 0.0001 秒,变化幅度大约是 0.01。导数要求 Δt 趋近于0时,变化率趋近于某个值。但布朗运动的变化率是发散的,所以导数不存在。
避坑指南:我曾经用普通微积分去处理布朗运动,结果算出来的结果全是错的。后来才明白,布朗运动不能用常规的微分规则,得用伊藤引理。
性质二:二次变分非零
这个性质很关键。普通光滑函数的二次变分是0,但布朗运动的二次变分是t。什么意思?
简单说,你把布朗运动的路径切成无数小段,每段的变化平方加起来,结果不是0,而是时间t本身。这直接导致了伊藤引理中那个额外的二次项。
| 函数类型 | 一次变分 | 二次变分 |
|---|---|---|
| 光滑函数 | 有限 | 0 |
| 布朗运动 | 无限 | t |
性质三:马尔可夫性
布朗运动的未来只取决于现在,跟过去无关。这就是马尔可夫性。做量化的人特别喜欢这个性质,因为它让建模变得简单。
我记得有一次做高频策略,有人想用过去一小时的价格走势预测未来。我直接告诉他:如果市场是有效的,价格走势近似布朗运动,那过去的信息已经全部反映在当前价格里了。预测?基本没戏。
1.4 知识体系:一张图看懂
下面这张图总结了布朗运动的核心逻辑。从物理直觉出发,经过数学抽象,最终落到量化应用上。
1.5 代码实战:验证布朗运动的性质
光说不练假把式。我们来写段代码,验证一下布朗运动的二次变分性质。
import numpy as np
def quadratic_variation(path):
"""计算布朗运动路径的二次变分"""
increments = np.diff(path)
return np.sum(increments ** 2)
# 模拟一条布朗运动路径
np.random.seed(42)
n = 10000
dt = 1.0 / n
B = np.random.normal(0, np.sqrt(dt), n)
B = np.cumsum(B)
# 计算二次变分
qv = quadratic_variation(B)
print(f"二次变分: {qv:.4f}")
print(f"理论值 (t=1): {1.0:.4f}")
# 试试不同分辨率
for n in [100, 1000, 10000]:
dt = 1.0 / n
B = np.random.normal(0, np.sqrt(dt), n)
B = np.cumsum(B)
qv = quadratic_variation(B)
print(f"n={n:5d}, 二次变分={qv:.4f}")
运行结果会告诉你,不管你怎么加密时间网格,二次变分始终稳定在1附近。这就是布朗运动的独特之处。
注意:布朗运动是理想化的数学模型。真实金融市场有跳跃、有自相关性,不完全符合布朗运动的假设。但作为基础工具,它依然是量化分析的起点。
好了,这一章我们建立了布朗运动的直觉和数学框架。下一章我们会看到,为什么普通微积分在这里失效,以及伊藤引理是如何解决这个问题的。