An Example Trivariate GARCH-in-Mean Program for EViews 6.0
Posted: Wed Nov 24, 2010 1:48 am
Please find attached a programming code for trivariate garch-in-mean model written for EViews 6.0 sometime ago. I see that there is a growing need on multivariate garch estimation in EViews 6.0 recently and therefore decided to post it. Please keep in mind that you have to change the relevant parts (sample, series name, etc.) of the code to suit your own needs. Hope it will be useful...
Code: Select all
' TRIVARIATE GARCH-in-MEAN PROGRAM (01/05/2009)
' example program for EViews 6.0 LogL object
'
' restricted (diagonal) version of
' tri-variate BEKK of Engle and Kroner (1995):
'
' y = mu + lambda*H + res
' res ~ N(0,H)
'
' H = omega*omega' + beta*H(-1)*beta' + alpha*res(-1)*res(-1)'*alpha'
'
' where,
' y = 3 x 1
' mu = 3 x 1
' lambda = 3 x 1
' H = 3 x 3 (symmetric)
' H(1,1) = variance of y1 (saved as var_y1)
' H(1,2) = cov of y1 and y2 (saved as cov_y1y2)
' H(1,3) = cov of y1 and y3 (saved as cov_y1y3)
' H(2,2) = variance of y2 (saved as var_y2)
' H(2,3) = cov of y2 and y3 (saved as cov_y2y3)
' H(3,3) = variance of y3 (saved as var_y3)
' omega = 3 x 3 (low triangular)
' beta = 3 x 3 (diagonal)
' alpha = 3 x 3 (diagonal)
'
'change path to program path
%path = @runpath
cd %path
' load workfile
load intl_fin.wf1
' dependent variables of all series must be continuous
series y1 = dlog(sp500)
series y2 = dlog(ftse)
series y3 = dlog(nikkei)
' set sample
' first observation of s1 need to be one or two periods after
' the first observation of s0
sample s0 3/3/94 8/1/2000
sample s1 3/7/94 8/1/2000
' initialization of parameters and starting values
' change below only to change the specification of model
smpl s0
'get starting values from univariate GARCH-in-mean
equation eq1.arch(archm=var,m=100,c=1e-5) y1 c
equation eq2.arch(archm=var,m=100,c=1e-5) y2 c
equation eq3.arch(archm=var,m=100,c=1e-5) y3 c
'save the conditional variances
eq1.makegarch garch1
eq2.makegarch garch2
eq3.makegarch garch3
' declare coef vectors to use in TVGARCHM model
coef(3) lambda
lambda(1) = eq1.c(1)
lambda(2) = eq2.c(1)
lambda(3) = eq3.c(1)
coef(3) mu
mu(1) = eq1.c(2)
mu(2) = eq2.c(2)
mu(3) = eq3.c(2)
coef(6) omega
omega(1) = (eq1.c(3))^.5
omega(2) = 0
omega(3) = 0
omega(4) = eq2.c(3)^.5
omega(5) = 0
omega(6) = eq3.c(3)^.5
coef(3) alpha
alpha(1) = (eq1.c(4))^.5
alpha(2) = (eq2.c(4))^.5
alpha(3) = (eq3.c(4))^.5
coef(3) beta
beta(1) = (eq1.c(5))^.5
beta(2) = (eq2.c(5))^.5
beta(3) = (eq3.c(5))^.5
' use sample var-cov as starting value of variance-covariance matrix
series cov_y1y2 = @cov(y1-mu(1)-lambda(1)*garch1, y2-mu(2)-lambda(2)*garch2)
series cov_y1y3 = @cov(y1-mu(1)-lambda(1)*garch1, y3-mu(3)-lambda(3)*garch3)
series cov_y2y3 = @cov(y2-mu(2)-lambda(2)*garch2, y3-mu(3)-lambda(3)*garch3)
series var_y1 = @var(y1-lambda(1)*garch1)
series var_y2 = @var(y2-lambda(2)*garch2)
series var_y3 = @var(y3-lambda(3)*garch3)
series sqres1 = (y1-mu(1)-lambda(1)*garch1)^2
series sqres2 = (y2-mu(2)-lambda(2)*garch2)^2
series sqres3 = (y3-mu(3)-lambda(3)*garch3)^2
series res1res2 = (y1-mu(1)-lambda(1)*garch1)*(y2-mu(2)-lambda(2)*garch2)
series res1res3 = (y1-mu(1)-lambda(1)*garch1)*(y3-mu(3)-lambda(3)*garch3)
series res2res3 = (y2-mu(2)-lambda(2)*garch2)*(y3-mu(3)-lambda(3)*garch3)
' constant adjustment for log likelihood
!mlog2pi = 3*log(2*@acos(-1))
' ...........................................................
' LOG LIKELIHOOD
' set up the likelihood
' 1) open a new blank likelihood object name tvgarch
' 2) specify the log likelihood model by append
' ...........................................................
logl tvgarchm
' squared errors and cross errors
tvgarchm.append @logl logl
tvgarchm.append sqres1 = (y1-mu(1)-lambda(1)*var_y1)^2
tvgarchm.append sqres2 = (y2-mu(2)-lambda(2)*var_y2)^2
tvgarchm.append sqres3 = (y3-mu(3)-lambda(3)*var_y3)^2
tvgarchm.append res1res2 = (y1-mu(1)-lambda(1)*var_y1)*(y2-mu(2)-lambda(2)*var_y2)
tvgarchm.append res1res3 = (y1-mu(1)-lambda(1)*var_y1)*(y3-mu(3)-lambda(3)*var_y3)
tvgarchm.append res2res3 = (y2-mu(2)-lambda(2)*var_y2)*(y3-mu(3)-lambda(3)*var_y3)
' variance and covariance series
tvgarchm.append var_y1 = omega(1)^2 + beta(1)^2*var_y1(-1) + alpha(1)^2*sqres1(-1)
tvgarchm.append var_y2 = omega(2)^2+omega(4)^2 + beta(2)^2*var_y2(-1) + alpha(2)^2*sqres2(-1)
tvgarchm.append var_y3 = omega(3)^2+omega(5)^2+omega(6)^2 + beta(3)^2*var_y3(-1) + alpha(3)^2*sqres3(-1)
tvgarchm.append cov_y1y2 = omega(1)*omega(2) + beta(2)*beta(1)*cov_y1y2(-1) + alpha(2)*alpha(1)*res1res2(-1)
tvgarchm.append cov_y1y3 = omega(1)*omega(3) + beta(3)*beta(1)*cov_y1y3(-1) + alpha(3)*alpha(1)*res1res3(-1)
tvgarchm.append cov_y2y3 = omega(2)*omega(3) + omega(4)*omega(5) + beta(3)*beta(2)*cov_y2y3(-1) + alpha(3)*alpha(2)*res2res3(-1)
' determinant of the variance-covariance matrix
tvgarchm.append deth = var_y1*var_y2*var_y3 - var_y1*cov_y2y3^2-cov_y1y2^2*var_y3+2*cov_y1y2*cov_y2y3*cov_y1y3-cov_y1y3^2*var_y2
' calculate the elements of the inverse of var_cov (H) matrix
' numbered as vech(inv(H))
tvgarchm.append invh1 = (var_y2*var_y3-cov_y2y3^2)/deth
tvgarchm.append invh2 = -(cov_y1y2*var_y3-cov_y1y3*cov_y2y3)/deth
tvgarchm.append invh3 = (cov_y1y2*cov_y2y3-cov_y1y3*var_y2)/deth
tvgarchm.append invh4 = (var_y1*var_y3-cov_y1y3^2)/deth
tvgarchm.append invh5 = -(var_y1*cov_y2y3-cov_y1y2*cov_y1y3)/deth
tvgarchm.append invh6 = (var_y1*var_y2-cov_y1y2^2)/deth
' log-likelihood series
tvgarchm.append logl = -0.5*(!mlog2pi + (invh1*sqres1+invh4*sqres2+invh6*sqres3 +2*invh2*res1res2 +2*invh3*res1res3+2*invh5*res2res3 ) + log(deth))
' remove some of the intermediary series
tvgarchm.append @temp invh1 invh2 invh3 invh4 invh5 invh6 sqres1 sqres2 sqres3 res1res2 res1res3 res2res3 deth
' estimate the model
smpl s1
tvgarchm.ml(showopts, m=100, c=1e-5)
' change below to display different output
show tvgarchm.output
graph var.line var_y1 var_y2 var_y3
graph cov.line cov_y1y2 cov_y1y3 cov_y2y3
show var
show cov
' LR statistic for univariate vs trivariate
scalar lr = -2*(eq1.@logl + eq2.@logl + eq3.@logl - tvgarchm.@logl)
scalar lr_pval = 1 - @cchisq(lr,3)