我需要使用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
}
任何建議,以改善和加速碼?
我需要使用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
}
任何建議,以改善和加速碼?
假設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
。
你不能用'U < - apply(U,1,cumprod)'替換最後一行嗎? – 2013-03-20 21:58:14
在適當縮放的'rnorm()'矩陣上使用'cumsum'可能會更好,然後指數爲 – 2013-03-20 23:44:18
謝謝! @JoshuaUlrich,我只是碰巧在'do.call'上暗戀...... Ferdinand.kraft – 2013-03-21 00:17:52
請提供[可重現的示例](http://stackoverflow.com/q/5963269)。你的第二個for循環會拋出一個錯誤,因爲當[i = 1]時'S [i-1]'具有零長度。 – 2013-03-20 20:58:16
用'Rcpp'重寫你的代碼,你將得到幾個數量級的加速。 – 2013-03-21 01:52:30
在進入'Rcpp'之前,我會首先嚐試擺脫double for循環,然後進行vectorisation。 – 2013-03-21 06:35:29