## GARCH- rolling regressions

For questions regarding programming in the EViews programming language.

Moderators: EViews Gareth, EViews Jason, EViews Moderator, EViews Matt

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### GARCH- rolling regressions

Hi Gareth

I am trying to run a positive feedback trading model in Eviews 8. Firstly, I run the GARCH M code as follows:

sample s0 @first @first+1
sample s1 @first+2 @last
smpl @all

' declare coef vectors to use in ARCH likelihood
coef(4) beta = 0
coef(3) alpha = 0
coef(1) dof = 0
coef(1) mu = 0

' get starting values
equation eq1.arch(1,1,ged,archm=VAR,backcast=1) y c y(-1)
eq1.makegarch garchm
equation eq1.arch(1,1,ged,archm=VAR,backcast=1) y c garchm*y(-1) y(-1)
beta(1) = eq1.c(1)
beta(2) = eq1.c(2)
beta(3) = eq1.c(3)
beta(4) = eq1.c(4)
alpha(1) = eq1.c(5)
alpha(2) = eq1.c(6)
alpha(3) = eq1.c(7)
dof(1) = eq1.c(8)
mu(1) = eq1.@se^2

' set presample values of expressions in logl
series sig2 = mu(1)
series res = resid

' set up GARCH likelihood
logl ll1
ll1.append @logl logl
ll1.append @byeqn
ll1.append res = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)
ll1.append sig2 = alpha(1)+ alpha(2)*res(-1)^2 + alpha(3)*sig2(-1)
ll1.append z = res/@sqrt(sig2)
ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2

' estimate and display results
smpl s1
ll1.ml(showopts, m=1000, c=1e-5)
show ll1.output

I then estimate the T-GARCH model using the following code:

' declare coef vectors to use in ARCH likelihood
coef(4) beta = 0
coef(3) alpha = 0
coef(1) dof = 0
coef(1) mu = 0
coef(1) thresh = 0

' get starting values
eq1.arch(1,1,thrsh=1,archm=VAR,ged,backcast=1) y c y(-1)
eq1.makegarch garchm
eq1.arch(1,1,thrsh=1,archm=VAR,ged,backcast=1) y c garchm*y(-1) y(-1)
beta(1) = eq1.c(1)
beta(2) = eq1.c(2)
beta(3) = eq1.c(3)
beta(4) = eq1.c(4)
alpha(1) = eq1.c(5)
alpha(2) = eq1.c(6)
thresh(1) = eq1.c(7)
alpha(3) = eq1.c(8)
dof(1) = eq1.c(9)
mu(1) = eq1.@se^2

' set presample values of expressions in logl
series sig2 = mu(1)
series res = resid

' set up GARCH likelihood
logl ll1
ll1.append @logl logl
ll1.append @byeqn
ll1.append res = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)
ll1.append sig2 = alpha(1)+ alpha(2)*res(-1)^2 + alpha(3)*sig2(-1) + thresh(1)*res(-1)^2*(res(-1)<0)
ll1.append z = res/@sqrt(sig2)
ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2

' estimate and display results
smpl s1
ll1.ml(showopts, m=1000, c=1e-5)
show ll1.output

My problem is I want to estimate rolling regressions using daily data. I simultaneously estimate the mean and conditional variance for each individual share, every month end during the period 2004-2010. These estimations are done each month using the daily returns for the past six months, on a rolling basis. For example, for the month of July 2004, I will use the daily returns for January 2004 - June 2004. I have tried to fiddle with the basic rolling regressions code that was provided on this site but I am failing to code it correctly. May you please help me on how I can go about it in programming the correct code. I have also attached the daily returns work file that I am using.

Thank you
Attachments
daily returns.wf1
Daily returns for Company A

EViews Gareth
Fe ddaethom, fe welon, fe amcangyfrifon
Posts: 12416
Joined: Tue Sep 16, 2008 5:38 pm

### Re: GARCH- rolling regressions

Why are you using a logl object?

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Hi Gareth

Thank you for the response. I used the logl object as per the model's specification and so as to maximise the likelihood function. Is this problematic given my current codes?

For the rolling regressions, I had to add the this third program code and I have been trying to use the basic rolling regression code that you provided on the forum:

'create some data
create u 800

series y=nrnd
series x1=nrnd
series x2=nrnd
series z=nrnd

'-------------------------------------------------------------------------------------
'run rolling regression

' set window size
!window = 180
' set step size
!step = 1
' get size of workfile
!length = @obsrange

' declare equation for estimation
equation eq1

'calculate number of rolls
!nrolls = @round((!length-!window)/!step)

'matrix to store coefficient estimates
matrix(3,!nrolls) coefmat ' where 3 is the number of coefficients

'variable keeping track of how many rolls we've done
!j=0

' move sample !step obs at a time
for !i = 1 to !length-!window+1-!step step !step
!j=!j+1

' set sample to estimation period
smpl @first+!i-1 @first+!i+!window-2

' estimate equation - where the equation is y=c(1) + c(2)*x1 + c(3)*x2
eq1.ls y c x1 x2

'store coefficients
colplace(coefmat,eq1.@coefs,!j)
next

show coefmat

My problem was in trying to modify this code so that it suits my data and method.

Thank you

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: GARCH- rolling regressions

What Gareth means is that, you do not have to use a LogL object if you are trying to estimate a regular GARCH or GARCH-in-mean model as they are already built-in.

I wrote the code you use for another user so as to allow him/her to estimate the effect of the interaction between conditional volatility and the lagged dependent variable (i.e. garchm*y(-1)) in the mean equation. If you only need garchm in the mean equation, then the following part of the code will be enough:

Code: Select all

`equation eq1.arch(1,1,ged,archm=VAR,backcast=1) y c y(-1)`

There is really nothing special about the Rolling part of the model and you already have a good example.

arga
Posts: 2
Joined: Wed Mar 18, 2015 9:54 am

### Re: GARCH- rolling regressions

Hi,

I'm trying to estimate a rolling regression garch with a moving window of 500 observations, and a 1 period ahead forecast of returns and conditional variance.
however may variance series only have the last 500 forecasts, it should have 3615.

'declare series
series r

'set window size
!window = 500

'set step size
!step = 1

'get size of workfile
!length = @obsrange

'declare equation for estimation
equation eq1

'calculate number of rolls
!nrolls = @floor((!length-!window)/!step)

'matrix to store coefficient estimates
matrix(4,!nrolls) coef1

'series to store forecast estimates
series rf
series volf

'catching start and end points
%start = "@first@"
%end = "@last"

'variable keeping track of how many solls we have done
!j=0

'move sample !step pbs at a time
for !i = 1 to !length-!window+1-!step step !step
!j=!j+1

'set sample for estimation period
%first = @otod(@dtoo(%start)+!i-1)
%last = @otod(@dtoo(%start)+!i+!window-2)
smpl {%first} {%last}

'estimate equation
eq1.arch(1, 1, h) r ar(1)

'store coefficients
colplace(coef1,eq1.@coefs,!j)

%1pers = @otod(@dtoo(%start)+!i+!window-1)
%1pere = @otod(@dtoo(%start)+!i+!window)
if @dtoo(%end) < @dtoo(%1pere) then 'whether fcast end point > wfile end point

exitloop
endif

'set smpl for forecasting period
smpl {%1pers} {%1pere}

'forecast with command forecast
eq1.forecast(f=na) pf

'conditional volatilities
eq1.makegarch volf

'set sample to obtain 1-period observation
smpl {%pere} {%pere}

'store forecasts
rf = pf

next

smpl @all
show coefgar11
show rf.line
show volf.line

d(noerr) pf
d(noerr) vf

I very appreciate some hint

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: GARCH- rolling regressions

arga wrote:I very appreciate some hint

Then you should also post your workfile along with your code. Unless there is an obvious logical mistake or a syntax error in the code, then it is extremely difficult to pinpoint to source of the problem. The data and the structure of workfile are very very important components of a program code.

Since another user is also interested in Rolling garch model in this thread, I "tried" to clean and correct the code you posted in order to point both of you in the right direction. I am really not sure if it does what you want, but should at least give you the idea:

Code: Select all

`mode quiet'declare series to store the outputseries rfseries volf'set window size!window = 500'set step size!step = 1'get size of workfile!length = @obsrange'declare equation for estimationequation eq1'calculate number of rolls!nrolls = @floor((!length-!window)/!step)'matrix to store coefficient estimatesmatrix(4,!nrolls) coef1'catching start and end points%start = r.@first%end = r.@last'variable keeping track of how many rolls we have done!j=0'move sample !step pbs at a timefor !i = 1 to !length-!window+1-!step step !step !j=!j+1'set sample for estimation period%first = @otod(@dtoo(%start)+!i-1)%last = @otod(@dtoo(%start)+!i+!window-2)smpl {%first} {%last}'estimate equationeq1.arch(1, 1, h) r ar(1)'store coefficientscolplace(coef1,eq1.@coefs,!j)'1-period-ahead forecast%1pers = @otod(@dtoo(%start)+!i+!window-1)'set smpl for forecasting periodsmpl {%1pers} {%1pers}'forecast with command forecasteq1.forecast(f=na) pf stdevf garchf'store forecastsrf(@dtoo(%1pers)) = pf(@dtoo(%1pers))volf(@dtoo(%1pers)) = garchf(@dtoo(%1pers))statusline !i of !nrollsnextsmpl @allshow coef1show rf.lineshow volf.lined(noerr) pfd(noerr) stdevf`

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Thank you for the response and I also estimate the effect of the interaction between conditional volatility and the lagged dependent variable that is why I used your code . Its just that I am not well versed with programming so I wanted to check if the certain program codes I am trying to use do make sense. So as I said earlier on, with the model that I am trying to run, which is called the positive feedback trading model, I first estimate the GARCH-in-mean model, then estimate the T-GARCH model. Lastly since this is done on a rolling basis, I use the rolling regressions code. With that basic rolling regression code, what are the main elements that I have to change for the codes to match my data and method?
Thank you.

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: GARCH- rolling regressions

The rolling code above works for the simplest case, where you can estimate the model with a single line of code. In your case, the estimation is a procedure by itself. So you should find a way to embed your full estimation into the following part of the rolling code:

Code: Select all

`...'estimate equationeq1.arch(1, 1, h) r ar(1)...`

Since there are several different ways to do a rolling regression, it may be difficult to find a generic code. But, should not be that difficult to modify it...

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Thank you, let me try to do that.

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Hi

I have tried to embed my full estimation procedure into a single code as you stipulated. My mean equation is: r_t=α+θσ_t^2+(ϕ_0+ϕ_1 σ_t^2 ) r_(t-1)+ε_t and my variance equation is : σ_t^2=ω+βε_(t-1)^2+λσ_(t-1)^2+δS_(t-1) ε_(t-1)^2.To estimate my model, for each individual share, every month-end during the sample period, the conditional mean and conditional variance equations are simultaneously estimated using daily returns for the past six months. These equations are estimated for all the shares in the sample. The same estimations are conducted in the next month using daily returns for the immediately preceding six months and this procedure is done monthly on a rolling basis. Thus, given that the sample period commenced in January 2004, the first equation is estimated at the end of June 2004 using January to June data and then estimates for July are obtained using February to July data thus maintaining the six-month window but rolling the data forward. Six months of daily data translated into approximately 125 observations that are used for each regression. I also need to store the threshold coefficients for each month and the respective student t statistics. I have tried to run the code and I am getting results but an error pops up that: c is not a member or procedure of eq1 in dof(1) =eq1.c(9). I have also uploaded the work file and the code is as follows:

Code: Select all

`'create some datacreate d5 2004 2013series y=nrndseries resid=nrnd'-------------------------------------------------------------------------------------'run rolling regression' set window size!window = 125 ' set step size!step = 1 ' get size of workfile!length = @obsrange ' declare equation for estimationequation eq1 'calculate number of rolls!nrolls = @round((!length-!window)/!step)'matrix to store coefficient estimatesmatrix(9,!nrolls)  coefmat ' where 9 is the number of coefficients'variable keeping track of how many rolls we've done!j=0' move sample !step obs at a timefor !i = 1  to  !length-!window+1-!step step !step   !j=!j+1   ' set sample to estimation period   smpl @first+!i-1 @first+!i+!window-2   ' estimate equationsample s0 @first @first+1sample s1 @first+2 @lastsmpl @all' declare coef vectors to use in ARCH likelihoodcoef(4) beta = 0coef(3) alpha = 0coef(1) dof = 0coef(1) mu = 0' get starting valuesequation eq1.arch(1,1,ged,archm=stdev,backcast=1) y c y(-1)eq1.makegarch garchmequation eq1.arch(1,1,ged,archm=stdev,backcast=1) y c garchm*y(-1) y(-1)beta(1) = eq1.c(1)beta(2) = eq1.c(2)beta(3) = eq1.c(3)beta(4) = eq1.c(4)alpha(1) = eq1.c(5)alpha(2) = eq1.c(6)alpha(3) = eq1.c(7)dof(1) = eq1.c(8)mu(1) = eq1.@se^2' set presample values of expressions in loglseries sig2 = mu(1)series resid = resid' set up GARCH likelihoodlogl ll1ll1.append @logl loglll1.append @byeqnll1.append resid = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)ll1.append sig2 = alpha(1)+ alpha(2)*resid(-1)^2 + alpha(3)*sig2(-1)ll1.append z = resid/@sqrt(sig2)ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2' declare coef vectors to use in ARCH likelihoodcoef(4) beta = 0coef(1) thresh = 0coef(3) alpha = 0coef(1) dof = 0coef(1) mu = 0' get starting valueseq1.arch(1,1,thrsh=1,archm=stdev,ged,backcast=1) y c y(-1)eq1.makegarch garchmeq1.arch(1,1,thrsh=1,archm=stdev,ged,backcast=1) y c garchm*y(-1) y(-1)beta(1) = eq1.c(1)beta(2) = eq1.c(2)beta(3) = eq1.c(3)beta(4) = eq1.c(4)alpha(1) = eq1.c(5)alpha(2) = eq1.c(6)thresh(1) = eq1.c(7)alpha(3) = eq1.c(8)dof(1) = eq1.c(9)mu(1) = eq1.@se^2' set presample values of expressions in loglseries sig2 = mu(1)series resid = resid' set up GARCH likelihoodlogl ll1ll1.append @logl loglll1.append @byeqnll1.append resid = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)ll1.append sig2 = alpha(1)+ alpha(2)*resid(-1)^2 + alpha(3)*sig2(-1) + thresh(1)*resid(-1)^2*(resid(-1)<0)ll1.append z = resid/@sqrt(sig2)ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2' estimate and display resultssmpl s1ll1.ml(showopts, m=1000, c=1e-5)show ll1.output'store coefficients   colplace(coef1,eq1.@coefs,!j)nextshow coef1`
Attachments
daily returns.wf1

Did you use forum search?
Posts: 1518
Joined: Thu Nov 20, 2008 12:04 pm

### Re: GARCH- rolling regressions

Student15 wrote:I have tried to run the code and I am getting results but an error pops up that: c is not a member or procedure of eq1 in dof(1) =eq1.c(9).

1) That is because eq1 has only 7 coefficients. The problem is due to wrong syntax in "...,archm=stdev,..." It should read: "...archm=sd..."
2) Your storage matrix should be coefmat, not coef1.
3) You cannot use sample objects inside a loop like that.

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Thank you for the quick response, let me try to effect those changes.

Student15
Posts: 19
Joined: Fri Apr 17, 2015 2:23 pm

### Re: GARCH- rolling regressions

Thank you for those corrections, I have effected them and that problem was solved. However, there is another error: Matrix size mismatch in "colplace(coefmat,Eq1.@coefs,1) and the coefficients are not being stored. I have tried to follow some links on the forum such as viewtopic.php?f=5&t=5272, but I am failing to deal with this error. May you please help me in correcting this error. Thank you. The current code is:

Code: Select all

`'run rolling regression' set window size!window = 126 ' set step size!step = 21 ' get size of workfile!length = @obsrange ' declare equation for estimationequation eq1 'calculate number of rolls!nrolls = @ceiling((!length-!window)/!step)'matrix to store coefficient estimatesmatrix(8,!nrolls) coefmat ' where 8 is the number of coefficientsmatrix(8,!nrolls) tmat'variable keeping track of how many rolls we've done!j=0' move sample !step obs at a timefor !i = 1  to  !length-!window+1-!step step !step !j=!j+1   ' set sample to estimation periodsmpl @first+!i-1  @first+!i-1+!window   ' estimate equationsample s0 @first @first+1sample s1 @first+2 @lastsmpl @all' declare coef vectors to use in ARCH likelihoodcoef(4) beta = 0coef(3) alpha = 0coef(1) dof = 0coef(1) mu = 0' get starting valuesequation eq1.arch(1,1,ged,archm=sd,backcast=1) y c y(-1)eq1.makegarch garchmequation eq1.arch(1,1,ged,archm=sd,backcast=1) y c garchm*y(-1) y(-1)beta(1) = eq1.c(1)beta(2) = eq1.c(2)beta(3) = eq1.c(3)beta(4) = eq1.c(4)alpha(1) = eq1.c(5)alpha(2) = eq1.c(6)alpha(3) = eq1.c(7)dof(1) = eq1.c(8)mu(1) = eq1.@se^2' set presample values of expressions in loglseries sig2 = mu(1)series resid = resid' set up GARCH likelihoodlogl ll1ll1.append @logl loglll1.append @byeqnll1.append resid = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)ll1.append sig2 = alpha(1)+ alpha(2)*resid(-1)^2 + alpha(3)*sig2(-1)ll1.append z = resid/@sqrt(sig2)ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2' declare coef vectors to use in ARCH likelihoodcoef(4) beta = 0coef(1) thresh = 0coef(3) alpha = 0coef(1) dof = 0coef(1) mu = 0' get starting valueseq1.arch(1,1,thrsh=1,archm=sd,ged,backcast=1) y c y(-1)eq1.makegarch garchmeq1.arch(1,1,thrsh=1,archm=sd,ged,backcast=1) y c garchm*y(-1) y(-1)beta(1) = eq1.c(1)beta(2) = eq1.c(2)beta(3) = eq1.c(3)beta(4) = eq1.c(4)alpha(1) = eq1.c(5)alpha(2) = eq1.c(6)thresh(1) = eq1.c(7)alpha(3) = eq1.c(8)dof(1) = eq1.c(9)mu(1) = eq1.@se^2' set presample values of expressions in loglseries sig2 = mu(1)series resid = resid' set up GARCH likelihoodlogl ll1ll1.append @logl loglll1.append @byeqnll1.append resid = y - beta(2) - beta(1)*sig2 - beta(3)*sig2*y(-1)- beta(4)*y(-1)ll1.append sig2 = alpha(1)+ alpha(2)*resid(-1)^2 + alpha(3)*sig2(-1) + thresh(1)*resid(-1)^2*(resid(-1)<0)ll1.append z = resid/@sqrt(sig2)ll1.append logl = log(@dged(z,dof(1))) - log(sig2)/2' estimate and display resultssmpl s1ll1.ml(showopts, m=1000, c=1e-5)show ll1.output'store coefficients   colplace(coefmat,eq1.@coefs,!j)   colplace(tmat,eq1.@coefs,!j)nextshow coefmat`

arga
Posts: 2
Joined: Wed Mar 18, 2015 9:54 am

### Re: GARCH- rolling regressions

Hi,
I´m trying to do a rolling regression with fix window of 500 observations, and obtain the one step ahead vol. forecasts of an APARCH model whoever I get an error.

Can you help me with this problem?

mode quiet
'declare series to store the output
series rf
series volf

'set window size
!window = 500

'set step size
!step = 1

'get size of workfile
!length = @obsrange

'declare equation for estimation
equation eq1

'calculate number of rolls
!nrolls = @floor((!length-!window)/!step)

'matrix to store coefficient estimates
matrix(5,!nrolls) coef1

'catching start and end points
%start = r.@first
%end = r.@last

'variable keeping track of how many rolls we have done
!j=0

'move sample !step pbs at a time
for !i = 1 to !length-!window+1-!step step !step
!j=!j+1
'set sample for estimation period
%first = @otod(@dtoo(%start)+!i-1)
%last = @otod(@dtoo(%start)+!i+!window-2)
smpl {%first} {%last}

'estimate equation
eq1.arch(1, 1, parch, asy=1 ) r

'store coefficients
colplace(coef1,eq1.@coefs,!j)

%1pers = @otod(@dtoo(%start)+!i+!window-1)

'set smpl for forecasting period
smpl {%1pers} {%1pers}

'forecast with command forecast
eq1.forecast(f=na) pf stdevf garchf

'store forecasts
rf(@dtoo(%1pers)) = pf(@dtoo(%1pers))
volf(@dtoo(%1pers)) = garchf(@dtoo(%1pers))

statusline !i of !nrolls
next

smpl @all
show coef1
show rf.line
show volf.line

d(noerr) pf
d(noerr) stdevf
Attachments
error.dot
r serie.WF1

HJ123
Posts: 3
Joined: Sat Oct 08, 2016 9:17 am

### Re: GARCH- rolling regressions

Hey there,

I want to run a rolling regression for a GARCH(1,1), mean equation being an ARMA-Process. I use monthly data on US CPI from 1973.01 - 2015.12. I'm using EViews 9.5 Student Version. I executed following codes in chronological order:

'declare series to store the output
series rf
series volf

'set window size
!window = 500

'set step size
!step = 1

'get size of workfile
!length = @obsrange

'declare equation for estimation
equation eq1

'calculate number of rolls
!nrolls = @floor((!length-!window)/!step)

Everytime I want to execute the code for "calculate number of rolls" the error message "!STEP is not defined" pops up. When I execute "!step = 1", EViews tells me !STEP successfully computed, but the error message "!STEP is not defined" keeps popping up when I want to calculate the number of rolls. What am I doing wrong? Thanks for the help!