第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 无法捕捉这个特征。
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%的序列,一看就知道参数设错了。
核心要点回顾:
- 随机游走:最简单,但价格可能为负
- 几何布朗运动:价格始终为正,适合金融资产
- 带漂移项:有趋势,适合宏观指标
- 没有万能模型,根据场景选择
好了,这一章就到这里。价格序列生成是仿真数据的基础,搞懂了这三个模型,后面的章节你会轻松很多。记住,动手写代码才是最好的学习方式。