自己根据 Kevin Sheppard的2001-Ucsd_garch给出的似然函数dcc_mvgarch_likelihood写的Sas程序,但是在求参数时出现问题,求教!
a是两列数据,去过均值,并用除过GARCH的条件方差。但是最后用“CALL NLPQN”优化参数时出现问题,估计是OPTN的设置时没有用这个似然函数使用最适合的函数设置,但又不知道怎么调整。希望各位大侠不吝赐教...
ods output Corr.Cov=corr;
proc corr data=a cov;
run;
ods output close;
proc sql;
select stdresid_us into:cov1 from corr where variable="stdresid_us";
select stdresid_chn into:cov4 from corr where variable="stdresid_chn";
select stdresid_us into:cov2 from corr where variable="stdresid_chn";
select stdresid_chn into:cov3 from corr where variable="stdresid_us";
quit;
/*下面用单变量的条件方差来计算DCC_MULTIVARIATE_GARCH模型的参数*/
proc iml;
use a;
read all into stdresid;
start trans4_constrain(c0);
c1=c0;
c1[1]=exp(c0[1])/(1+exp(c0[1])+exp(c0[2]));
c1[2]=exp(c0[2])/(1+exp(c0[1])+exp(c0[2]));
return(c1);
finish trans4_constrain;
start dcc_garch(parms) global(stdresid);
t=nrow(stdresid);
k=ncol(stdresid);
/* 约束条件,a,b>0,a+b<1*/
parms=trans4_constrain(parms);
print parms;
a=parms[1];
b=parms[2];
suma=sum(a);
sumb=sum(b);
m=1;
qbar=j(2,2,0);qbar[1,1]=&cov1.;qbar[1,2]=&cov2.;qbar[2,1]=&cov3.;qbar[2,2]=&cov4.;
likelihoods=j(t+1,1,0);
QT1=J(T+1,1,0); QT2=J(T+1,1,0); QT3=J(T+1,1,0); QT4=J(T+1,1,0);
RT1=J(T+1,1,0); RT2=J(T+1,1,0); RT3=J(T+1,1,0); RT4=J(T+1,1,0);
QT1[1]=QBAR[1,1]; QT2[1]=QBAR[1,2];QT3[1]=QBAR[2,1];QT4[1]=QBAR[2,2];
RT1[1]=QBAR[1,1]; RT2[1]=QBAR[1,2];RT3[1]=QBAR[2,1];RT4[1]=QBAR[2,2];
LOGL=0;
STDRESID=J(1,2,0)//STDRESID;
DO J=2 TO T+1;
C=J(2,2,0);
C=A*STDRESID[J-1,]`*STDRESID[J-1,];
QT1[J]=QBAR[1,1]*(1-A-B)+C[1,1]+QT1[J-1];
QT2[J]=QBAR[1,2]*(1-A-B)+C[1,2]+QT2[J-1];
QT3[J]=QBAR[2,1]*(1-A-B)+C[2,1]+QT3[J-1];
QT4[J]=QBAR[2,2]*(1-A-B)+C[2,2]+QT4[J-1];
R=J(2,2,0);
R[1,1]=1;
R[1,2]=QT2[J]/(SQRT((QT1[J]*QT4[J])));
R[2,1]=QT3[J]/(SQRT((QT1[J]*QT4[J])));
R[2,2]=1;
RT1[J]=R[1,1];
RT2[J]=R[1,2];
RT3[J]=R[2,1];
RT4[J]=R[2,2];
LIKELIHOODS[J]=LOG(RT1[J]*RT4[J]-RT3[J]*RT4[J])+STDRESID[J,]*INV(R)*STDRESID[J,]`;
LOGL=LOGL+LIKELIHOODS[J];
END;
return(LOGL);
finish dcc_garch;
/*初始优化参数*/
parms={0.1,0.97};
/* a=dcc_garch(parms);print a;*/
optn=j(1,11,0); optn[1]=1;optn[2]=0; optn[4]=1; optn[6]=2;optn[10]=0; optn[11]=0;
CALL NLPQN(rc,xout,"dcc_garch",parms,optn);
/*优化后的参数*/
prm_opt=trans4_constrain(xout);
quit;