第1章 几何布朗运动:从定义到实战
大家好,欢迎来到布朗运动与随机游走的量化交易实战课程。
今天咱们聊几何布朗运动。说实话,这是整个量化金融的基石之一。我当年刚入行时,带我的老交易员就说了一句话:「小子,搞懂GBM,你就算入门了。」当时我不信,后来做了几年策略,才发现这话一点不假。
1.1 几何布朗运动的定义
几何布朗运动,英文叫Geometric Brownian Motion,简称GBM。它描述的是资产价格的对数收益率服从正态分布。
数学上,它的随机微分方程长这样:
dS(t) = μ S(t) dt + σ S(t) dW(t)
其中:
- S(t):t时刻的资产价格
- μ:漂移率,代表资产的期望收益率
- σ:波动率,代表资产的风险程度
- dW(t):标准布朗运动的增量
你想想看,这个公式其实很直观。价格的变化由两部分组成:
- 确定性部分 μS(t)dt —— 长期趋势
- 随机部分 σS(t)dW(t) —— 市场噪声
我在项目中遇到过一个问题:很多人以为μ就是股票的预期收益率。其实不是。μ是瞬时收益率,跟实际持有期收益率有区别。这个坑我踩过,后面会细说。
核心要点:几何布朗运动假设价格是连续的,且对数收益率服从正态分布。这是Black-Scholes期权定价模型的基础假设。
1.2 伊藤引理
伊藤引理,说白了就是随机微积分里的链式法则。普通微积分里,df = f'(x)dx。但在随机世界里,事情没那么简单。
假设S(t)服从GBM,我们想求f(S,t)的微分。伊藤引理告诉我们:
df = (∂f/∂t + μS ∂f/∂S + ½ σ²S² ∂²f/∂S²) dt + σS ∂f/∂S dW
为什么会多出那个½ σ²S² ∂²f/∂S²项?
嗯,这里要注意。因为dW的平方项在均方意义下收敛到dt,而不是0。这是随机微积分和普通微积分最本质的区别。
我个人习惯把伊藤引理记成「三个部分」:
- 时间偏导 ∂f/∂t
- 一阶空间偏导 μS ∂f/∂S
- 二阶空间偏导 ½ σ²S² ∂²f/∂S² —— 这是随机项带来的「额外项」
我曾经在给一个期权做对冲时,忽略了二阶项,结果对冲误差大得离谱。后来复盘才发现,伊藤引理里的这个二阶项,恰恰是期权Gamma对冲的核心。
实战技巧:如果你用伊藤引理推导期权定价公式,记得检查二阶项是否处理正确。很多初学者在这里翻车。
1.3 几何布朗运动的解
有了伊藤引理,我们就可以求解GBM了。令f(S,t) = ln S(t),代入伊藤引理:
d(ln S) = (μ - ½σ²) dt + σ dW
两边积分,得到:
ln S(t) = ln S(0) + (μ - ½σ²)t + σ W(t)
取指数,得到价格过程:
S(t) = S(0) exp[(μ - ½σ²)t + σ W(t)]
这个解告诉我们几件事:
- 价格服从对数正态分布
- 期望价格是 S(0)e^{μt},不是 S(0)e^{(μ+½σ²)t}
- 对数收益率是 (μ - ½σ²)t + σW(t),均值为 (μ - ½σ²)t
你想想看,为什么期望收益率是μ,但对数收益率的均值却是μ - ½σ²?
这就是所谓的「波动率税」。波动率越高,长期复合收益率越低。我在做CTA策略回测时,经常看到策略的年化收益率很高,但实际复利收益却低不少,就是这个道理。
避坑指南:我曾经用GBM模拟价格路径时,直接用μ作为对数收益率的均值,结果模拟出来的价格序列整体偏高。后来才发现,应该用μ - ½σ²。这个错误让我浪费了整整两天时间。
1.4 几何布朗运动的模拟
实战中,我们经常需要模拟GBM路径。比如做蒙特卡洛模拟、压力测试、策略回测等。
离散化公式(欧拉方法):
S(t+Δt) = S(t) * exp[(μ - ½σ²)Δt + σ * sqrt(Δt) * Z]
其中Z是标准正态随机变量。
下面是我常用的Python代码:
import numpy as np
import matplotlib.pyplot as plt
def simulate_gbm(S0, mu, sigma, T, N, n_paths=10):
"""
模拟几何布朗运动路径
参数:
S0: 初始价格
mu: 漂移率
sigma: 波动率
T: 时间长度(年)
N: 时间步数
n_paths: 模拟路径数
"""
dt = T / N
t = np.linspace(0, T, N+1)
# 生成随机数矩阵
Z = np.random.standard_normal((n_paths, N))
# 计算价格路径
S = np.zeros((n_paths, N+1))
S[:, 0] = S0
for i in range(N):
S[:, i+1] = S[:, i] * np.exp(
(mu - 0.5 * sigma**2) * dt +
sigma * np.sqrt(dt) * Z[:, i]
)
return t, S
# 示例:模拟10条路径
t, paths = simulate_gbm(S0=100, mu=0.08, sigma=0.2, T=1, N=252, n_paths=10)
# 绘制路径
plt.figure(figsize=(10, 6))
for i in range(10):
plt.plot(t, paths[i], lw=1, alpha=0.7)
plt.xlabel('时间(年)')
plt.ylabel('价格')
plt.title('几何布朗运动模拟路径')
plt.grid(True, alpha=0.3)
plt.show()
代码里有个细节:我用的是exp形式,而不是直接加增量。这样做的好处是保证价格始终为正,符合实际市场情况。
我个人习惯把N设为252,因为一年大约有252个交易日。这样模拟出来的路径更贴近真实市场节奏。
效率优化:如果模拟路径数量很大(比如10万条以上),建议用向量化操作,避免for循环。上面的代码为了可读性用了循环,实际生产环境我会用numpy的cumprod函数。
知识体系总览
下面这张图总结了本章的核心逻辑:
从定义出发,经过伊藤引理得到解析解,再通过数值模拟落地到实战应用。这条路径,就是我当年学习GBM的路线图,也是我建议你走的路线。
好了,几何布朗运动的核心内容就这些。记住:定义是基础,伊藤引理是工具,解析解是理论,模拟是实战。四者缺一不可。
下一章我们会聊随机游走,看看它和布朗运动有什么联系,又有什么区别。到时候见。