几何布朗运动:从定义到实战
大家好,我是老张。今天咱们聊聊几何布朗运动,简称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 的四个核心模块串起来了。从定义出发,到建模应用,再到参数估计和模拟。每一步都有坑,但也都有解法。
我的建议:初学者先跑通上面的代码,理解 GBM 的数学形式和模拟逻辑。然后试着改参数,看看不同 μ 和 σ 对路径的影响。最后,用真实股票数据做参数估计,再对比模拟结果和实际走势。
好了,GBM 的内容就到这里。记住:模型是工具,不是真理。用得好,它能帮你赚钱;用得不好,它会让你亏钱。嗯,这就是量化金融的乐趣所在。