2013-03-20 114 views
2

我需要使用R代碼執行股票價格模擬。問題是代碼有點慢。 基本上我需要模擬每個時間步驟(每日)的股票價格並將其存儲在矩陣中。股票價格模擬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 
} 

任何建議,以改善和加速碼?

+5

請提供[可重現的示例](http://stackoverflow.com/q/5963269)。你的第二個for循環會拋出一個錯誤,因爲當[i = 1]時'S [i-1]'具有零長度。 – 2013-03-20 20:58:16

+0

用'Rcpp'重寫你的代碼,你將得到幾個數量級的加速。 – 2013-03-21 01:52:30

+0

在進入'Rcpp'之前,我會首先嚐試擺脫double for循環,然後進行vectorisation。 – 2013-03-21 06:35:29

回答

2

假設S[0] = 1,你可以建立ü爲如下:

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,]))) 

編輯:使用約書亞和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))) 

編輯:通過@保羅的建議:

執行時間爲每個提案(使用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

+1

你不能用'U < - apply(U,1,cumprod)'替換最後一行嗎? – 2013-03-20 21:58:14

+2

在適當縮放的'rnorm()'矩陣上使用'cumsum'可能會更好,然後指數爲 – 2013-03-20 23:44:18

+0

謝謝! @JoshuaUlrich,我只是碰巧在'do.call'上暗戀...... Ferdinand.kraft – 2013-03-21 00:17:52