You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

基于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

火山引擎 最新活动