使用MSGarch包计算多步VaR时发出警告

时间:2017-10-18 12:30:28

标签: r

这里是用于生成Var的并行循环的代码,它通常正常工作:

    cl <- makeCluster(5) #not to overload your computer
    registerDoSNOW(cl) 

    #parallel foreach loop
    N=195

    data_startpoint = 2

    #VaR_matrix = matrix(0,20,max(N))
    VaR_matrix_MS = matrix(0,20,max(N))
    tempMatrix = matrix(0,20,max(N))
    ############################################################

    #VaR_matrix  <- foreach(i = 1:N,.combine = "cbind") %dopar% {
    VaR_matrix_MS  <- foreach(i = 1:N,.combine = "cbind") %dopar% { 
      #tempMatrix[,i] = multi_day_VaR(10067+i-1,11567+i-1)
      tempMatrix[,i] = multi_day_VaR(data_startpoint+i-1,data_startpoint+1500+i-2)
      tempMatrix[,i]
      #Equivalent to finalMatrix = cbind(finalMatrix, tempMatrix)
    }
    #stop cluster
    stopCluster(cl)
    end.time <- Sys.time()
    time.taken <- end.time - start.time
    time.taken

这里是循环内部调用的函数的代码,它也使用了包keblu / MSGARCH的一些函数,并且使用了预生成的数据:

  multi_day_VaR <- function(est_begin, est_end) {
  library(MSGARCH)
  data_est = All_dataset[c(est_begin:est_end),2]#6years 1500, AIC:  3728.115 
  data_est = as.numeric(as.character(data_est))
  ###################################################################################
  #data_est = All_dataset[c(2:1501),2]#6years 1500, AIC:  3728.115
  ###################################################################################

  ## Example 1: A single-regime model
  #spec <- CreateSpec(variance.spec = list(model = c("sGARCH")),
   #                  distribution.spec = list(distribution = c("norm")))
  #spec <- CreateSpec(variance.spec = list(model = c("sGARCH")),
  #                  distribution.spec = list(distribution = c("sstd")))
  ## Example 2: A MS-GARCH model
  spec <- CreateSpec(variance.spec = list(model = c("gjrGARCH")),
                     distribution.spec = list(distribution = c("sstd")),
                     switch.spec = list(do.mix = FALSE, K = 2))

  #set.seed(123)
  #out.mle = MSGARCH:: FitML(spec = spec, data = data_est)

  #ctr.bay = list(n.burn = 5000L, n.mcmc = 10000L, n.thin = 10L, par0 = out.mle$par)
  ctr.bay = list(n.burn = 5000L, n.mcmc = 10000L, n.thin = 10L)
  set.seed(123)                                                           
  out.bay = MSGARCH::FitMCMC(spec = spec, data = data_est, ctr = ctr.bay)
  #-----------------------------------------------------------------------------------
  #compute the one-step ahead Value-at-Risk and Expected-shortfall out-of-sample
  #Risk(object = out.bay, alpha = c(0.01, 0.05), do.es = FALSE, do.its = FALSE, n.ahead = 250)
  #Risk(object = out.mle, alpha = c(0.01, 0.05), do.es = FALSE, do.its = FALSE, n.ahead = 20)
  #------------------------------------------------------------------------------------

  set.seed(123)
  sim = Sim(object = out.bay, n.ahead = 250, n.sim = 1)
  #sim1 = Sim(object = out.mle, n.ahead = 20L, n.sim = 1000L, par = out.mle$par, n.burnin = 500L)
  #----------------------------------------------------------------------------------

  #MARGIN: for a matrix 1 indicates rows, 2 indicates columns, c(1, 2) indicates rows and columns. 
  ret = t(apply(sim$draw, MARGIN = 2,FUN = cumsum))
  VaR = matrix(0,20,1)#1,5,10,20 days
  VaR[1,1] = quantile(ret[,1],probs = c(0.01)) # daily 
  VaR[2,1] = quantile(ret[,5],probs = c(0.01)) # weekly 
  VaR[3,1] = quantile(ret[,20],probs = c(0.01)) # monthly
  VaR[4,1] = quantile(ret[,60],probs = c(0.01)) # quarterly 
  VaR[5,1] = quantile(ret[,250],probs = c(0.01)) # yearly
  VaR[6,1] = quantile(ret[,1],probs = c(0.05)) # daily
  VaR[7,1] = quantile(ret[,5],probs = c(0.05)) # weekly
  VaR[8,1] = quantile(ret[,20],probs = c(0.05)) # monthly
  VaR[9,1] = quantile(ret[,60],probs = c(0.05)) # quarterly
  VaR[10,1] = quantile(ret[,250],probs = c(0.05)) # yearly


  #for day ahead return
  VaR[11,1] = quantile(sim$draw[1,],probs = c(0.01)) 
  VaR[12,1] = quantile(sim$draw[5,],probs = c(0.01)) 
  VaR[13,1] = quantile(sim$draw[20,],probs = c(0.01)) 
  VaR[14,1] = quantile(sim$draw[60,],probs = c(0.01))
  VaR[15,1] = quantile(sim$draw[250,],probs = c(0.01))
  VaR[16,1] = quantile(sim$draw[1,],probs = c(0.05)) 
  VaR[17,1] = quantile(sim$draw[5,],probs = c(0.05)) 
  VaR[18,1] = quantile(sim$draw[20,],probs = c(0.05)) 
  VaR[19,1] = quantile(sim$draw[60,],probs = c(0.05))
  VaR[20,1] = quantile(sim$draw[250,],probs = c(0.05))
  VaR
  #print(VaR)
  #set.seed(123)
  #risk.mle = MSGARCH::risk(out.bay, level = c(0.95), ES = FALSE,
  #                         do.its = FALSE)
  #risk.mle$VaR
}

运行循环时显示此错误,我无法找出原因,因为只有在循环中存在大量迭代时才会发生这种情况:

  

{:>错误       `任务190失败 - &#34;矩阵乘法:奇异矩阵的逆;建议使用solve()代替&#34;

1 个答案:

答案 0 :(得分:0)

这可能是由于我们最近推送到github版本的Rcpp中自适应采样器的新实现。我们尚未进行大规模测试,但是当我们在适应步骤中检测到它不是半确定正时,这个误差似乎来自协方差矩阵的校正。我们将负特征值校正为一个小的正数,以重建一个半确定的正矩阵,但似乎它有时会失败。我们将尝试修复此错误,谢谢。

与此同时,您是否可以在https://github.com/keblu/MSGARCH/issues处撰写问题,以便我们更轻松地跟踪错误。

此外,CRAN版本仍然使用自适应采样器的R实现,因此您可以使用它。

感谢。