Heston Simulation Monte Carlo:慢速R代码

时间:2013-03-22 20:52:08

标签: r montecarlo

我需要模拟随机波动率过程(Heston模型)之后的股票价格。 我已经问过,如何加速我的循环,但是由于V [i-1]的依赖,我不能使用一些技巧。

基本上代码是: 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 个答案:

答案 0 :(得分: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
}

我认为这有效,但无法测试,因为你没有给出一个可重复的例子......