2013-03-22 23 views
-6

我需要模擬股票價格,它跟隨隨機波動過程(Heston Model)。 我已經問過,如何加速我的循環,但對於這種情況,由於V [i-1]的依賴性,我無法使用一些提示。Heston Simulation Monte Carlo:Slow R code

基本上的代碼是: V是股票的波動性,S是股票價格。和:a,b,c ...常量。

下面是代碼:

V[1] <- 0.04 
S[1] <- 40 
U <- matrix(NA, nrow=100000, ncol=200, byrow=TRUE) 

### Function ### 
Inv.Phi <- function(y){ 
       if (y <= p) {0} else {log(1-p)} 
} 

### Simulation #### 
for(j in 1:100000){ 
    for(i in 2:200){ 
    m <- V[i-1] * c 
    n <- V[i-1] * d 
    phi <- n/m 

    if(phi <= 1.5){ 
     Z <- rnorm(1) 
     V[i] <- rnorm(1) * e 
     K <- V[i-1] * f 
    }else{ 
     p <- (phi-1)/(phi+1) 
     u <- runif(1) 
     V[i] <- Inv.Phi(u) 
     K <- V[i-1] * g 
    } 
S[i] <- S[i-1] * exp(K * V[i-1]) * exp(V[i] * rnorm(1)) 
} 
U[j,] = S 
} 

任何建議,以加快這一進程!我知道,我對R使用了很多不好的東西,但我無法找出更好的解決方案。

+1

這與你的其他問題有什麼不同? http://stackoverflow.com/questions/15534270/stock-price-simulation-r-code-slow-monte-carlo – 2013-03-22 21:03:26

+1

是否有人得到懷疑我們被要求做這個人的商學院作業? – 2013-03-22 22:20:12

+1

如果它是[Heston模型](http://en.wikipedia.org/wiki/Heston_model) (它看起來不同:在你的模型中有一個閾值), 你可以嘗試'sde :: sde.sim '以模擬波動率,並且向量化你的代碼,就像在你之前的問題中那樣,來計算價格。 如果這還不夠,您可以嘗試重寫C/C++, 中的循環,例如使用[Rcpp](https://github.com/hadley/devtools/wiki/Rcpp)重寫循環。 – 2013-03-22 22:34:00

回答

0

你可能會加快東西很多,如果你擺脫外循環,並在一次構建您的矩陣的整列:

nsim <- 1e5 
nt <- 200 
U <- matrix(NA, nrow=nsim, ncol=200, byrow=TRUE) 
V_last <- V <- rep(0.04, nsim) 
U[,1] <- 40 

Inv.phi <- function(y,p) ifelse (y <= p, 0, log(1-p)) 
for(i in 2:nt) { 
    m <- V_last * c 
    n <- V_last * d 
    phi <- n/m ## ??? as currently stated this is just a constant d/c ?? 
       ## presumably there is a typo somewhere?? 
    bt <- (phi<=1.5) ## below-threshold 
    V[bt] <- rnorm(length(bt)) * e 
    V[!bt] <- Inv.phi(runif(length(!bt)), (phi[!bt]-1)/(phi[!bt]+1)) 
    K <- V_last*ifelse(bt,f,g) 
    U[,i] <- U[,i-1] * exp(K * V_last) * exp(V * rnorm(nsim)) 
    V_last <- V 
} 

我想這樣的作品,但無法測試,因爲你沒有給出一個可重複的例子...

+0

非常感謝您的關注!當我縮小代碼時,我忘記刪除那個「Z」。是的,d和c是常數。我剛剛嘗試過您的想法並且工作得很快,比兩個循環都快得多。但是,有關於if/else的警告。它警告phi> 1的大小,所以它只使用第一個。當我運行完整的模擬時,預期的答案(例如)大約是4.47,但現在是接近4,58。我會試着找出發生的事情。再次感謝 – PereMkB 2013-03-23 09:22:29

+0

固定允許向量'phi'。問題不在於'c'和'd'是常數,它是'phi =(V_last * d)/(V_last * c)= d/c',所以'phi'也總是常數...... – 2013-03-23 14:19:15

相關問題