[R-SIG-Finance] rugarch VaR calculation "manually"

Neuman Co neumancohu at gmail.com
Wed May 8 10:42:21 CEST 2013


The data I am working with can be found here:
http://uploadeasy.net/upload/2fvhy.rar

I fitted the following model:
alvnomodel<-ugarchspec(variance.model = list(model = "sGARCH",
garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0), include.mean = FALSE),
distribution.model = "norm")

alvnomodelgarch<-ugarchfit(spec=alvnomodel,data=alvlloss)

Now I want to get the one-day ahead forecasts of the cond. volatility
and the cond. mean. I try to applay ugrachforecast:

ugarchforecast(alvnomodelgarch, n.ahead = 1,out.sample=50,n.roll=10)

But I get the error message:
ugarchforecast-->error: n.roll must not be greater than out.sample!

What is wrong?

Also I don't know what values I should take for out.sample and n.roll?
I just want to get 1 day ahead forecasts. What values do I need to
insert?

2013/5/7 alexios ghalanos <alexios at 4dscape.com>:
> Applying 'sigma' (conditional volatility) and 'fitted' (conditional mean)
> METHODS on a uGARCHforecast object will return the forecast values of those
> quantities with appropriately labelled dates (the T+0 time). This too is
> documented in the help files, and there was also a blog post about this
> ('Whats new in rugarch (ver 1.01-5)').
>
> For VaR, as I already mentioned, you can use the 'quantile' method on
> any of the returned S4 class objects.
>
> -Alexios
>
>
> On 07/05/2013 12:51, Neuman Co wrote:
>>
>> thanks a lot for your help, but
>> "Use the 'sigma' and 'fitted' methods"
>>
>> But these are the fitted values for the volatility and the final
>> fitted values. But to calculate the VaR I need the 1 step ahead
>> forecast of the cond. sigmas and the 1 step ahead forecast of the
>> cond. mean. The cond.mean is not equivalent to the fitted values? And
>> the fitted values are not one step ahead forecasts?
>>
>> 2013/5/7 alexios ghalanos <alexios at 4dscape.com>:
>>>
>>> Hello,
>>>
>>>
>>> On 07/05/2013 12:15, Neuman Co wrote:
>>>>
>>>>
>>>> I am using the rugarch package in R and I have some questions:
>>>>
>>>> I want to use the rugarch package to calculate the VaR.
>>>>
>>>> I used the following code to to fit a certain model:
>>>>
>>>> spec2<-ugarchspec(variance.model = list(model = "sGARCH", garchOrder =
>>>> c(1, 1)),
>>>> mean.model = list(armaOrder = c(5, 5), include.mean = FALSE),
>>>> distribution.model =
>>>> "norm",fixed.pars=list(ar1=0,ar2=0,ar3=0,ma1=0,ma2=0,ma3=0))
>>>>
>>>> model2<-ugarchfit(spec=spec2,data=mydata)
>>>>
>>>> Now I can look at the 2.5 % VaR with the following command:
>>>> plot(model)
>>>>
>>>> and choosing the second plot.
>>>>
>>>> Now my first question is: How can I get the 1.0% VaR VALUES, so not
>>>> the plot, but
>>>> the values/numbers?
>>>
>>>
>>> Use the 'quantile' method i.e. 'quantile(model2, 0.01)'...also applies to
>>> uGARCHforecast, uGARCHsim etc It IS documented.
>>>
>>>>
>>>> In case of the normal distribution, one can easily do the calculation of
>>>> the VaR with using the forecasted conditional volatility and the
>>>> forecasted
>>>> conditional mean:
>>>>
>>>> I use the ugarchforecast command and with that I can get the cond.
>>>> volatility
>>>> and cond. mean (my mean equation is an modified ARMA(5,5), see above in
>>>> the spec
>>>> command):
>>>>
>>>> forecast = ugarchforecast(spec, data, n.roll = , n.ahead = ,
>>>> out.sample=)
>>>>
>>>> # conditional mean
>>>> cmu = as.numeric(as.data.frame(forecast, which = "series",
>>>> rollframe="all", aligned = FALSE))
>>>> # conditional sigma
>>>> csigma = as.numeric(as.data.frame(forecast, which = "sigma",
>>>> rollframe="all", aligned = FALSE))
>>>>
>>> NO. 'as.data.frame' has long been deprecated. Use the 'sigma' and
>>> 'fitted'
>>> methods (and make sure you upgrade to latest version of rugarch).
>>>
>>>
>>>> I can calculate the VaR by using the property, that the normal
>>>> distribution
>>>> is part of the location-scale distribution families
>>>>
>>>> # use location+scaling transformation property of normal distribution:
>>>> VaR = qnorm(0.01)*csigma + cmu
>>>>
>>>> My second question belongs to the n.roll and out.sample command. I had
>>>> a look at the
>>>> description
>>>> http://www.inside-r.org/packages/cran/rugarch/docs/ugarchforecast
>>>> but I did not understand the n.roll and out.sample command. I want to
>>>> calculate the
>>>> daily VaR, so I need one step ahead predicitons and I do not want to
>>>> reestimate
>>>> the model every time step. So what does it mean "to roll the forecast
>>>> 1 step " and
>>>> what is out.sample?
>>>
>>>
>>> out.sample, which is used in the estimation stage retains 'out.sample'
>>> data
>>> (i.e. they are not used in the estimation) so that a rolling forecast can
>>> then be performed using this data. 'Rolling' means using data at time T-p
>>> (p=lag) to create a conditional 1-ahead forecast at time T. For the
>>> ugarchforecast method, this means using only estimates of the parameters
>>> from length(data)-out.sample. There is no re-estimation taking place
>>> (this
>>> is only done in the ugarchroll method).
>>> For n.ahead>1, this becomes an unconditional forecast. Equivalently, you
>>> can
>>> append new data to your old dataset and use the ugarchfilter method.
>>>
>>>>
>>>> My third question(s) is (are): How to calculate the VaR in case of a
>>>> standardized
>>>> hyperbolic distribution? Can I still calculate it like in the normal
>>>> case
>>>> or does it not work anymore (I am not sure, if the sdhyp belongs to the
>>>> location-scale family).
>>>>
>>>> Even if it does work (so if the sdhyp belongs to the family of
>>>> location-scale distributions) how do I calculate it in case of a
>>>> distribution, which does not belong to the location-scale family?
>>>> (I mean, if I cannot calculate it via VaR = uncmean + sigma* z_alpha how
>>>> do I have to calculate it). Which distribution implemented in the
>>>> rugarch
>>>> package does not belong to the location-scale family?
>>>>
>>> ALL distributions in the rugarch package are represented in a location-
>>> and
>>> scale- invariant parameterization since this is a key property required
>>> in
>>> working with the standardized residuals in the density function (i.e. the
>>> subtraction of the mean and scaling by the volatility).
>>> The standardized Generalized Hyperbolic distribution does indeed have
>>> this
>>> property, and details are available in the vignette. See also paper by
>>> Blaesild (http://biomet.oxfordjournals.org/content/68/1/251.short) for
>>> the
>>> linear transformation (aX+b) property.
>>>
>>> If working with the standard (NOT standardized) version of the GH
>>> distribution (\lambda, \alpha, \beta, \delta, \mu) you need to apply the
>>> location/scaling transformation as the example below shows which is
>>> equivalent to just using the location/scaling transformation in the
>>> standardized version:
>>> #################################################
>>> library(rugarch)
>>> # zeta = shape
>>> zeta = 0.4
>>> # rho = skew
>>> rho = 0.9
>>> # lambda = GIG mixing distribution shape parameter
>>> lambda=-1
>>> # POSITIVE scaling factor (sigma is in any always positive)
>>> # mean
>>> scaling = 0.02
>>> # sigma
>>> location = 0.001
>>>
>>> # standardized transformation based on (0,1,\rho,\zeta)
>>> # parameterization:
>>> x1 = scaling*qdist("ghyp", seq(0.001, 0.5, length.out=100), shape = zeta,
>>> skew = rho, lambda = lambda)+location
>>> # Equivalent to standard transformation:
>>> # First obtain the standard parameters (which have a mean of zero
>>> # and sigma of 1).
>>> parms = rugarch:::.paramGH(zeta, rho, lambda)
>>> x2 = rugarch:::.qgh( seq(0.001, 0.5, length.out=100), alpha =
>>> parms[1]/abs(scaling), beta = parms[2]/abs(scaling),
>>> delta=abs(scaling)*parms[3], mu = (scaling)*parms[4]+location, lambda =
>>> lambda)
>>> all.equal(x1, x2)
>>> # Notice the approximation error in the calculation of the quantile for #
>>> which there is no closed form solution (and rugarch uses a tolerance
>>> # value of .Machine$double.eps^0.25)
>>> # Load the GeneralizedHyperbolic package of Scott to adjust the
>>> # tolerance:
>>> library(GeneralizedHyperbolic)
>>>
>>> x1 = location+scaling*qghyp(seq(0.001, 0.5, length.out=100), mu =
>>> parms[4],
>>> delta = parms[3], alpha =  parms[1], beta = parms[2], lambda = lambda,
>>> lower.tail = TRUE, method = c("spline", "integrate")[2], nInterpol = 501,
>>> subdivisions = 500, uniTol = 2e-12)
>>> # equivalent to:
>>> x2 = qghyp(seq(0.001, 0.5, length.out=100), mu =
>>> (scaling)*parms[4]+location, delta = abs(scaling)*parms[3], alpha =
>>> parms[1]/abs(scaling), beta = parms[2]/abs(scaling), lambda = lambda,
>>> lower.tail = TRUE, method = c("spline", "integrate")[2], nInterpol = 501,
>>> subdivisions = 500, uniTol = 2e-12)
>>>
>>> all.equal(x1, x2)
>>> #################################################
>>>
>>>
>>>
>>>> Thanks a lot for your help!
>>>>
>>>
>>> Regards,
>>>
>>> Alexios
>>>>
>>>>
>>>> _______________________________________________
>>>> 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