I am reading to understand how to forecasting time-series data from the GARCH-copula model. I am looking forward to understanding the steps. From my understanding, we should follow the following steps:

  • fit a GARCH model to the data.

  • transform the residuals to the copula data (uniform margins. Then, estimate the model parameters).

  • Generate 100 1-day a hed forecast from copula

  • Simulate from copula

  • transform the simulated data to the original margins.

I really understand the first 3 steps. However, I have no idea about the fourth step. What is the process for this step? what is the process of forecasting using copula? a help with an example will be much appreciated.


1 Answer 1


How to fit a copula GARCH model?

  1. For each series (margins):
    (a) fit a univariate GARCH model (e.g. using ugarchspec followed by ugarchfit from the rugarch package in R),
    (b) obtain standardized residuals,
    (c) apply probability integral transform (PIT) to obtain Uniform[0,1] pseudo observations.
    The latter two steps can be acomplished by a single function pit applied on the fitted uGARCHfit object.
  2. Fit a copula on the pseudo observations from all series.

How to simulate (generate) from a copula GARCH model?
Suppose you have a fitted copula-GARCH model and so for each margin you can obtain the predicted conditional variance $$ \hat\sigma_{t+1}^2=\hat\omega+\hat\alpha_1\hat\varepsilon_t^2+\hat\beta_1\hat\sigma_t^2 $$ and the predicted conditional mean $$ \hat\mu_{t+1}=... $$ e.g. $\hat\mu_{t+1}=\hat{c}$ (assuming constant conditional mean) or $\hat\mu_{t+1}=\hat{c}+\hat\varphi_1x_t+\hat\theta_1\hat\varepsilon_t$ (assuming ARMA(1,1) conditional mean). This can be done as follows:

fcst =ugarchforecast(ufit, n.ahead=1) # `ufit` is the `uGARCHfit` object
cmean=fcst@forecast$seriesFor[1,1]    # conditional mean
csd  =fcst@forecast$sigmaFor [1,1]    # conditional standard deviation
  1. Simulate (generate) "pseudo observations" from the fitted copula. The result is a number of i.i.d. random vectors with each coordinate coming from a Uniform[0,1] distribution.
  2. For each margin:
    (a) transform the margin's generated values by "inverse PIT" that is specific to the margin (using a quantile function such as qnorm with zero mean and unit variance),
    (b) multiply all the generated values by the predicted conditional standard deviation $\hat\sigma_{t+1}$ due to the GARCH model specific to that margin,
    (c) add the predicted conditional mean $\hat\mu_{t+1}$ due to the conditional mean model specific to that margin.

The idea basically is to have a qualitative idea what the joint distribution is (that is the copula-GARCH model), then disassemble the data generating mechanism by learning its parameters on the way (estimate the model, obtain pseudo observations), simulate the most basic inputs (the pseudo observations) and assemble the joint distribution again (by transforming the simulated basic inputs into simulated values of the actual joint distribution according to the copula-GARCH model).

If you simulate a large enough number of realizations from the copula and then transform them as indicated above, you can inspect the empirical distribution of the resulting data. It can serve as an estimate of the predicted distribution.

  • 1
    $\begingroup$ An amazing help, really. I strongly appreciate it. One more point, please. cmean=fcst@forecast$seriesFor[1,1] # conditional mean csd =fcst@forecast$sigmaFor [1,1] is to find the prediction values for each margins. Could you please just explain what does [1,1] refers to? $\endgroup$
    – Maryam
    May 25, 2021 at 9:26
  • 1
    $\begingroup$ @Maryam, I do not remember at the moment*, but I suspect there are several elements to choose from, and the [1,1] element is the one we need. If you try running fcst@forecast$seriesFor, you will see what there is and why we take the [1,1] element. *I borrowed this from my own R code for copula-GARCH modeling, but I wrote the code more than a year ago, so I do not remember the details. $\endgroup$ May 25, 2021 at 9:35
  • 1
    $\begingroup$ Thanks a lot. I appreciate your amazing help. I will try this. $\endgroup$
    – Maryam
    May 25, 2021 at 9:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.