第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 本章知识体系

下面这张图帮你理清这章的核心逻辑:

随机游走模型知识体系 布朗运动 dW = ε√dt 几何布朗运动 dS = μSdt + σSdW 离散化公式 S(t+Δt)=S(t)·exp(...) Python模拟实现 numpy + matplotlib 结果分析 终值均值 | 标准差 | 最大/最小值 | 亏损概率 风险度量 → VaR、CVaR(后续章节)

从布朗运动出发,到几何布朗运动,再到离散化公式,最后用Python实现并分析结果。这条链路就是随机游走模型的核心脉络。

我的建议: 刚开始学的时候,别急着调参数。先把代码跑通,看看10条路径长什么样。然后慢慢增加路径数到1000条、10000条,你会发现均值越来越稳定。这就是大数定律在起作用。

好了,这章就到这里。随机游走模型是蒙特卡洛模拟的基石,后面的VaR计算、期权定价都离不开它。你先把代码跑熟,把概念吃透,后面就顺了。


公众号:蓝海资料掘金营,微信deep3321