【问题标题】:Simulations of the stock price using Monte Carlo in R使用 R 中的蒙特卡洛模拟股票价格
【发布时间】:2020-08-25 00:39:47
【问题描述】:

在图表中模拟 90 天内 80 美元股票价格的 50 条样本路径,建模为几何布朗运动,漂移参数为 0.1,波动率为 0.5。在图表中显示此过程在纵轴上 价格选项和时间在横轴上。求 90 天内期权价格至少上涨到 100 美元的概率。

library(sde)
mu<-0.1
sigma<-0.5
P0<-80 #initial price
T <-90/360 #time in years
nt=10000 #number of trajectories within each simulation
n=100 #time periods
dt<-T/n #length of time periods
t <- seq(0,T,by=dt)
X=matrix(rep(0,length(t)*nt),nrow = nt)
for(i in 1:nt) {
  X[i,]=GBM(x=P0, r=mu, sigma=sigma, T=T, N=n)
}
ymax=max(X); ymin=min(X) #bounds for simulated prices
plot(t,X[1,],type="l", ylim=c(ymin,ymax), col=1, xlab="Time", ylab="Price Y(t)")
for(i in 2:nt){
  lines(t,X[i,], type='l', ylim=c(ymin, ymax), col=i)
}
Prob<-sum(nt>=100)/nt
Prob

【问题讨论】:

  • 所以你模拟了 50 条股票路径。其中有多少最终高于 100 美元的目标价?
  • 50 个样本路径不足以获得对概率的良好估计。您也许可以绘制 50 的图表,然后使用例如估计概率。 10,000 条路径。 (更好的是,既要根据显示的 50 给出估计值,又要报告更大模拟的结果)。
  • 好的。我将时间段数更改为 10000,但如何使用蒙特卡罗模拟来做到这一点?
  • 为什么要更改时间段数?应该是通过那个时间段的路径数应该改变。无论如何,一旦你做了模拟,有什么问题?只需计算最终高于目标价格的路径并除以路径数。蒙特卡罗模拟本质上是一种非常幼稚的算法。如果你想估计在一对骰子中掷出 7 的概率,只需掷 100 次,数一下 7,然后除以 100。这就是这里发生的所有事情,除了你有股票价格路径而不是骰子。
  • 模拟本身和你对模拟所做的事情是不同的。您可以绘制它,用它估计概率等。就个人而言,我会编写一个模拟单个路径的函数,调试该函数,然后 replicate 它任意次数。就您的代码而言,sum(nt&gt;=100)/nt 没有意义。 nt 只是一个数字,那么sum(nt&gt;=100) 的意义何在?你没有总结正确的事情。

标签: r simulation montecarlo stochastic-process


【解决方案1】:

答案取决于您如何解释参数tnT

我做了一些假设:因为

T <- 90/360

我想,这意味着一年中有 90 天(大约 360 天,这在金融领域一年很常见)。你对t的定义

n <- 100
dt <- T/n
t <- seq(0, T, by=dt)

为您的模拟提供时间步长,因此您的第 90 天由 max(t) = 0.25 = T 简单地给出,索引为 101t 的最后一个元素。

X 包含随机过程的 50 条路径,由X[i,] 索引,时间步长为j,由X[,j] 给出。因此,如果您想知道第 90 天 50 次模拟的值,只需查看X[,101]

所以您想知道在第 90 天有多少条路径超过 100。只需按以下方式计数即可

success <- sum(X[,101] >= 100)

如果您想计算经验概率,只需将它们除以路径数即可。因此

emp_prob <- success/nt

【讨论】:

  • 非常感谢@Martin Gal。我如何估计期权价格的最大值将至少升至 100?
  • 尝试success &lt;- sum(sapply(1:n, function(i) max(X[i,]) &gt;=100)) 之类的方法,然后计算如上所示的经验概率。