第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函数。

知识体系总览

下面这张图总结了本章的核心逻辑:

几何布朗运动知识体系 定义 dS = μS dt + σS dW 漂移项 + 随机项 伊藤引理 随机微积分链式法则 二阶项是关键 解析解 S(t)=S₀e^{(μ-½σ²)t+σW} 对数正态分布 数值模拟 欧拉离散化:S(t+Δt)=S(t)·exp[...] 蒙特卡洛模拟、压力测试 实战应用 期权定价 · 风险管理 · 策略回测 · 资产配置

从定义出发,经过伊藤引理得到解析解,再通过数值模拟落地到实战应用。这条路径,就是我当年学习GBM的路线图,也是我建议你走的路线。


好了,几何布朗运动的核心内容就这些。记住:定义是基础,伊藤引理是工具,解析解是理论,模拟是实战。四者缺一不可。

下一章我们会聊随机游走,看看它和布朗运动有什么联系,又有什么区别。到时候见。

专注资料整理