与Copulas的滚动窗口

时间:2018-02-26 05:45:03

标签: r forecasting model-fitting rolling-computation

我想应用一个滚动窗口来适应学生t Copula,然后根据拟合过程的结果进行预测。我已经尝试使用for循环,但它总是根据拟合的Copula命令声明错误。

#Students t Copula 
windowsSize <- 4000  # training data size
testsize    <- 351   # number of observations to forecast


for(k in 0:33)  # run 34 experiments
{
A         <- k*testsize + 1
B         <- A + windowsSize - 1
start_obs <- A
end_obs   <- B

lgYen_roll <- lgYenUSD[A:B]
lgEuro_roll <- lgEuroUSD[A:B]
ElgYen_roll <- ElgYenUSD[A:B]
ElgEuro_roll <- ElgEuroUSD[A:B
StdlgYen_roll <- StdlgYenUSD[A:B]
StdlgEuro_roll <- StdlgEuroUSD[A:B]

CopYenEuro_roll <- pobs(as.matrix(cbind(lgYen_roll,lgEuro_roll)))

YenEuro_fit_t_roll <- fitCopula(t.cop,CopYenEuro_roll,method=c('ml'), posDef = is(t.cop, "ellipCopula"),
                         start = NULL, lower = NULL, upper = NULL,
                         optim.method = optimMeth(t.cop, method,dim=d),
                         optim.control = list(maxit=1000),
                         estimate.variance = NA, hideWarnings = FALSE)

这里已经出现了第一个错误:“if(any(0 <0)|| any(u&gt; 1))中的错误停止(”'u'必须在[0,1]中 - 可能更确切地说使用pobs(。)“):   缺少需要TRUE / FALSE的值“

CO_YenEuro_roll_rho <- coef(YenEuro_fit_t_roll)[1]
CO_YenEuro_roll_df <- coef(YenEuro_fit_t_roll)[2]

YenEurocopula_dist_t_roll <- mvdc(copula=tCopula(param = CO_YenEuro_roll_rho,dim=2), margins=c("norm","norm"),
                           paramMargins = list(list(mean=ElgYen_roll, sd=StdlgYen_roll),
                                              list(mean=ElgEuro_roll, sd=StdlgEuro_roll)), 
                           check = TRUE, fixupNames = TRUE)

YenEurocopula_random_t_roll.dist <- rMvdc(351,YenEurocopula_dist_t_roll)

#Prediction
A           <- B + 1
B           <- B + testsize
lgYen_roll <- lgYenUSD[A:B]
lgEuro_roll <- lgEuroUSD[A:B]
ElgYen_roll <- ElgYenUSD[A:B]
ElgEuro_roll <- ElgEuroUSD[A:B]
StdlgYen_roll <- StdlgYenUSD[A:B]
StdlgEuro_roll <- StdlgEuroUSD[A:B]
predict_EXT <- matrix(0, testsize, 1)

for(i in 1:testsize)  # do the forecast based on the Copula Fit results
{
predict_EXT[i] <- fitCopula(t.cop,CopYenEuro_rolling[i],method=c('ml'), posDef = is(t.cop, "ellipCopula"),
                            start = NULL, lower = NULL, upper = NULL,
                            optim.method = optimMeth(t.cop, method,dim=d),
                            optim.control = list(maxit=1000),
                            estimate.variance = NA, hideWarnings = TRUE) 


YenEurocopula_dist_t_roll <- mvdc(copula=tCopula(param = CO_YenEuro_roll_rho[i],dim=2), margins=c("norm","norm"),
                                  paramMargins = list(list(mean=ElgYen_roll[i], sd=StdlgYen_roll[i]),
                                                      list(mean=ElgEuro_roll[i], sd=StdlgEuro_roll[i])), 
                                  check = TRUE, fixupNames = TRUE)
YenEurocopula_random_t_roll.dist <- rMvdc(351,YenEurocopula_dist_t_roll[i])
}}

也许某人有解决这个问题的方法?

0 个答案:

没有答案