第3章:价格序列生成——随机游走、几何布朗运动与带漂移项模拟

各位好,我是老张。今天咱们聊聊价格序列生成。这玩意儿在仿真市场里,就像地基一样重要。你想想看,没有真实的价格波动,后面的交易策略、风险评估全是空中楼阁。

我个人习惯,做仿真数据时,价格序列生成是第一步。它决定了整个市场的「味道」对不对。咱们今天要讲的三个模型——随机游走、几何布朗运动、带漂移项模拟,说白了就是三个不同层级的「价格剧本」。

3.1 随机游走模型:最朴素的假设

随机游走,英文叫 Random Walk。这个模型假设明天的价格,只跟今天的价格有关,再加上一个随机扰动。用公式表达就是:

P(t+1) = P(t) + ε(t)

其中 ε(t) 是均值为0、方差为σ²的正态分布随机数。

嗯,这里要注意:随机游走没有趋势,没有均值回归。它就是个醉汉走路,下一步往哪走完全随机。我在项目中遇到过,有些同学直接用这个模型生成股票价格,结果发现价格居然变成负数了——这显然不合理。

⚠️ 避坑指南: 我曾经在生成商品期货价格时,直接用随机游走模型,结果价格跑到了负值区域。后来才意识到,对于价格不能为负的资产,应该用几何布朗运动。

随机游走的代码实现很简单:

import numpy as np
import matplotlib.pyplot as plt

def random_walk(start_price, steps, sigma=0.01):
    prices = [start_price]
    for i in range(steps):
        shock = np.random.normal(0, sigma)
        prices.append(prices[-1] + shock)
    return prices

# 生成1000步的随机游走
prices = random_walk(100, 1000, sigma=0.5)
plt.plot(prices)
plt.title('随机游走价格序列')
plt.show()

你看,这个序列上下乱窜,没有规律。但现实中,很多金融资产的价格并不是这样走的。它们有趋势,有波动聚集效应。所以随机游走虽然简单,但局限性也很明显。

3.2 几何布朗运动:更真实的金融价格

几何布朗运动(GBM)解决了随机游走的两个大问题:价格不会为负,而且波动率与价格水平成正比。说白了,价格越高,波动越大。

GBM 的公式长这样:

dS = μS dt + σS dW

翻译成人话:价格的变化量 = 漂移项 × 当前价格 × 时间步长 + 波动率 × 当前价格 × 随机项。

离散化之后,我们可以这样模拟:

def geometric_brownian_motion(S0, mu, sigma, T, N):
    dt = T/N
    prices = [S0]
    for i in range(N):
        shock = np.random.normal(0, np.sqrt(dt))
        prices.append(prices[-1] * np.exp((mu - 0.5*sigma**2)*dt + sigma*shock))
    return prices

# 参数:初始价格100,年化收益率5%,波动率20%,时间1年,步数252
prices_gbm = geometric_brownian_motion(100, 0.05, 0.2, 1, 252)
plt.plot(prices_gbm)
plt.title('几何布朗运动价格序列')
plt.show()
💡 个人经验: 我建议你在做期权定价仿真时,优先使用GBM。它生成的路径更接近真实市场。但要注意,GBM假设波动率是常数,这在极端行情下会失效。

为什么会这样?因为真实市场有「波动率微笑」现象——价外期权的隐含波动率往往更高。GBM 无法捕捉这个特征。

3.3 带漂移项的模拟:加入趋势

带漂移项的模拟,说白了就是在随机游走的基础上加一个「方向感」。公式变成:

P(t+1) = P(t) + μ·dt + σ·ε(t)

这里的 μ 就是漂移系数,代表每单位时间的平均增长。如果 μ > 0,价格整体向上;μ < 0,价格向下。

代码实现:

def random_walk_with_drift(start_price, steps, mu, sigma):
    prices = [start_price]
    for i in range(steps):
        drift = mu * 1  # dt=1
        shock = np.random.normal(0, sigma)
        prices.append(prices[-1] + drift + shock)
    return prices

# 漂移项为0.1,波动率为0.5
prices_drift = random_walk_with_drift(100, 1000, 0.1, 0.5)
plt.plot(prices_drift)
plt.title('带漂移项的随机游走')
plt.show()

你看,这个序列整体向上,但局部波动依然很大。我在做宏观经济仿真时,经常用这个模型来模拟GDP增长路径——有长期趋势,但短期波动不可预测。

3.4 三种模型的对比

模型 价格非负 趋势性 波动率特征 适用场景
随机游走 ❌ 可能为负 常数 简单测试、白噪声模拟
几何布朗运动 ✅ 始终为正 有(通过μ控制) 与价格成正比 股票价格、期权定价
带漂移项随机游走 ❌ 可能为负 有(通过μ控制) 常数 宏观经济指标、利率模拟

嗯,这里要提醒一句:没有完美的模型。每个模型都有它的假设和局限。我个人的做法是,先搞清楚你要模拟的资产有什么特征,再选模型。

3.5 知识体系总览

下面这张图,是我自己总结的价格序列生成知识框架。你看一眼,心里就有数了:

价格序列生成模型知识体系 价格序列生成 随机游走模型 几何布朗运动 带漂移项模拟 特征 • 价格可能为负 • 无趋势,纯随机 • 波动率恒定 特征 • 价格始终为正 • 有趋势(漂移项) • 波动率与价格成正比 特征 • 价格可能为负 • 有明确趋势 • 波动率恒定 适用场景 简单测试、白噪声模拟 适用场景 股票价格、期权定价 适用场景 宏观经济指标、利率模拟

3.6 实战建议

最后,给你几个实战建议:

  • 先看数据特征:拿到真实数据后,先画个图,看看有没有趋势、波动率是否稳定。这决定了你选哪个模型。
  • 参数校准要谨慎:漂移项 μ 和波动率 σ 的估计,直接影响仿真结果。我建议用历史数据的滚动窗口来估计,而不是用全样本。
  • 多路径模拟:别只生成一条路径。生成1000条,看分布。这才是蒙特卡洛仿真的精髓。
  • 验证合理性:生成的价格序列,要检查最大值、最小值、波动率是否在合理范围内。我曾经生成过年化波动率500%的序列,一看就知道参数设错了。

核心要点回顾:

  • 随机游走:最简单,但价格可能为负
  • 几何布朗运动:价格始终为正,适合金融资产
  • 带漂移项:有趋势,适合宏观指标
  • 没有万能模型,根据场景选择

好了,这一章就到这里。价格序列生成是仿真数据的基础,搞懂了这三个模型,后面的章节你会轻松很多。记住,动手写代码才是最好的学习方式。


专注资料整理