Conclusion
D'après toutes les simulations qui ont
étéréalisées, il s'est avéréque :
>Pour un skewness non significativement différent de 0 (i.e. = 0), et
un kurtosis compris entre [3 : 4.2], la VaR Normale est adaptée.
Ce résultat a
étédémontrédans toutes les simulations de lois qui
respectent ces critères. Par ailleurs, dès que le skewness est
différent de 0, la VaR Normale devient très sensible et semble
inadaptée dans les simulations Monte-Carlo.
>La loi d'extremum généralisée semble
échapée à cette règle, la 1 ère simulation
de cette loi est sans doute biaisée. Il aurait fallu faire une
simulation d'un nombre assez grand (>15) ou essayer de trouver d'autres
alternatives.
>Pour un skewness 0.05 et un kurtosis 5.7, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Pour un skewness -1.3 et un kurtosis 5, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Pour un skewness 0.5 et un kurtosis 3.2, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Pour un skewness -0.16 et un kurtosis 3, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Pour un skewness 0.1 et un kurtosis 6.4, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Pour un skewness -0.04 et un kurtosis 3.14, la VaR de
Cornish-Fisher est préférable à la VaR Normale.
>Etant donnéque c'est des simulations Monte-Carlo,
il aurait étémieux de faire 99 simulations mais
celàprendrait beaucoup de temps et il faudrait des machines très
performantes pour mettre celàen oeuvre.
54
55
Bibliographie
[1] Hurlin C. et Tokpavi S. (2008), Une Evaluation des
Procédures de Backtesting : Tout va pour le Mieux dans le Meilleur des
Mondes», Finance, vol 29.
[2] Méthodes de Monte-Carlo avec R, Livre de Christian
Robert et George Casella
[3] www.cairn.info/revue-economique-2007-3-page-599.htm
[4] Les méthodes du bootstrap dans les modèles de
régression, Emmanuel Flachaire
[5] Approximation de Cornish-Fisher, wikipedia
[6] www.ressources-actuarielles.net/
[7] Christophe Hurlin, Site Value-at-Risk
for(k in 1:N) {
ANNEXE
Code R
# load libraries library(PerformanceAnalytics) library(quantmod)
library(rugarch) library(car)
library(FinTS)
library(GeneralizedHyperbolic) library(sn)
library(evd)
library(fGarch) library(triangle) library(fBasics)
library(moments)
n<-10000 #nombre d'observation N<- 2 #nombre de
simulation
rt <- rnorm(n,0.01/252,0.05)
plot(rt, type = "l", col = "steelblue")
skewness(rt)
kurtosis(rt)
agostino.test(rt) anscombe.test(rt)
#Matrice de simulation Monte-Carlo
sortie<- data.frame(matrix(rep(0,4*N),N,4))
colnames(sortie) = c("Normal:Test Kupiec:uc.LRp","Normal:Test
Christoffersencc.LRp", "Modified:Test Kupiec:uc.LRp", "Modified:Test
Christoffersen:cc.LRp")
########################################################################################
#### Entrer la loi ####
########################################################################################
rt <-rskewlap(n, mu = 0.0000321, alpha = 1/23, beta = 1/22)
options(digits=4)
# convertir la simulation en time series (pour l'adapter au
backtesting) x.Date <- as.Date("2003-02-01") + c(1:10000)
ret <- zoo(rt, x.Date)
# backtesting unconditional VaR models # normal VaR, HS and
modified HS #
# set up estimation window and testing window
n.obs = length(ret)
w.e = 8000
w.t = n.obs - w.e
alpha = 0.95
# loop over testing sample, compute VaR and record hit rates
backTestVaR <- function(x, p = 0.95) {
normal.VaR = as.numeric(VaR(x, p=0.95, method="gaussian"))
modified.VaR = as.numeric(VaR(x, p=0.95, method="modified")) ans =
c(normal.VaR, modified.VaR)
names(ans) = c("Normal", "Modified")
return(ans)
}
# rolling 1-step ahead estimates of VaR
VaR.results = rollapply(as.zoo(ret), width=w.e,
FUN = backTestVaR, p=0.95, by.column = FALSE,
align = "right")
VaR.results = lag(VaR.results, k=-1)
chart.TimeSeries(merge(ret, VaR.results),
legend.loc="topright")
violations.mat = matrix(0, 2, 5)
rownames(violations.mat) = c("Normal", "Modified")
colnames(violations.mat) = c("En1", "n1", "1-alpha", "Percent",
"VR")
violations.mat[, "En1"] = (1-alpha)*w.t violations.mat[,
"1-alpha"] = 1 - alpha
# Show Normal VaR violations
normalVaR.violations = as.zoo(ret[index(VaR.results), ]) <
VaR.results[, "Normal"] violation.dates.normal =
index(normalVaR.violations[which(normalVaR.violations)])
# plot violations
plot(as.zoo(ret[index(VaR.results),]), col="blue",
ylab="Return",main="Violations normal VaR")
} sortie
abline(h=0)
lines(VaR.results[, "Normal"], col="black", lwd=2)
lines(as.zoo(ret[violation.dates.normal,]), type="p", pch=16,
col="red", lwd=2)
for(i in colnames(VaR.results)) {
VaR.violations = as.zoo(ret[index(VaR.results), ]) <
VaR.results[, i] violations.mat[i, "n1"] = sum(VaR.violations)
violations.mat[i, "Percent"] = sum(VaR.violations)/w.t
violations.mat[i, "VR"] = violations.mat[i,
"n1"]/violations.mat[i, "En1"]
}
violations.mat
VaR.test1 = VaRTest(1-alpha,
actual=coredata(ret[index(VaR.results),]),
VaR=coredata(VaR.results[,"Normal"])) names(VaR.test1)
# LR test for correct number of exceedances VaR.test1[1:7]
# LR tests for independence of exceedances VaR.test1[8:12]
# Show modified VaR violations
modifiedVaR.violations = as.zoo(ret[index(VaR.results), ]) <
VaR.results[, "Modified"] violation.dates.modified =
index(modifiedVaR.violations[which(modifiedVaR.violations)])
# plot violations
plot(as.zoo(ret[index(VaR.results),]), col="blue",
ylab="Return",main="Violations modified VaR")
abline(h=0)
lines(VaR.results[, "Modified"], col="black", lwd=2)
lines(as.zoo(ret[violation.dates.modified,]), type="p", pch=16,
col="red", lwd=2)
VaR.test2 = VaRTest(1-alpha,
actual=coredata(ret[index(VaR.results),]),
VaR=coredata(VaR.results[,"Modified"])) names(VaR.test2)
# LR test for correct number of exceedances for modified VaR
VaR.test2[1:7]
# LR tests for independence of exceedances for modified VaR
VaR.test2[8:12]
sortie[k,1]=VaR.test1[6] sortie[k,2]=VaR.test1[11]
sortie[k,3]=VaR.test2[6] sortie[k,4]=VaR.test2[11]
|