[R-SIG-Finance] estimation difference between ugarchroll and ugarchfit
alexios ghalanos
alexios at 4dscape.com
Thu May 24 01:36:17 CEST 2012
Hi Guoshi,
I've posted a fix on r-forge:
(see https://r-forge.r-project.org/projects/rgarch/).
Its version 1.0-9 revision 401, and should be available to download
once the check/build cycle completes.
Regards,
Alexios
On 24/05/2012 00:18, linpack wrote:
> Hi Alexios,
>
> Thanks a lot for your reply and also your enormous effort on the
> development of this pakage.
>
> 1. I see the reason now: I forgot to reset the specification in each
> step of the loop.
> Hope others who see this wont make such mistake anymore.
>
> 2. Really appreciate that, I guess I should just use
> myfit = ugarchfit(spec,
> logexr[(i*refit.every):(fitindx.start[i]+refit.every)], out.sample =
> refit.every, solver.control=list())
> ldpx=length(dpx)
> ugarchforecast(myfit, n.ahead=1, external.forecasts = list(mregfor =
> dpx[ ldpx], vregfor = dpx[ ldpx ]) )
> # where dpx[ldpx] is the last element of dpx which is already supplied
> to R when out.sample =1
>
> Thank you again.
>
> Best regards
> Guoshi
>
>
> At 2012-05-24 04:05:55,"alexios ghalanos" <alexios at 4dscape.com> wrote:
>>Hi Guoshi,
>>
>>1.
>>#################################
>># part of the code is straight out of the 'rugarch-rolling.R' file
>># which I suggest you take a closer look at.
>>forecast.length = 400
>>refit.every = 1
>>n.ahead = 1
>># your data size
>>T = 750
>>fwindex = t(rugarch:::.embed((T - forecast.length - n.ahead + 2):T,
>>refit.every, by = refit.every, TRUE ) )
>>fitindx.start = c(fwindex[1,]-1)
>>fwindex.end = fwindex[refit.every,]
>>nf = length(fwindex.end)
>>forecast.length = floor(forecast.length/refit.every) * refit.every
>>####################################
>>
>># Do 10 fits to convince yourself it is the same:
>>
>>lik = rep(0, 10)
>>for(i in 1:10){
>>dpx = matrix(dp[(i*refit.every):(fitindx.start[i]+refit.every)], ncol=1)
>>spec = ugarchspec(variance.model = list(model = "eGARCH", garchOrder =
>>c(1,1),
>>external.regressors =dpx ),
>>mean.model = list(armaOrder=c(0,0), include.mean = T,
>>external.regressors = dpx), distribution.model = "norm");
>>myfit = ugarchfit(spec,
>>logexr[(i*refit.every):(fitindx.start[i]+refit.every)], out.sample =
>>refit.every, solver.control=list())
>>lik[i] = likelihood(myfit)
>>}
>>
>># use your the 'uGARCHroll' object to compare:
>>all.equal(lik, test at roll$LLH[1:10])
>>[1] TRUE
>>
>>
>>2. Correct. The rolling method does not take into account the presence
>>of external regressors...most likely an omission on my part which I'll
>>look to rectify during the next release. Do keep in mind that the
>>ugarchroll method is just a convenience wrapper for fitting/forecasting
>>with the existing methods.
>>
>>
>>-Alexios
>>
>>
>>
>>On 23/05/2012 19:54, linpack wrote:
>>> Hi there,
>>>
>>> I have two questions (which might be related).
>>> I am trying to predict mean and variance of monthly stock excess return
>>> using dividend price ratio with a eGarch model.
>>>
>>> Data format is the following
>>> column 1 column 2 column 3
>>> gross S&P return gross t-bill return lagged dividend price ratio
>>> #data dimension is nrow=750 and ncolumns =3 and the "redp.dat" file is
>>> attached.
>>>
>>> code is following
>>> library(rugarch);
>>> dat=read.csv('C:\\redp.dat',header=F);
>>>
>>> logexr=log(dat$V1)-log(dat$V2); # log of gross excess return
>>> as.matrix(logexr);
>>> dp=log(dat$V3); #log of dividend price ratio
>>> as.matrix(dp);
>>>
>>> spec = ugarchspec(variance.model = li! st(model = "eGARCH", garchOrder =
>>> c(1,1), external.regressors = as.matrix(dp)),
>>> mean.model = list(armaOrder=c(0,0), include.mean = T,
>>> external.regressors = as.matrix(dp)), distribution.model = "norm");
>>> # dividend price ratio are used as external regressor in both mean and
>>> variance equation
>>>
>>> test=ugarchroll(spec, n.ahead=1, data=logexr, forecast.length=400,
>>> refit.every=1, refit.window="moving");
>>> as.data.frame(test, which='LLH')
>>> # where I did a rolling window forecast and display all the likelyhood
>>>
>>> #then I did a double check on the rolling estimation by doing
>>> for (j in 1:10) # I am justing printing the first ten loop step
>>> myfit = ugarchfit(spec, logexr[j:349+j]);
>>> likelihood(myfit)
>>> end
>>>
>>> # Question 1: the first likelihood from ugarchfit exactly equals that in
>>> ugarchroll, while the values are different from then on.
>>> # When I modify the spec to exclude any external regressor, the two sets
>>> of likelihood are then exactly the same.
>>> # reducing the forecast length (and therefore increase the length of the
>>> estimation window) seems to mitigate the estimation difference.
>>>
>>> # Question 2: I then compare the density forecast
>>> as.data.frame(test, which='density')
>>> # this seem to produce
>>> for (j in 1:10) # I am justing printing the first ten loop step
>>> ugarchforecast(myfit, n.ahead=1); # and again when the likelihood are
>>> different, the forecast is different.
>>> end
>>> # however, I am a bit confused since I thought it should produce
>>> for (j in 1:10)
>>> ugarchforecast(myfit, n.ahead=1,external.forecasts = list(mregfor =
>>> dp[350+j], vregfor = dp[350+j] ));
>>> end
>>>
>>> looking forward to your help.
>>>
>>>
>>> Guoshi
>>>
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> R-SIG-Finance at r-project.org mailing list
>>> https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>>> -- Subscriber-posting only. If you want to post, subscribe first.
>>> -- Also note that this is not the r-help list where general R questions should go.
>>
>
>
>
More information about the R-SIG-Finance
mailing list