【问题标题】:Simulation of GARCH in RR中的GARCH模拟
【发布时间】:2012-04-02 01:34:41
【问题描述】:

我正在模拟 GARCH 模型。模型本身并不太相关,我想问你的是关于优化 R 中的模拟。最重要的是,如果你看到任何矢量化空间,我已经考虑过了,但我看不到它。到目前为止,我所拥有的是:

让:

#    ht=cond.variance in t
#    zt= random number 
#    et = error term
#    ret= return
#    Horizon= n periods ahead

所以这是代码:

randhelp= function(horizon=horizon){
    ret <- zt <- et <- rep(NA,horizon)#initialize ret and zt et
    for( j in 1:horizon){
      zt[j]= rnorm(1,0,1)
      et[j] = zt[j]*sqrt(ht[j])
      ret[j]=mu + et[j]

      ht[j+1]= omega+ alpha1*et[j]^2 + beta1*ht[j]
    }
    return(sum(ret))
  }

我想从现在开始模拟 5 个时期的收益,所以我将运行这个假设为 10000。

#initial values of the simulation
ndraws=10000
horizon=5 #5 periods ahead
ht=rep(NA,horizon) #initialize ht
ht[1] = 0.0002
alpha1=0.027
beta1 =0.963
mu=0.001
omega=0


sumret=sapply(1:ndraws,function(x) randhelp(horizon))

我认为这运行得相当快,但我想问你是否有任何方法可以更好地解决这个问题。

谢谢!

【问题讨论】:

  • 看起来 muomega 没有定义。您可以将zt 移出循环并立即生成所有随机值,然后索引到它们吗?你试过library(compiler)吗?
  • library(compiler); f1 &lt;- cmpfun(randhelp) 是它所需要的一切。有时它会带来很大的推动作用,有时则不会那么大......但很容易测试所以值得一个简短的恕我直言。祝你好运:)

标签: r time-series volatility


【解决方案1】:

您可以使用大小为 N 的向量,而不是在循环中使用数字: 删除隐藏在sapply 中的循环。

randhelp <- function(
  horizon=5, N=1e4, 
  h0 = 2e-4, 
  mu = 0, omega=0,
  alpha1 = 0.027,
  beta1  = 0.963
){
  ret <- zt <- et <- ht <- matrix(NA, nc=horizon, nr=N)
  ht[,1] <- h0
  for(j in 1:horizon){
    zt[,j]   <- rnorm(N,0,1)
    et[,j]   <- zt[,j]*sqrt(ht[,j])
    ret[,j]  <- mu + et[,j]
    if( j < horizon )
      ht[,j+1] <- omega+ alpha1*et[,j]^2 + beta1*ht[,j]
  }
  apply(ret, 1, sum)
}
x <- randhelp(N=1e5)

【讨论】:

    【解决方案2】:

    根据 Vincent 的回复,我所做的只是一次性定义 zt 并将 apply(ret, 1, sum) 切换为 rowSums(ret),并且速度加快了很多。我都试过编译,但没有主要差异:

    randhelp2 <- function(horizon = 5, N = 1e4, h0 = 2e-4, 
                           mu = 0, omega = 0, alpha1 = 0.027, 
                           beta1  = 0.963 ){
        ret <- et <- ht <- matrix(NA, nc = horizon, nr = N)
        zt  <- matrix(rnorm(N * horizon, 0, 1), nc = horizon)
        ht[, 1] <- h0
        for(j in 1:horizon){
            et[, j]  <- zt[, j] * sqrt(ht[, j])
            ret[,j]  <- mu + et[, j]
            if( j < horizon )
                ht[, j + 1] <- omega + alpha1 * et[, j] ^ 2 + beta1 * ht[, j]
        }
        rowSums(ret)
    }
    
    system.time(replicate(10,randhelp(N=1e5)))
       user  system elapsed 
      7.413   0.044   7.468 
    
    system.time(replicate(10,randhelp2(N=1e5)))   
       user  system elapsed 
      2.096   0.012   2.112 
    

    可能还有改进的空间:-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-05-19
      • 1970-01-01
      相关资源
      最近更新 更多