[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