我需要模拟随机波动率过程(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使用了很多不好的东西,但我找不到更好的解决方案。
答案 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
}
我认为这有效,但无法测试,因为你没有给出一个可重复的例子......