Lindo Systems

!  Maximum Likelihood estimation of a GARCH model.
Given a series of observations, we want to estimate the data generation process, 
allowing variance to vary over time  following a 
first order generalized autoregressive conditional heteroscedasticity model  
(i.e. GARCH(p,q), p=1 & q=1).   
The y(t) are assumed to be generated by the process:
    y(t) = alpha0 + alpha1*x(t) + a(t),
    a(t) = s(t)*e(t),
    s(t)^2 = beta0 + beta1*a(t-1)^2 + beta2*s(t-1)^2.
 where e(t) is white noise.                      
!  Reference: Hamilton, James D. (1994). Time Series Analysis,
 Princeton University Press (see Chapter 21).
Based on a What'sBest! model by Eren Ocakverdi;                     
!  Keywords:  ARIMA, Econometrics, Forecasting, GARCH, Heteroscedasticity,
   Maximum Likelihood, Time Series, Volatility Modeling, 
 ; 
! When solving, it is useful to use the multistart feature.
  Click on:
   Solver | Options... | Global Solver | Multistart solver Attempts | 4
   Solver | Options... | Global Solver | Use Global Solver | unchecked  ;
SETS:
  OBS: x, y, a2, s2, lns2, a2s2;
ENDSETS 
DATA:
! Data could alternatively be retrieved from
a spreadsheet if the corresponding ranges in the spreadsheet
are named X and Y, and there is only one spreadsheet open in Excel,
and using the statements:
  ! y = @OLE( );
  ! x = @OLE( );
  Y             X =
-0.3708295  -1.4196
 0.2287753  -2.2396
 0.2081382  -0.4196
 0.0068829  -2.5446
 1.1795391  -1.2646
 3.1387306  -0.4846
 8.2863123   2.7354
 0.1658157  -1.5946
 5.3619457   2.5554
 3.8964039  -0.0046
-1.1897701  -6.1796
 5.2908945  0.4404
 8.2525741  0.1104
 6.8349661  0.0704
 4.2805493  -1.3146
10.4264812  -2.3296
 4.0687621  -2.2696
 1.8502611  -1.3046
-1.3458486  -3.5796
-1.8730369  -4.5696
-2.8381844  -5.5696
 5.3310167  8.2054
 0.0732557  -2.1846
-0.7577384  -1.3696
 4.4930833  7.2404
 2.2265120  3.0254
2.5421704  1.2904
2.9213433  2.3404
5.7213486  2.7404
3.6311287  2.4054
2.7817124  -3.1396
5.9180655  -1.1296
2.2575107  -1.9946
5.7674948  2.7154
9.2050620  1.5054
-0.0209955  -0.5696
5.6606594  6.1704
2.1783104  0.2604
1.5737642  1.2754
0.9454083  -0.5546
1.8044255  -0.5546
2.8915052  2.0454
2.5810686  -0.3846
0.7529759  -0.1596
0.6981101  1.1404
-0.5896699  -1.1146
0.3986052  0.2354
3.7521638  3.0854
1.9010561  -1.8446
1.4289591  -0.8096
5.4507511  -0.5696
7.5936498  0.2554
8.0108612  -0.6396
6.3355794  2.4804
4.2950874  -0.7446
2.1758734  -0.7196
3.3352518  0.0554
0.9927065  -1.9896
4.8748990  2.1504
3.8428777  0.3504
0.9342661  -2.8396
0.7488359  -0.5746
2.7820806  1.6504
2.8280793  4.0604
0.8892052  1.1104
0.2164499  -0.6196
1.8584283  2.8054
1.9861690  2.0654
1.7550617  -0.3346
-2.2903837  -5.4296
1.0867499  1.5404
1.4195743  0.8654
2.4263522  2.3254
0.0010931  -1.2346
3.0172286  3.3704
1.6453181  0.4004
1.2380105  -0.8246
4.1735987  2.4604
2.2087904  0.5204
3.4052056  3.1954
4.2784727  0.2404
3.2013125  -3.6396
8.4369970  3.0254
1.6932748  1.2504
2.2554868  3.5104
1.0315299  0.0404
-3.6637109  -6.1446
2.4601249  2.2954
3.8984784  2.8704
2.8347394  1.7754
2.9695648  3.3704
1.6975146  1.2054
1.1658735  1.3854
1.7135134  1.1904
4.7345067  5.3504
-0.8121917  -2.0596
-0.4192262  -2.2096
1.2585376  0.5704
1.9207934  2.4304
0.1402132  -0.4546
;
 ENDDATA

 NOBS = @SIZE( OBS);
 PI = 3.141592654;
 s2(1) = 5.295;
 ! Compute intermediate terms;
 ! Observation 1 is special;
   a2(1) = ( y(1)- alpha0- alpha1* x(1))^2;
   s2(1) = 5.295;
   
 @FOR( OBS(i) | i #GT# 1 :
   a2( i) = ( y( i)- alpha0- alpha1*x( i))^2;
   s2( i) = beta0 + beta1* a2( i-1) + beta2* s2( i-1);
     );

! Maximize the log likelihood function;
  MAX = -@SUM( OBS( i): @LOG( s2( i)))/2 
        -( NOBS*@LOG(2* PI)/2) 
        - @SUM( OBS(i): a2( i)/ s2( i))/2;

 ! Some apriori constraints on the parameters;
   alpha0 >= 0.2;
   alpha1 >= 0.1;
   beta0 >=  0.1;
   beta1 >= 0.2;
   beta2 >= 0.01;