We first load the data and calculate log-returns.
We start with the fulcrum profile-likelihood plot which indicates that a value δ=0.45 is about right.
U <- strank(X)
copmod_Gauss <- armacopula(pars = list(ar = 0.95, ma = -0.85))
pts <- seq(from=0.01, to=0.99, length=51) + 0.005
profilefulcrum(U, copmod_Gauss, locations = pts)
abline(v = 0.45)
Our baseline model is a model with ARMA(1,1) copula and v-transform with fulcrum at δ=0.45.
mod_Gauss <- vtscopula(copmod_Gauss, Vlinear(0.45))
fit_Gauss <- fit(mod_Gauss, U, tsoptions = tsoptions)
fit_Gauss
#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: armacopula
#> name: ARMA(1,1)
#> parameters:
#> ar1 ma1
#> 0.9631285 -0.8424401
#> ____________
#> V-transform:
#> name: Vlinear
#> parameters:
#> delta
#> 0.45
#> _____________________
#> Summary of estimates:
#> ar.ar1 ma.ma1
#> par 0.96312845 -0.84244010
#> se 0.01146705 0.02698389
#> convergence status: 0, log-likelihood: 91.87754
In this next section we try a d-vine copula model of the second kind
with a finite value for maxlag
and a linear v-transform. We
continue to use the Frank copula. The resulting model is superior to the
ARMA copula model and has the same number of parameters. Note that an
infinite value for maxlag
makes next to no difference in
the fit.
copmod_Frank <- dvinecopula2(family = "frank",
pars = list(ar = 0.95, ma = -0.85),
maxlag = 30)
mod_Frank <- vtscopula(copmod_Frank, Vlinear(0.45))
fit_Frank <- fit(mod_Frank, U, tsoptions = tsoptions)
AIC(fit_Gauss, fit_Frank)
#> df AIC
#> fit_Gauss 2 -179.7551
#> fit_Frank 2 -186.4793
We provide plots for the model with Frank copula to show aspects of the fit.
We fit 6 marginal distributions (3 symmetric and 3 skewed) of which the double Weibull gives the lowest AIC value.
marg_st <- fit(margin("st"), X)
marg_sst <- fit(margin("sst"), X)
marg_lp <- fit(margin("laplace",
pars = c(mu = 0.2, scale = 2.7)), X)
marg_slp <- fit(margin("slaplace",
pars = c(mu = 0.2, scale = 2.7, gamma = 0.9)), X)
marg_dw <- fit(margin("doubleweibull",
pars = c(mu = 0.2, shape = 0.8, scale = 2.7)), X)
marg_sdw <- fit(margin("sdoubleweibull",
pars = c(mu = 0.2, shape = 0.8, scale = 2.7, gamma = 0.9)), X)
AIC(marg_st, marg_sst, marg_slp, marg_lp, marg_dw, marg_sdw)
#> df AIC
#> marg_st 3 5816.288
#> marg_sst 4 5818.249
#> marg_slp 3 5801.355
#> marg_lp 2 5799.447
#> marg_dw 3 5749.362
#> marg_sdw 4 5751.137
We fit a full model combining the double Weibull margin with the VT-d-vine model of the second kind.
fullmod <- tscm(fit_Frank, margin = marg_dw)
fullmod <- fit(fullmod, as.numeric(X),
method = "full", tsoptions = tsoptions)
fullmod
#> object class: tscmfit
#> _______
#> MARGIN:
#> name: doubleweibull
#> parameters:
#> mu shape scale
#> 0.1916831 0.8440733 2.6951432
#> _______
#> COPULA:
#> object class: vtscopula
#> ____________
#> Base copula:
#> object class: dvinecopula2
#> name: type2-d-vine
#> copula family: frank
#> KPACF: kpacf_arma with max lag 30
#> parameters:
#> [1] 0.9597057 -0.8344573
#> ____________
#> V-transform:
#> name: Vlinear
#> parameters:
#> delta
#> 0.45
#> _________________________
#> summary of all estimates:
#> ar ma margin.mu margin.shape margin.scale
#> par 0.95970573 -0.83445730 0.1916831037 0.84407334 2.6951432
#> se 0.01419982 0.02912741 0.0006240765 0.03191155 0.2711454
#> convergence status: 10 , log-likelihood: -2776.988
AIC(marg_dw, fullmod)
#> df AIC
#> marg_dw 3 5749.362
#> fullmod 5 5563.977
We show all the possible plots for the full model.