2017-10-18 9 views
0

を計算するためにMSGarchパッケージを使用する場合は、ヴァールを生成するために使用される並列ループのためのコードであり、通常は正常に動作します:警告さてここで、多段階の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 

そして、ここでは、内部で呼び出される関数のコードですループとそのも/ MSGARCH、aは、事前に生成されたデータ使用kebluパッケージのいくつかの機能を使用して:

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が失敗しました - "行列乗算:特異行列の逆数。

答えて

0

これは、私たちが最近githubバージョンにプッシュしたRcppの適応サンプラーの新しい実装によるものかもしれませんが、まだ大規模なテストは行っていませんが、このエラーアダプティブ・ステップで半定正ではないことが検出されたときの共分散行列の修正から来ていると思われます。負の固有値を小さな正の数に修正して半定正の正の行列を再構築しますが、 。我々は、このエラー感謝を修正しようとします。

一方で、あなたは私たちがバグを追跡するために、それはより簡単だということなhttps://github.com/keblu/MSGARCH/issuesで問題を書くことができます。

また、CRANバージョンではまだ適応サンプラーのR実装が使用されていますので、これを使用できます。

ありがとうございました。

関連する問題