Examples / VARGARCHSIMULATE.RPF |
VARGARCHSIMULATE.RPF shows how to simulate a VAR with GARCH (DVECH) errors. A simpler example without the VAR mean model can be found at GARCHMVSIMULATE.RPF. An example with a univariate (AR-GARCH) process can be found at ARGARCHSIM.RPF.
This first simulates a mean zero GARCH error process to form the shocks, then simulates the VAR taking the GARCH shocks as input.
This sets the number of observations and number of variables:
compute nobs=500
compute n=2
This sets up the control parameters for the GARCH process—as a DVECH process, the C, A and B are all \(n \times n\)SYMMETRIC matrices, so only the lower triangle needs to be specified. If you want a process larger than 2 variables, you'll need to expand these matrices to the proper dimension:
dec symm vc(n,n) va(n,n) vb(n,n)
compute vc=||.05|.01,.05||
compute va=||.08|.05,.08||
compute vb=||.90|.85,.90||
This computes the stationary covariance matrix. Because this is a DVECH, this can be done element by element.
dec symm h0(n,n)
ewise h0(i,j)=vc(i,j)/(1-va(i,j)-vb(i,j))
This creates the formulas which simulate the mean zero DVECH process. HF will compute the variance given the lagged outer product of residuals (UU) and lagged variance (H); HU (in order)
1.computes the covariance matrix
2.does mean zero normal draws with the just computed covariance matrix using %RANMVNORMAL
3.computes and saves the outer product of the residuals using %OUTERXX
4.saves the residuals into the elements of the VEC[SERIES] U using %PT
5.returns the covariance matrix as the final value of the FRML
frml hf = vc+va.*uu{1}+vb.*h{1}
frml hu = hx=hf,ux=%ranmvnormal(%decomp(hx)),uu=%outerxx(ux),%pt(u,t,ux),hx
This initializes the outer product and variance series to the stationary variance of the process, then simulates the process from entries 2 on.
gset uu = h0
gset h = h0
*
* Generate starting in entry 2. This creates the simulated GARCH process
* as a side effect of generating the sequence of covariance matrices.
*
gset h 2 nobs = hu(t)
If we just wanted a multivariate GARCH process, we would now be done, with U(1) and U(2) as the two series. The following creates a 2 lag VAR which YGARCH(1) and YGARCH(2) as the two series. The two processes will be
\(\begin{array}{*{20}{l}}{{y_{1,t}} = .80{y_{1,t - 1}} + .15{y_{1,t - 2}} + .30{y_{2,t - 1}} - .50{y_{2,t - 2}} + {\varepsilon _{1,t}}} \\ {{y_{2,t}} = - .20{y_{1,t - 1}} + .20{y_{1,t - 2}} + .85{y_{2,t - 1}} + .10{y_{2,t - 2}} + {\varepsilon _{2,t}}} \\\end{array}\)
dec vect[series] ygarch(2)
system(model=vargarch)
variables ygarch
lags 1 2
end(system)
*
dec rect varcoeffs(4,2)
input varcoeffs
.80 -.20
.15 .20
.30 .85
-.50 .10
compute %modelsetcoeffs(vargarch,varcoeffs)
Just in case, this checks whether the largest root isn't explosive (that it's less than 1):
disp "Largest root of VAR" %modellargestroot(vargarch)
This does the simulation of the process, using U as the input shocks (the PATHS option on FORECAST indicates that it will be forecast with full paths of shocks):
clear(zeros) ygarch
forecast(paths,from=3,to=nobs,model=vargarch,results=ygarch)
# u
For illustration, the program estimates the VAR by least squares and by the (properly specified) GARCH model and computes forecasts (of the mean of the data) for each. It uses @UFOREERRORS to compute statistics on the forecast errors. Note that this is a very bad idea. The standard forecast performance statistics are based upon an assumption of heteroscedasticity—the GARCH model (intentionally) downweights the residuals in the high variance zones. As a result, least squares will be expected to look somewhat better by these measures than the properly specified GARCH model.
Full Program
compute nobs=500
compute n=2
*
all nobs
*
* u is the simulated GARCH process
*
dec vect[series] u(n)
*
* H is the series of variance matrices, UU is the series of lagged outer products of the residuals.
*
dec series[symm] h uu
dec symm vc(n,n) va(n,n) vb(n,n)
compute vc=||.05|.01,.05||
compute va=||.08|.05,.08||
compute vb=||.90|.85,.90||
*
* Compute the stationary variance
*
dec symm h0(n,n)
ewise h0(i,j)=vc(i,j)/(1-va(i,j)-vb(i,j))
*
dec frml[symm] hf hu
dec symm hx
dec vect ux
*
frml hf = vc+va.*uu{1}+vb.*h{1}
frml hu = hx=hf,ux=%ranmvnormal(%decomp(hx)),uu=%outerxx(ux),%pt(u,t,ux),hx
*
* Initialize the UU and H series for the pre-sample values
*
gset uu = h0
gset h = h0
*
* Generate starting in entry 2. This creates the simulated GARCH process
* as a side effect of generating the sequence of covariance matrices.
*
gset h 2 nobs = hu(t)
******************************************************************
*
* Create a VAR with the GARCH as an error process
*
dec vect[series] ygarch(2)
system(model=vargarch)
variables ygarch
lags 1 2
end(system)
*
dec rect varcoeffs(4,2)
input varcoeffs
.80 -.20
.15 .20
.30 .85
-.50 .10
compute %modelsetcoeffs(vargarch,varcoeffs)
*
* Make sure the dominant root isn't explosive
*
disp %modellargestroot(vargarch)
*
clear(zeros) ygarch
forecast(paths,from=3,to=nobs,model=vargarch,results=ygarch)
# u
*
* Discard the first 100 entries in doing the estimates to give the VAR process
* time to overcome the initial conditions.
*
* Estimate the model by OLS and do out-of-sample forecasts of the mean.
*
estimate(model=vargarch) 101 nobs
disp %logl
forecast(static,model=vargarch,from=%regstart(),to=%regend(),results=olsforecasts)
*
* Estimate the model by GARCH and do out-of-sample forecasts of the mean.
*
garch(p=1,q=1,model=vargarch,presample=%sigma) 101 nobs ygarch
forecast(static,model=vargarch,from=%regstart(),to=%regend(),results=garchforecasts)
*
* Do forecast error statistics on the two sets of forecasts. This is to
* demonstrate that this is a *really* bad idea for evaluating a GARCH
* model. Standard forecast statistics (RMSE, MAE) are based upon equal
* weights on the errors. A GARCH model (intentionally) downweights the
* errors on the high-variance parts of the sample, while OLS doesn't.
* Thus OLS would be expected to do no worse (and should theoretically be
* slightly better) even though, in this case, we know that the GARCH is
* correctly specified and OLS isn't.
*
@uforeerrors(title="Forecast Errors from GARCH Model, Variable 1") ygarch(1) garchforecasts(1)
@uforeerrors(title="Forecast Errors from Least Squares, Variable 1") ygarch(1) olsforecasts(1)
@uforeerrors(title="Forecast Errors from GARCH Model, Variable 2") ygarch(2) garchforecasts(2)
@uforeerrors(title="Forecast Errors from Least Squares, Variable 2") ygarch(2) olsforecasts(2)
Output
This depends upon random numbers so won't match exactly.
Largest root of VAR 0.95001
VAR/System - Estimation by Least Squares
Usable Observations 400
Dependent Variable YGARCH(1)
Mean of Dependent Variable 13.242584903
Std Error of Dependent Variable 18.335985914
Standard Error of Estimate 1.436261677
Sum of Squared Residuals 816.88765143
Durbin-Watson Statistic 2.0319
Variable Coeff Std Error T-Stat Signif
************************************************************************************
1. YGARCH(1){1} 0.793498054 0.045043430 17.61629 0.00000000
2. YGARCH(1){2} 0.155062033 0.043628417 3.55415 0.00042497
3. YGARCH(2){1} 0.224214420 0.045841859 4.89104 0.00000146
4. YGARCH(2){2} -0.446576268 0.047950196 -9.31334 0.00000000
Dependent Variable YGARCH(2)
Mean of Dependent Variable -2.884887297
Std Error of Dependent Variable 5.956208544
Standard Error of Estimate 1.522227477
Sum of Squared Residuals 917.60189102
Durbin-Watson Statistic 2.0186
Variable Coeff Std Error T-Stat Signif
************************************************************************************
1. YGARCH(1){1} -0.218659572 0.047739453 -4.58027 0.00000623
2. YGARCH(1){2} 0.216467336 0.046239746 4.68141 0.00000392
3. YGARCH(2){1} 0.859444947 0.048585671 17.68927 0.00000000
4. YGARCH(2){2} 0.093811273 0.050820200 1.84594 0.06564643
Log likelihood of OLS VAR -1443.64784
MV-GARCH - Estimation by BFGS
Convergence in 136 Iterations. Final criterion was 0.0000000 <= 0.0000100
Usable Observations 400
Log Likelihood -1422.3435
Variable Coeff Std Error T-Stat Signif
************************************************************************************
Mean Model(YGARCH(1))
1. YGARCH(1){1} 0.794186519 0.046840609 16.95509 0.00000000
2. YGARCH(1){2} 0.155187638 0.045416674 3.41697 0.00063321
3. YGARCH(2){1} 0.211788446 0.044428845 4.76691 0.00000187
4. YGARCH(2){2} -0.432950739 0.046639755 -9.28287 0.00000000
Mean Model(YGARCH(2))
5. YGARCH(1){1} -0.243085415 0.037981481 -6.40010 0.00000000
6. YGARCH(1){2} 0.239604031 0.036832921 6.50516 0.00000000
7. YGARCH(2){1} 0.867813537 0.047891438 18.12043 0.00000000
8. YGARCH(2){2} 0.077213525 0.049434715 1.56193 0.11830466
9. C(1,1) 0.106172309 0.156402252 0.67884 0.49723842
10. C(2,1) 0.002298371 0.011572317 0.19861 0.84256833
11. C(2,2) 0.071408205 0.052429489 1.36199 0.17320245
12. A(1,1) 0.047823722 0.047332958 1.01037 0.31231885
13. A(2,1) -0.007751368 0.028395583 -0.27298 0.78487018
14. A(2,2) 0.123587284 0.040303313 3.06643 0.00216632
15. B(1,1) 0.900149358 0.116376873 7.73478 0.00000000
16. B(2,1) 0.930626910 0.257317756 3.61664 0.00029845
17. B(2,2) 0.852228747 0.048781865 17.47020 0.00000000
Forecast Errors from GARCH Model, Variable 1
From 101 to 500
Mean Error 0.02839049
Mean Absolute Error 1.10026909
Root Mean Square Error 1.42925210
Mean Square Error 2.042762
Theil's U 0.812777
Forecast Errors from Least Squares, Variable 1
From 101 to 500
Mean Error 0.03584847
Mean Absolute Error 1.09951033
Root Mean Square Error 1.42906232
Mean Square Error 2.042219
Theil's U 0.812669
Forecast Errors from GARCH Model, Variable 2
From 101 to 500
Mean Error -0.1202795
Mean Absolute Error 1.2029680
Root Mean Square Error 1.5153372
Mean Square Error 2.296247
Theil's U 0.959166
Forecast Errors from Least Squares, Variable 2
From 101 to 500
Mean Error -0.1134268
Mean Absolute Error 1.2000395
Root Mean Square Error 1.5145972
Mean Square Error 2.294005
Theil's U 0.958698
Copyright © 2024 Thomas A. Doan