请教大家,garch参数估计怎么对其范围进行限制,使得其第一个参数参数项大于0,后面两个参数大于0并相加小于1.在网上找到一个代码,使用maxlik模块,但却没有对参数进行限制,奇怪的是模拟了一下,该代码可以正常估计。
/**** Start Estimation maxlik ****/
/** Global Maxlik Parameters **/
#include maxlik.ext;
maxset;
_max_GradTol = 1e-6;
_max_Switch =2~5|0.01~0.01|5~5|0.01~0.01;
_max_Algorithm = 2;
_max_LineSearch= 1;
_max_MaxIters=1000;
_max_GradMethod= 1;
_max_CovPar = 3;
_max_GradStep =1e-2;
_max_RandRadius=0.1;
_max_MAXTry=500;
__output = 1;
/** Data used in the likelihood function **/
data=y;
/** Define starting values for the parameters (theta0) **/
/*
__output=1;
{coef,ll,res,vcb,aic,sbc}=arima(0,y,1,0,1,1);
success=saved(y~res,"GARCH","y1"~"r1");
*/
theta0=0.1|0.1|0.1|0.1|0.1|0.1;
/* Define Parameter Labels */
_max_ParNames="c"|"phi1"|"theta1"|"omega"|"alpha1"|"beta1";
/* Define empty residual, std residual & cond. covariance vector */
res=zeros(rows(data),1);
sres=zeros(rows(data),1);
cv=zeros(rows(data),1);
{thetahat,ll,g,vc,ret}=maxlik(data,0,&lfct_ARMAGARCH,theta0);
call maxprt(thetahat,ll,g,vc,ret);
proc(1) = lfct_ARMAGARCH(_theta,_data);
local _cm, _cv, _mlag, _ce, _i, _ll, _rd;
local _c, _phi1, _thet1;
local _w, _alpha1, _beta1;
/* Initialize ARMA-GARCH Parameters */
_c=_theta[1];
_phi1=_theta[2];
_thet1=_theta[3];
_w=_theta[4];
_alpha1=_theta[5];
_beta1=_theta[6];
/* Initialization conditional mean & variance function and re-defintion data*/
@Define max lag@ _mlag=1;
_rd=rows(data);
_cm=meanc(_data).*ones(_rd+_mlag,1);
_cv=ones(_rd+_mlag,1).*(stdc(data)^2);
_ce=zeros(_rd+_mlag,1);
_data=zeros(_mlag,1)|_data;
/* Recursive computation of the conditional mean function at every point t, based on _theta */
for _i (1+_mlag,_rd+_mlag,1);
_cm[_i]=_c+_phi1*_data[_i-1]+_thet1*(_ce[_i-1]@*(_i>1+_mlag)@);
_ce[_i]=_data[_i]-_cm[_i];
_cv[_i]=_w+_beta1*_cv[_i-1]+_alpha1*(_ce[_i-1]@*(_i>1+_mlag)@)^2;
endfor;
/* Construct residuals by re-definition of the global variables*/
res=trimr(_data-_cm,_mlag,0);
sres=trimr((_data-_cm)./sqrt(_cv),_mlag,0);
cv=trimr(_cv,_mlag,0);
/* log-likelhood */
_ll=trimr(-ln(sqrt(_cv))-0.5*((_data-_cm)./sqrt(_cv))^2,_mlag,0);
retp(_ll);
endp;