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

alexios ghalanos alexios at 4dscape.com
Tue May 7 13:58:49 CEST 2013


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