为何我的几何布朗运动(GBM)股票模拟函数结果存在差异?
几何布朗运动(GBM)模拟函数差异问题修复
问题原因
你的MC_gbm2函数在计算漂移项时存在逻辑错误:
MC_gbm1中,每一步路径通过逐步累积漂移和布朗运动增量生成,第t步的总漂移为t*dt*(mu - 0.5*σ²)(t为当前步数,从1到n)。MC_gbm2原代码错误地将单步漂移项dt*(mu - 0.5*σ²)直接与累积的布朗运动项相加,未随步数累积漂移,导致整体漂移被低估,最终模拟均值偏低。
修正后的MC_gbm2函数
def MC_gbm2(S0, mu, sigma, T, M, n): dt = T / n # 生成每一步对应的累积时间(t*dt,t从1到n),转为(n,1)形状实现广播计算 time_steps = (np.arange(1, n+1) * dt)[:, None] dW = np.random.normal(0, np.sqrt(dt), size=(n, M)) dW_cumsum = np.cumsum(dW, axis=0) # 正确计算累积漂移+累积布朗运动项 paths = S0 * np.exp( (mu - 0.5 * sigma**2) * time_steps + sigma * dW_cumsum ) result = np.concatenate((np.full((1,M), S0), paths), axis=0) return result
验证一致性
为排除随机序列差异,调用两个函数前分别重置随机种子,确保模拟路径完全一致:
# GBM Simulation 1 np.random.seed(123) St = MC_gbm1(S0, mu, sigma, T, M, n) # GBM Simulation 2 np.random.seed(123) St3 = MC_gbm2(S0, mu, sigma, T, M, n) # 打印最终时刻的均值 print("MC_gbm1 最终均值:", np.mean(St[-1])) print("MC_gbm2 最终均值:", np.mean(St3[-1])) # 验证路径是否在浮点误差范围内一致 print("路径是否一致:", np.allclose(St, St3))
额外修正:绘图笔误
原代码中plt.plot(tt,St2)是笔误,应改为plt.plot(tt,St3)。
内容的提问来源于stack exchange,提问作者Pavel
相关产品推荐
相关产品推荐

