第4章:随机游走模型——布朗运动、几何布朗运动与股票价格路径模拟
说到随机游走,我脑子里第一个蹦出来的画面,就是醉汉走路。你想想看,他下一步往哪走,完全没规律。金融市场里的价格波动,其实也差不多。嗯,这就是我们这章要聊的核心——用随机游走模型来模拟资产价格。
4.1 布朗运动:随机性的数学表达
布朗运动最早是植物学家布朗在显微镜下观察花粉颗粒时发现的。颗粒在水里乱撞,毫无规律。后来爱因斯坦用数学解释了这种现象。在金融工程里,我们把它叫做维纳过程。
一个标准的布朗运动 W(t) 满足三个条件:
- W(0) = 0,起点是零
- 增量独立且服从正态分布:W(t) - W(s) ~ N(0, t-s)
- 路径连续,但处处不可导——说白了就是抖得厉害
我个人习惯把布朗运动想象成「噪声的累积」。你每走一步,都加一个随机数,走的时间越长,不确定性就越大。
核心公式:
离散形式:ΔW = ε √Δt,其中 ε ~ N(0,1)
连续形式:dW = ε √dt
4.2 几何布朗运动:更适合股票价格
直接用布朗运动模拟股价会出问题。为什么?因为股价不能为负,而且有趋势(长期上涨)。布朗运动允许负值,这不符合现实。
所以就有了几何布朗运动(GBM)。它长这样:
dS = μS dt + σS dW
翻译成人话:
- μ 是漂移率,代表预期收益率
- σ 是波动率,代表风险
- dW 是布朗运动增量,代表随机扰动
注意看,S 乘在了随机项前面。这意味着价格越高,波动绝对值越大。这很符合直觉——100块的股票一天波动1块,1000块的股票一天波动10块,比例差不多。
我的经验: 我在做期权定价项目时,一开始直接用布朗运动模拟股价,结果模拟出了负值。交易员看到直接骂我「你家的股票还能倒贴钱?」。从那以后,我再也不敢用普通布朗运动模拟股价了。GBM 才是正道。
4.3 离散化:从理论到代码
理论公式看着漂亮,但计算机只能处理离散时间。我们需要把 GBM 离散化:
S(t+Δt) = S(t) * exp((μ - σ²/2)Δt + σ * ε * √Δt)
这里有个细节很多人会忽略——为什么漂移项要减去 σ²/2?
嗯,这是因为对数正态分布的性质。简单说,如果你直接取期望,E[S(t)] = S(0)e^{μt},但如果你用 S(t) = S(0)exp(μt + σW(t)),期望会多出一项。所以需要修正。
我曾经在回测一个策略时,忘了减这个 σ²/2,结果模拟出来的价格路径长期偏高,策略表现虚高。后来花了三天才找到这个bug。嗯,教训深刻。
4.4 模拟股票价格路径:Python实战
下面我给出一个完整的模拟代码。你直接复制就能跑。
import numpy as np
import matplotlib.pyplot as plt
def simulate_gbm(S0, mu, sigma, T, N, paths):
"""
模拟几何布朗运动路径
S0: 初始价格
mu: 年化收益率
sigma: 年化波动率
T: 时间长度(年)
N: 时间步数
paths: 模拟路径数
"""
dt = T / N
# 生成随机数矩阵
eps = np.random.normal(0, 1, (paths, N))
# 初始化价格矩阵
S = np.zeros((paths, N+1))
S[:, 0] = S0
# 逐时间步模拟
for t in range(1, N+1):
drift = (mu - 0.5 * sigma**2) * dt
diffusion = sigma * np.sqrt(dt) * eps[:, t-1]
S[:, t] = S[:, t-1] * np.exp(drift + diffusion)
return S
# 参数设置
S0 = 100 # 初始价格
mu = 0.08 # 年化8%收益
sigma = 0.2 # 年化20%波动
T = 1 # 模拟1年
N = 252 # 252个交易日
paths = 10 # 模拟10条路径
# 执行模拟
paths_matrix = simulate_gbm(S0, mu, sigma, T, N, paths)
# 绘制路径
plt.figure(figsize=(12, 6))
for i in range(paths):
plt.plot(paths_matrix[i], lw=1, alpha=0.7)
plt.axhline(y=S0, color='black', linestyle='--', alpha=0.5)
plt.title('几何布朗运动模拟的股票价格路径')
plt.xlabel('时间步(交易日)')
plt.ylabel('价格')
plt.grid(True, alpha=0.3)
plt.show()
避坑指南: 我曾经用 np.random.randn() 生成随机数,但忘了设置随机种子。结果每次跑出来的结果都不一样,调试时根本没法复现。建议在正式模拟前加上 np.random.seed(42) 固定随机种子。
4.5 模拟结果解读
跑完代码你会看到10条蜿蜒的曲线。它们都从100出发,但终点各不相同。有的涨到150,有的跌到60。这就是随机性的力量。
我一般会关注以下几个统计量:
| 统计量 | 含义 | 模拟值(示例) |
|---|---|---|
| 终值均值 | 所有路径终点价格的平均 | 108.33 |
| 终值标准差 | 终点价格的离散程度 | 21.56 |
| 最大值 | 所有路径中的最高价 | 156.78 |
| 最小值 | 所有路径中的最低价 | 52.14 |
| 跌破初始价概率 | 终点低于100的路径占比 | 32% |
你看,即使年化收益是正的8%,仍然有32%的概率亏钱。这就是风险的本质——收益和亏损是一枚硬币的两面。
4.6 本章知识体系
下面这张图帮你理清这章的核心逻辑:
从布朗运动出发,到几何布朗运动,再到离散化公式,最后用Python实现并分析结果。这条链路就是随机游走模型的核心脉络。
我的建议: 刚开始学的时候,别急着调参数。先把代码跑通,看看10条路径长什么样。然后慢慢增加路径数到1000条、10000条,你会发现均值越来越稳定。这就是大数定律在起作用。
好了,这章就到这里。随机游走模型是蒙特卡洛模拟的基石,后面的VaR计算、期权定价都离不开它。你先把代码跑熟,把概念吃透,后面就顺了。
公众号:蓝海资料掘金营,微信deep3321