股票价格模拟R代码 - 慢 - 蒙特卡罗

时间:2013-03-20 20:41:16

标签: r montecarlo

我需要使用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
}

有任何改进和加快代码的建议吗?

1 个答案:

答案 0 :(得分:2)

假设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,])))
编辑:使用约书亚和本的建议:

产品版本:

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]替换了ifelse(i==1,1,S[i-1]),并预先分配了U