-6

確率的ボラティリティプロセス(ヘストンモデル)に従う株価をシミュレートする必要があります。ループを高速化する方法についてはすでに質問しましたが、この場合、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に多くの悪いことを使用していることを知っていましたが、より良い解決策を見つけることができませんでした。

4

1 に答える 1

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
}

これは機能すると思いますが、再現可能な例を示していないため、テストできません...

于 2013-03-23T00:49:23.413 に答える