[R-SIG-Finance] student t mixture VaR in R // imitate example 2.23 in C.Alexander: Market Risk IV
Johannes Moser
jzmoser at gmail.com
Mon Apr 28 22:51:35 CEST 2014
A final remark with respect to the expected shortfall:
The formula (p.133 IV.2.90) in the book of Alexander is not right either.
There are some helping analytical formulas for the ES in a book of
Cizek, Härdle and Weron (2011): "Statistical Tools for Finance and
Insurance". They are helping at least once one finds out (the notation
is a mess!) that in this book "c" and "\sigma" BOTH denote the scaling
factor of the student t distribution (p.60f. and p.73) and NOT the
standard deviation.
The following syntax works fine (as to my best knowledge):
#############################################################################
# VaR and ES for bivariate student t mixtures
# arbitrary values for the two component Student t distributions:
p_quiet <- 0.9 # mixing law
mu_quiet <- 0.5 # first mean
mu_stress <- -0.3 # second mean
df_quiet <- 25 # first degrees of freedom
df_stress <- 3 # second degrees of freedom
variance_quiet <- 0.0285^2 # first variance
variance_stress <- 1^2 # second variance
theta <- 0.01 # coverage of VaR and ES (the
latter being called "Expected Tail Loss" in C.Alexander)
#############################################################################
# VaR
find_quant <- function(quant) {
(p_quiet*pt(
(quant-mu_quiet)/sqrt(variance_quiet)*sqrt(df_quiet/(df_quiet-2)) , df
= df_quiet)
+ (1-p_quiet)*pt(
(quant-mu_stress)/sqrt(variance_stress)*sqrt(df_stress/(df_stress-2)) ,
df = df_stress) - theta)
}
t_mix_VaR <- -uniroot(f = find_quant, interval = c(-5, 1),
maxiter=10000, tol = 1e-12)$root
#############################################################################
# ES
scale_quiet <- sqrt( variance_quiet ) * sqrt( (df_quiet-2)/df_quiet )
scale_stress <- sqrt( variance_stress ) * sqrt( (df_stress-2)/df_stress )
c_quiet <- (-t_mix_VaR-mu_quiet)/scale_quiet
c_stress <- (-t_mix_VaR-mu_stress)/scale_stress
Ttail_quiet <- dt( c_quiet ,df=df_quiet ) * (df_quiet+ c_quiet^2) /
(df_quiet-1)
Ttail_stress <- dt( c_stress ,df=df_stress ) * (df_stress+ c_stress^2) /
(df_stress-1)
t_mix_ETL <- ( 1/theta*( p_quiet*( scale_quiet*Ttail_quiet -
mu_quiet*pt(c_quiet , df=df_quiet ) )
+ (1-p_quiet)*( scale_stress*Ttail_stress -
mu_stress*pt(c_stress , df=df_stress ) ) ) )
### Results
t_mix_VaR
t_mix_ETL
#############################################################################
Am 4/27/2014 2:07 PM, schrieb Johannes Moser:
> Finally things are clear. R users who want to work with a Student t
> mixture distribution in the context of Value at Risk or Expected
> Shortfall can feel safe to use an implementation similar to the one
> given below (in an older mail of mine), but choosing "std" instead of
> "sstd" when using the "rugarch" package or alternatively applying the
> function "pTF2" when using the "gamlss.dist" package.
>
> The following corrections will be interesting mainly for people who
> work with the book (Market Risk Analysis IV - first edition printed in
> 2009) of C.Alexander.
>
> The implementation of the objective function (details were given earlier)
> L * P(X < (q-m)/r) + (1-L) * P(Y < (q-n)/s) - theta = 0
> by C.Alexander is wrong, both in theory (see p. 117) and practice (see
> e.g. the Excel Example IV.2.23 on the CD).
>
> TDIST(-(-C25-D8)/D10*SQRT(C22/(C22-2)),C22,1)
>
> would be the correct transformation of the random variable to be
> Student t with variance C22/(C22-2), which is the variance of a
> standard Student t (NOT a STANDARDIZED one!) random variable with
> degrees of freedom "C22" - given that "C22" > 2 of course.
> This is because Excel has only the standard Student t distribution
> implemented (in a quite cumbersome form).
>
> (Remark: In this example "C25" is the desired quantile, "D8" is the
> mean of the respective Student t and "D10" is its standard deviation.)
>
> The implementation given in the spreadsheets which can be found on the
> CD contained in the book is however
>
> SQRT(C22/(C22-2))*TDIST(-(-C25-D8)/D10,C22,1)
>
> Which makes the same mistake as the footnote on page 117:
> "In general, if X has distribution F(x) and Y=aX, a being a constant,
> then y has distribution function a^(−1) * F(x)"
>
> I want to thank Alexios for his support in clearifying things!
> Best,
> Johannes
>
>
>
>
>
> Am 25.04.2014 15:17, schrieb Johannes Moser:
>> Thanks for your help so far, Alexios!
>>
>> I didn`t want to write down all the datails of the exercise because
>> my text alredy was lengthly and also because I didn`t want to violate
>> any copyrights.
>> Rather, I was hoping that someone has the book and the CD at hand
>> because I think that the book is pretty popular.
>>
>> To answer your question: The EXCEL example from the book was adapted
>> by me in the following way:
>>
>> 1) change the risk horizon to 1 day (so that there would be no scaling
>> and the autocorrelation doesn`t matter)
>> 2) if necessary change the significance level (1% or 0,1% in my example)
>>
>> this has already been stated in my first mail. So the numbers for for
>> mu_stress, variance_quiet and variance_stress are the (annualized)
>> numbers given in the example scaled to one day.
>> I just did copy and paste with the down-scaled numbers from the EXCEL
>> spreadsheet to check if my own R syntax leads to the same results as
>> the EXCEL setup given by the CD in the book of C.Alexander.
>>
>> A general description of my approach might be given by the following
>> sketch:
>> Calculate 1-day VaR with confidence level 99% (and 99,9%) of a
>> bivariate student t mixture distribution by means of backing out the
>> quantile from the formula
>> L * P(X < (q-m)/r) + (1-L) * P(Y < (q-n)/s) = theta
>> (see C.Alexander p.113)
>> (the VaR is just minus the 1% or 0.1% quantile "q")
>> "L" is the mixing law giving the probability for the mixture random
>> variable to follow the same student-t distribution as the random
>> variable "X" with mean "m", standard deviation "r" and degrees of
>> freedom "df1".
>> The mixture random variable follows a student t distribution with
>> mean "n", standard deviation "s" and degrees of freedom "df2" with
>> probability "(1-L)". This is the distribution for the random variable
>> "Y".
>> "q" ist the required "theta"-quantile (as pointed out, "theta" is set
>> to 0.01 and 0.001 in my example)
>>
>> The notation in my R code is:
>>
>> p_quiet = L
>> mu_quiet = m
>> mu_stress = n
>> df_quiet = df1
>> df_stress = df2
>> variance_quiet = r^2
>> variance_stress = s^2
>> theta = theta
>>
>> I hope that with these details everyone can evaluate if my syntax is
>> set up correctly.
>> The values for these variables as to the modified example from
>> Alexanders book can be read in the R syntax given in my first mail.
>>
>> My aim (later!) is to simulate a fictive return series in a
>> regime-switching manner using student t mixture models and calculate
>> the analytical VaR and Expected Shortfall in a dynamical way.
>> Then I want to apply several other estimation techniques to the
>> simulated mixture series and examine their performance in relation to
>> the analytic results.
>> But first I have to make sure that my analytic VaR for the student t
>> mixture model is correct.
>> However, verification of the Example given by C.Alexander indeed
>> requires her book and the enclosed CD with the EXCEL workbooks.
>> I just can`t post all this stuff here.
>>
>>
>>
>>
>> Am 25.04.2014 14:15, schrieb alexios ghalanos:
>>> I suggest you take a break and consider that in order to help you,
>>> it is
>>> required that you state ALL the assumptions and provide a complete
>>> example. Since the book is not generally available, and you have
>>> told us
>>> very little about the problem and its assumptions (other than a page
>>> and
>>> example number), then you shouldn't expect much help.
>>>
>>> Alexios
>>>
>>> PS How did you come up with the numbers for mu_stress, variance_quiet
>>> and variance_stress? From what I am told, the book example provides the
>>> annualized values and you are required to calculate the 10-day VaR (so
>>> you are required to rescale the numbers to their 10-day equivalents).
>>>
>>> On 25/04/2014 11:23, Johannes Moser wrote:
>>>> Thanks a lot, Alexios!
>>>> I have corrected this issue. The result is the same, though.
>>>>
>>>> I forgot to mention that the RUGARCH-package is required to run the
>>>> code.
>>>>
>>>> At the moment I try to find the error in either
>>>> - my own theoretical thoughts (e.g. confusing the scale parameter with
>>>> the standard deviation)
>>>> - the implementation made by C.Alexander (on page 117 she writes in a
>>>> footnote: "In general, if X has distribution F(x) and Y=aX, a being a
>>>> constant, then y has distribution function a^(−1) * F(x)". Either I am
>>>> completely burnout right now, or this must be "F(a^(−1)*x)" in the
>>>> end.
>>>> So maybe this is not just a typo, but also incorrectly implemented in
>>>> the quite complicated EXCEL formula.)
>>>> - some EXCEL or R issue. I think her EXCEL syntax has been
>>>> programmed in
>>>> version 2003, but I`m running 2010.
>>>>
>>>> Any help is appreciated a lot!
>>>>
>>>>
>>>>
>>>> Am 25.04.2014 11:46, schrieb Alexios Ghalanos:
>>>>> A quick look at your code suggests that you should use "std"
>>>>> (student)
>>>>> not "sstd" (skew student) for distribution.
>>>>>
>>>>> Alexios
>>>>>
>>>>>> On 25 Apr 2014, at 09:49, Johannes Moser <jzmoser at gmail.com> wrote:
>>>>>>
>>>>>> Dear R community,
>>>>>>
>>>>>> in trying to set up a little simulation study I adapt the ideas
>>>>>> found in
>>>>>> "Carol Alexander: Market Risk IV - Value at Risk Models" on page
>>>>>> 111 ff.
>>>>>> and implement them in R.
>>>>>> This project is about student t mixture distributions and Value
>>>>>> at Risk
>>>>>> / Expected Shortfall.
>>>>>>
>>>>>> The following code is my setup so far, and the syntax is
>>>>>> calibrated to
>>>>>> resemble the Example 2.23 on page 118 in the mentioned book of
>>>>>> Alexander. There is a EXCEL-file coming with the book and I noticed
>>>>>> that my results don`t match the results of the EXCEL implementation.
>>>>>>
>>>>>> e.g. my result for theta=0.001 is
>>>>>>
>>>>>> 0.0841052 (method 1) and
>>>>>>
>>>>>> 0.0842109 (method 2)
>>>>>> ... but the EXCEL-file coming with the book says that it was 0.1152
>>>>>>
>>>>>>
>>>>>> setting theta=0.01 gives
>>>>>>
>>>>>> 0.04493586 (method 1) and
>>>>>>
>>>>>> 0.04490717 (method 2)
>>>>>>
>>>>>> ... but the EXCEL-file coming with the book says that it was 0.0616
>>>>>>
>>>>>>
>>>>>> Maybe some of you guys have this book at hand and are able to
>>>>>> verify and
>>>>>> hopefully find a solution for my worries.
>>>>>> Or even if you don`t have the book you might still be able to
>>>>>> assess the
>>>>>> correctness of my approach and implementation?
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> ##################################################################################################
>>>>>>
>>>>>>
>>>>>> # SET UP MIXTURE INGREDIENTS (calibrate to C.Alexander Market Risk
>>>>>> Analysis IV Exercise 2.23)
>>>>>>
>>>>>> p_quiet <- 0.75
>>>>>> mu_quiet <- 0.0
>>>>>> mu_stress <- -0.0004
>>>>>> df_quiet <- 10
>>>>>> df_stress <- 5
>>>>>> variance_quiet <- 0.0126^2
>>>>>> variance_stress <- 0.0253^2
>>>>>> theta <- 0.001
>>>>>>
>>>>>>
>>>>>> # METHOD_1) Backing out mixture VaR from implicit analytic
>>>>>> formula:
>>>>>> find_quant <- function(quant) {
>>>>>> (p_quiet*pdist(distribution = "sstd",
>>>>>> (quant-mu_quiet)/sqrt(variance_quiet) , mu = 0, sigma = 1, shape =
>>>>>> df_quiet)
>>>>>> + (1-p_quiet)*pdist(distribution = "sstd",
>>>>>> (quant-mu_stress)/sqrt(variance_stress) , mu = 0, sigma = 1,
>>>>>> shape =
>>>>>> df_stress) - theta)
>>>>>> }
>>>>>> bestquant <- uniroot(f = find_quant, interval = c(-5, 1))
>>>>>> t_mix_VaR1 <- -bestquant$root
>>>>>>
>>>>>>
>>>>>> # METHOD_2) Estimating mixture VaR by simulation:
>>>>>> nsim <- 10000000
>>>>>> u_mix <- x <- 1*(runif(nsim) < p_quiet)
>>>>>> t_quiet <- rdist(distribution = "sstd", nsim , mu = mu_quiet,
>>>>>> sigma =
>>>>>> sqrt(variance_quiet), shape = df_quiet)
>>>>>> t_stress <- rdist(distribution = "sstd", nsim , mu = mu_stress,
>>>>>> sigma =
>>>>>> sqrt(variance_stress), shape = df_stress)
>>>>>> t_mixture <- u_mix*t_quiet + (1-u_mix)*t_stress
>>>>>> t_mix_VaR2 <- as.numeric(-quantile( t_mixture , probs=theta ))
>>>>>>
>>>>>> # Compare results
>>>>>> t_mix_VaR1
>>>>>> t_mix_VaR2
>>>>>> ##################################################################################################
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> The EXCEL spreadsheet "EX_IV.2.23" in the workbook
>>>>>> "Examples_IV.2.xls"
>>>>>> has been used and modified as follows:
>>>>>> 1) change the risk horizon to 1 day (so that there would be no
>>>>>> scaling
>>>>>> and the autocorrelation doesn`t matter)
>>>>>> 2) if necessary change the significance level (1% or 0,1% in my
>>>>>> example)
>>>>>> 3) press F11 to recalcualte the mixture parameters over the risk
>>>>>> horizon
>>>>>> 4) apply EXCEL SOLVER to line C24 while allowing for changing
>>>>>> cell C25
>>>>>> to get the t Mixture VaR
>>>>>>
>>>>>> Thanks a lot for any ideas or suggestions!
>>>>>> Johannes
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>> [[alternative HTML version deleted]]
>>>>>>
>>>>>> _______________________________________________
>>>>>> 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