library maxlik;
#include maxlik.ext;
a0=0.4;
a1=0.5;
a2=0.3;
T=1000;
{da}=garch_sample(a0,a1,a2,T);
var=vcx(da);
u=(da-meanc(da))^2;
maxset;
_max_active = {1,1,1};
_max_gradtol = 1e-5;
_max_algorithm = 5;
_max_linesearch = 5;
_max_maxiters = 100;
_max_maxtry = 5;
_max_randradious = 1e-3;
_max_covpar = 3;
__output = 1;
iv = 0.001|0.97|0.02;
{est,fmax,grad,cov,retcode}=maxlik(u,1,&lr,iv);
/*==================================================*/
proc lr(miv,u);
LOCAL a0,a1,a2,h,t,ll ;
a0 = miv[1];
a1 = miv[2];
a2 = miv[3];
if a0.<=0;
ll = -1000000;
goto skip;
endif;
if a1.<0;
ll=-1000000;
goto skip;
endif;
if a2.1;
ll = -1000000;
goto skip;
endif;
h = zeros(rows(u),1);
h[1] = a0+(a1 + a2)*var;
t=2;
do until t>rows(u);
h[t]=a0+a1*h[t-1]+a2*u[t-1];
t=t+1;
endo;
ll = -0.5*ln(2* pi)-0.5*ln(h[2:rows(u)])-0.5*(u[2:rows(u)]./h[2:rows(u)]);
skip:
retp(ll);
endp;
/*==================================================*/
proc garch_sample(a0,a1,a2,T);
local nobs, et,ut,ht,utend;
nobs=ROUND(T^(1/2));
et=rndn(T+nobs,1);
ut=zeros(T+nobs,1);
ht=zeros(T+nobs,1);
ht[1]=a0/(1-a1-a2);
for i(2,T+nobs,1);
ht[i]=a0+a1*ht[i-1]+a2*ut[t-1]^2;
ut[i]=et[i-1]*ht[i-1]^(1/2);
endfor;
utend=ut[nobs+1:T+nobs];
retp(utend);
endp;
G0156 : Illegal redefinition of procedure 'u' [garch.gss, line 9]
G0155 : Nested procedure definition [garch.gss, line 57]
G0008 : Syntax error 'proc garch_sample(a0,a1,a2,T)' [garch.gss, line 57]
2 Answers
0
- The "illegal redefinition" error is probably coming from some other code you have recently run. Add a new statement as the VERY FIRST line of your program.
- I also found a programming mistake around line 38 of the code. There is a line with this content:
if a2.1;
based upon some of the code above, I think it should probably be this:
if a2 .< 1;
Try making those changes and see if it will run for you.
0
thanks a lot!keep trying
Your Answer
2 Answers
- The "illegal redefinition" error is probably coming from some other code you have recently run. Add a new statement as the VERY FIRST line of your program.
- I also found a programming mistake around line 38 of the code. There is a line with this content:
if a2.1;
based upon some of the code above, I think it should probably be this:
if a2 .< 1;
Try making those changes and see if it will run for you.
thanks a lot!keep trying