基于R语言的几何布朗运动股票价格蒙特卡洛模拟与概率计算
嘿,我来帮你搞定这个用蒙特卡洛方法模拟股票价格的任务,还会修正原代码里的小问题,让结果更准确~
R语言蒙特卡洛模拟股票价格(几何布朗运动)
我们用几何布朗运动(GBM)来模拟股票价格,这是金融领域常用的模型,核心公式为:
dS_t = μS_t dt + σS_t dW_t
其中μ是漂移率,σ是波动率,W_t是维纳过程(标准布朗运动)。
任务1:绘制50条90天的股票价格样本路径
原代码里设置了10000条路径绘图,会导致图表拥挤到看不清,所以我们调整策略:用50条路径做可视化保证清晰,用更多样本计算概率提升准确性。
以下是修正后的绘图代码:
# 加载依赖包 library(sde) # 设置核心参数 mu <- 0.1 # 漂移参数 sigma <- 0.5 # 波动率 P0 <- 80 # 初始股价(美元) T_days <- 90 # 模拟总天数 T_years <- T_days / 360 # 转换为金融模型常用的年单位 n_time_steps <- 100 # 时间分割步数 dt <- T_years / n_time_steps # 每步时间长度 t_seq <- seq(0, T_years, by = dt) # 生成时间序列 # 生成50条样本路径用于绘图 n_plot_paths <- 50 X_plot <- matrix(0, nrow = n_plot_paths, ncol = length(t_seq)) for(i in 1:n_plot_paths) { X_plot[i, ] <- GBM(x = P0, r = mu, sigma = sigma, T = T_years, N = n_time_steps) } # 绘制样本路径图 ymin <- min(X_plot) ymax <- max(X_plot) plot(t_seq, X_plot[1, ], type = "l", ylim = c(ymin, ymax), col = "darkblue", xlab = "时间(年)", ylab = "股票价格(美元)", main = "90天内股票价格的50条几何布朗运动样本路径") for(i in 2:n_plot_paths){ # 用半透明随机颜色绘制,避免路径重叠看不清 lines(t_seq, X_plot[i, ], type = 'l', col = rgb(runif(1), runif(1), runif(1), 0.7)) }
运行后会得到一张清晰的路径图,每条路径用半透明随机色区分,能直观看到股价的波动趋势。
任务2:计算90天后股价≥100美元的概率
原代码里的概率计算有明显逻辑错误(sum(nt>=100)/nt完全不符合需求),我们用10000条模拟路径来统计最后一天股价达标占比:
# 生成10000条样本路径用于概率计算 n_sim_paths <- 10000 X_sim <- matrix(0, nrow = n_sim_paths, ncol = length(t_seq)) for(i in 1:n_sim_paths) { X_sim[i, ] <- GBM(x = P0, r = mu, sigma = sigma, T = T_years, N = n_time_steps) } # 提取每条路径最后一天的股价 final_prices <- X_sim[, ncol(X_sim)] # 计算达标样本占比(即概率) prob_ge_100 <- sum(final_prices >= 100) / n_sim_paths cat("90天后股价至少升至100美元的概率为:", round(prob_ge_100, 4), "\n")
运行后会得到一个基于10000次模拟的概率估计,结果大概在0.3-0.4区间(具体数值因随机模拟略有波动)。
小提示
- 想要更稳定的结果,可以增加
n_sim_paths的数量(比如50000),不过计算时间会相应变长。 sde包的GBM函数已经封装了几何布朗运动的模拟逻辑,不需要手动实现随机过程循环,非常便捷。
内容的提问来源于stack exchange,提问作者Andrea Garcia




