几何布朗运动:从定义到实战

大家好,我是老张。今天咱们聊聊几何布朗运动,简称GBM。

说实话,在量化金融里,GBM 是绕不开的一个模型。我个人觉得,它就像一把瑞士军刀——简单、实用,但用不好也会伤到自己。

GBM 模型定义

先看数学定义。GBM 的随机微分方程长这样:

dS = μS dt + σS dW

其中:

  • S:资产价格
  • μ:漂移率(预期收益率)
  • σ:波动率
  • dW:标准布朗运动增量

嗯,这里要注意:dW 是正态分布的,均值为0,方差为 dt。

为什么叫「几何」?因为价格的变化比例(dS/S)是正态分布的,而不是价格本身。你想想看,股票价格不可能为负,GBM 正好保证了这一点。

核心要点:GBM 假设收益率服从正态分布,价格服从对数正态分布。

GBM 与股票价格建模

我在项目中遇到过一个问题:用 GBM 模拟股价,结果发现模拟出来的路径跟实际走势差得挺远。

为什么会这样?因为 GBM 有几个关键假设:

  • 波动率是常数
  • 收益率是独立同分布的
  • 没有跳跃

说白了,真实市场哪有这么乖?波动率会变,收益率有自相关性,还有黑天鹅事件。

但 GBM 仍然有用。它是很多复杂模型的基石。比如期权定价的 Black-Scholes 公式,就是基于 GBM 推导出来的。

个人经验:我建议初学者先用 GBM 做模拟,理解基本逻辑。等熟悉了,再引入随机波动率、跳跃扩散等更复杂的模型。

GBM 的参数估计

参数估计说白了就是找 μ 和 σ。怎么找?用历史数据。

假设我们有 n+1 个价格数据 S₀, S₁, ..., Sₙ,时间间隔为 Δt。

先算对数收益率:

rᵢ = ln(Sᵢ / Sᵢ₋₁)

然后:

  • μ 的估计: μ̂ = (r̄ / Δt) + (σ̂² / 2)
  • σ 的估计: σ̂ = std(r) / √Δt

其中 r̄ 是 rᵢ 的均值,std(r) 是标准差。

避坑指南:我曾经用日数据估计波动率,结果发现年化后的波动率跟实际差很多。原因很简单:日数据有噪声,而且波动率本身会随时间变化。建议用高频数据(比如5分钟线)来估计,或者用 GARCH 模型。

来看一个 Python 实现:

import numpy as np

def estimate_gbm_params(prices, dt):
    """
    估计 GBM 参数
    prices: 价格序列
    dt: 时间间隔(年化)
    """
    log_returns = np.diff(np.log(prices))
    mu = np.mean(log_returns) / dt + np.var(log_returns) / (2 * dt)
    sigma = np.std(log_returns) / np.sqrt(dt)
    return mu, sigma

# 示例
prices = [100, 102, 101, 105, 107]
dt = 1/252  # 日数据
mu, sigma = estimate_gbm_params(prices, dt)
print(f"μ = {mu:.4f}, σ = {sigma:.4f}")

GBM 的蒙特卡洛模拟

蒙特卡洛模拟,说白了就是生成很多条可能的路径,然后看统计结果。

GBM 的离散化形式:

S(t+Δt) = S(t) * exp((μ - σ²/2) * Δt + σ * √Δt * Z)

其中 Z 是标准正态随机数。

代码实现:

import numpy as np
import matplotlib.pyplot as plt

def gbm_simulation(S0, mu, sigma, T, N, M):
    """
    GBM 蒙特卡洛模拟
    S0: 初始价格
    mu: 漂移率
    sigma: 波动率
    T: 时间长度(年)
    N: 时间步数
    M: 模拟路径数
    """
    dt = T / N
    paths = np.zeros((M, N+1))
    paths[:, 0] = S0
    
    for i in range(1, N+1):
        Z = np.random.standard_normal(M)
        paths[:, i] = paths[:, i-1] * np.exp(
            (mu - 0.5 * sigma**2) * dt + sigma * np.sqrt(dt) * Z
        )
    return paths

# 示例
S0, mu, sigma = 100, 0.05, 0.2
T, N, M = 1, 252, 1000
paths = gbm_simulation(S0, mu, sigma, T, N, M)

# 画几条路径看看
plt.figure(figsize=(10, 6))
for i in range(10):
    plt.plot(paths[i])
plt.title('GBM 模拟路径')
plt.xlabel('时间步')
plt.ylabel('价格')
plt.show()

注意:模拟时一定要用对数正态形式,而不是简单的 dS = μS dt + σS dW 的欧拉离散化。后者在 dt 较大时会产生误差。

知识体系结构图

下面这张图展示了 GBM 的核心知识脉络:

几何布朗运动 (GBM) 模型定义 dS = μS dt + σS dW 收益率正态,价格对数正态 股票价格建模 假设:常数波动率、无跳跃 Black-Scholes 公式的基础 参数估计 μ̂ = r̄/Δt + σ̂²/2 σ̂ = std(r) / √Δt 蒙特卡洛模拟 S(t+Δt) = S(t) * exp((μ - σ²/2) * Δt + σ * √Δt * Z) 生成多条路径 → 统计分布 → 风险度量

这张图把 GBM 的四个核心模块串起来了。从定义出发,到建模应用,再到参数估计和模拟。每一步都有坑,但也都有解法。

我的建议:初学者先跑通上面的代码,理解 GBM 的数学形式和模拟逻辑。然后试着改参数,看看不同 μ 和 σ 对路径的影响。最后,用真实股票数据做参数估计,再对比模拟结果和实际走势。

好了,GBM 的内容就到这里。记住:模型是工具,不是真理。用得好,它能帮你赚钱;用得不好,它会让你亏钱。嗯,这就是量化金融的乐趣所在。

专注资料整理