我需要使用 R 代码执行股票价格模拟。问题是代码有点慢。基本上我需要模拟每个时间步(每天)的股票价格并将其存储在矩阵中。
假设库存过程是几何布朗运动的示例
for(j in 1:100000){
for(i in 1:252){
S[i] <- S[i-1]*exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(1))
}
U[j,] <- S
}
有什么改进和加速代码的建议吗?
我需要使用 R 代码执行股票价格模拟。问题是代码有点慢。基本上我需要模拟每个时间步(每天)的股票价格并将其存储在矩阵中。
假设库存过程是几何布朗运动的示例
for(j in 1:100000){
for(i in 1:252){
S[i] <- S[i-1]*exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(1))
}
U[j,] <- S
}
有什么改进和加速代码的建议吗?
假设S[0] = 1
,您可以按如下方式构建 U:
Ncols <- 252
Nrows <- 100000
U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)
U <- do.call(rbind, lapply(1:Nrows, function(j)cumprod(U[j,])))
编辑:使用 Joshua 和 Ben 的建议:
产品版本:
U <- matrix(exp((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows)), ncol=Ncols, nrow=Nrows)
U <- t(apply(U, 1, cumprod))
总和版本:
V <- matrix((r-v^2/2)*dt+v*sqrt(dt)*rnorm(Ncols*Nrows), ncol=Ncols, nrow=Nrows)
V <- exp( t(apply(V, 1, cumsum)) )
编辑:正如@Paul 所建议的:
每个提案的执行时间(使用 10000 行而不是 10^5):
使用apply + cumprod
user system elapsed
0.61 0.01 0.62
使用apply + cumsum
user system elapsed
0.61 0.02 0.63
使用 OP 的原始代码
user system elapsed
67.38 0.00 67.52
注:以上时间为 的第三小节system.time
。每个代码的前两个度量被丢弃。我用过r <- sqrt(2)
,v <- sqrt(3)
和dt <- pi
。在他的原始代码中,我还替换S[i-1]
了 forifelse(i==1,1,S[i-1])
和 preallocated U
。