Volatilité et moyennes mobiles

Transcription

Volatilité et moyennes mobiles
Volatilité et moyennes mobiles
Daniel Herlemont
15 juin 2011
Table des matières
1 Volatilité RiskMetrics
1
2 Moyennes mobiles R
2
3 Lissage optimal
7
4 Adéquation de la prédiction
8
5 Moyenne Mobile d’un estimateur utilisant les plus hauts et plus bas
8
1
Volatilité RiskMetrics
L’objectif de ce TP est de tester l’estimateur de moyenne mobile exponentielle pondérée
(EWMA - pour Exponential Weighted Moving Average). Il s’agit de l’estimateur utilisé par
RiskMetrics de JP Morgan [?].
L’estimateur de moyenne mobile exponentielle pondérée est défini par :
2
σ̂t2 = λσ̂t−1
+ (1 − λ)rt2
σ̂t2 est un estimateur de l’espérance des rendements au carré du lendemain.
λ est un facteur de lissage < 1.
Pour s’en rendre compte, il suffit de développer termes en σt2i :
2
2
σ̂t2 = λ(λσ̂t−2
+ (1 − λ)rt−1
) + (1 − λ)rt2
2
2
= (1 − λ)(rt2 + λrt−1
) + λ2 σ̂t−2
2
2
= (1 − λ)(rt2 + ... + λn rt−n
)) + λn+1 σ̂t−(n+1)
1
(1)
(2)
(3)
2 MOYENNES MOBILES R
On voit donc que σ̂t2 est aussi une moyenne des rendements au carré, les poids allant décroissant de manière géométrique de facteur λ
Plus λ est proche de 1 et plus cet estimateur affecte un faible poids aux rendements
récents et plus la courbe est lisse. 99.9% de l’information est contenue dans les deniers
log(0.001)/ log(λ) jours. Par exemple, pour λ = 0.94, 99.9% de l’information est contenue
dans les derniers 112 jours. Pour λ = 0.97, 99.9% de l’information est contenue dans les
derniers 227 jours.
Riskmetrics recommande d’utiliser λ = 0.94 pour des données journalières, pour une
prévision à 1 jour et λ = 0.97 pour des prévisions mensuelles.
On utilisera les cours du CAC40, disponibles à l’adresse suivante : http://www.yats.
com/downloads/^FCHI.csv, issus d’un téléchargement YAHOO que l’on pourra charger en
utilisant :
cac=rev(read.csv("^FCHI.csv")
>
>
>
>
>
2
closes = cac[, "Close"]
opens = cac[, "Open"]
highs = cac[, "High"]
lows = cac[, "Low"]
r = diff(log(closes))
Moyennes mobiles R
On pourra utiliser les fonctions suivantes :
>
+
+
+
+
+
>
+
+
+
+
+
ema = function(x, lambda) {
y = x[1]
for (i in 2:length(x)) y[i] = lambda * y[i - 1] + (1 - lambda) *
x[i]
return(y)
}
ma = function(x, lag) {
y = rep(0, length(x))
for (i in lag:length(x)) y[i] = mean(x[(i - lag + 1):i])
y[1:(lag - 1)] = y[lag]
return(y)
}
Daniel Herlemont
2
2 MOYENNES MOBILES R
En pratique, on constate (graphiquement) très peu de différence entre une moyenne mobile
exponentielle et une moyenne mobile arithmétique pour
lag =
2
2
− 1 ou λ = 1 −
1−λ
lag + 1
Par exemple une moyenne mobile exponentielle avec λ = 0.96 correspondra à une moyenne
mobile arithmétique avec un lag = 32 jours.
Exemple : pour afficher une moyenne mobile exponentielle des prix du CAC40, on pourra
utiliser les fonctions suivantes :
> ind = (length(closes) - 250):length(closes)
> matplot(cbind(closes, ma(closes, 20), ema(closes, 0.94), ema(closes,
+
0.97))[ind, ], type = "l", col = 1:4, lty = 1:4, main = "Moyennes mobiles CAC40",
+
xlab = "date", ylab = "prix")
> legend(0, max(closes[ind]), c("CAC40", "MA20", "EMA 0.94", "EMA 0.97"),
+
cex = 0.8, col = 1:4, lty = 1:4)
Daniel Herlemont
3
2 MOYENNES MOBILES R
2100
Moyennes mobiles CAC40
1800
1500
1600
1700
prix
1900
2000
CAC40
MA20
EMA 0.94
EMA 0.97
0
50
100
150
200
250
date
On constate que la moyenne mobile avec λ = 0.97 lisse plus les cours que la moyenne
mobile avec λ = 0.94
Pour la volatilité, on pourra utiliser les fonctions suivantes :
>
+
+
>
+
+
>
historicalVariance = function(r, lag = 30) {
ma(r^2, lag)
}
emaVariance = function(r, lambda = 0.94) {
ema(r^2, lambda)
}
rogersSatchellVariance = function(opens, highs, lows, closes,
Daniel Herlemont
4
2 MOYENNES MOBILES R
+
+
+
+
+
+
+
+
>
+
+
+
>
+
+
+
+
+
+
+
>
>
>
+
>
>
+
>
lag = 10) {
h = log(highs)
l = log(lows)
o = log(opens)
c = log(closes)
x = (h - o) * (h - c) + (l - o) * (l - c)
ma(x, lag)
}
parkinsonVariance = function(highs, lows, lag = 10) {
x = (log(highs) - log(lows))^2/(4 * log(2))
ma(x, lag)
}
garmanKlassVariance = function(opens, highs, lows, closes, lag = 10) {
u = log(highs) - log(opens)
d = log(lows) - log(opens)
c = log(closes) - log(opens)
x = 0.511 * (u - d)^2 - 0.019 * (c * (u + d) - 2 * u * d) 0.383 * c^2
ma(x, lag)
}
v0 = sqrt(historicalVariance(r) * 252)
v1 = sqrt(emaVariance(r) * 252)
v2 = sqrt(rogersSatchellVariance(opens, highs, lows, closes)[-1] *
252)
v3 = sqrt(parkinsonVariance(highs, lows, 20)[-1] * 252)
v4 = sqrt(garmanKlassVariance(opens, highs, lows, closes)[-1] *
252)
mat = cbind(v0, v1, v2, v3, v4)
> matplot(mat, type = "l", ylab = "volatility", lwd = 2, lty = 1)
> legend(0, max(mat), c("historical", "Riskmetrics", "Roger Satchell",
+
"Parkinson", "Garman Klass"), lty = 1, col = 1:4, lwd = 2)
Daniel Herlemont
5
0.8
2 MOYENNES MOBILES R
0.4
0.0
0.2
volatility
0.6
historical
Riskmetrics
Roger Satchell
Parkinson
Garman Klass
0
1000
2000
3000
4000
5000
> mat.end = mat[(nrow(mat) - 200):nrow(mat), ]
> matplot(mat.end, type = "l", , ylab = "volatility", lty = 1,
+
lwd = 1)
> legend(0, max(mat.end), c("historical", "Riskmetrics", "Roger Satchell",
+
"Parkinson", "Garman Klass"), lty = 1, col = 1:6, lwd = 2,
+
cex = 0.8)
Daniel Herlemont
6
0.40
3 LISSAGE OPTIMAL
0.25
0.20
0.05
0.10
0.15
volatility
0.30
0.35
historical
Riskmetrics
Roger Satchell
Parkinson
Garman Klass
0
3
50
100
150
200
Lissage optimal
Un modèle de volatilité est supposé être un ”bon prédicteur” de la volatilité future. Dans
l’expression de la volatilité RiskMetrics, le paramètre λ doit donc être déterminer de manière
à minimiser les erreurs de prédiction. L’erreur de prédiction est déterminée par l’erreur
quadratique moyenne :
T −1
1X 2
ERQM (λ) =
(r − σt2 (λ))2
T t=t t+1
0
avec t0 = 200 par exemple, car les premières valeur de σt ne sont pas ”fiables”.
Daniel Herlemont
7
5 MOYENNE MOBILE D’UN ESTIMATEUR UTILISANT LES PLUS HAUTS ET
PLUS BAS
En supposant que les rendements sont de moyenne proche de zéro, le meilleur λ est donc
celui qui minimise cette erreur quadratique moyenne.
Il s’agit de la méthode utilisée par RiskMetrics qui a conduit à définir λ = 0.94. Cependant, il ne s’agit ici que d’une moyenne sur plusieurs actifs, la valeur optimale peut dépendre
des actifs. Le but ici sera de rechercher la valeur optimale de λ pour le CAC40.
Pour cela on utilisera la fonction optimize de R.
On pourra également utiliser un critère de quasi maximum de vraisemblance, en écrivant
que les rendements à la date t sont distribués selon une loi normale de moyenne nulle et de
variance σt2 . On cherchera donc λ qui maximise :
L(λ) =
T
−1
Y
t=t0
2
rt+1
p
exp(− 2 )
σt (λ)
2πσt2 (λ)
1
ce qui revient a maximiser (ne prenant e logarithme) :
l(λ) =
T
X
− ln(σt2 (λ)) −
t=t0
2
rt+1
σt2 (λ)
Comparer les résultats obtenus avec la méthode précédente.
4
Adéquation de la prédiction
Une autre façon de tester la qualité de la prédiction de la volatilité consiste à effectuer une
régression du r2 réalisé en fonction de sa valeur prévue σ̂ 2 :a
2
rt+1
= α + βσt2 + t
ˆ Effectuer cette régression en utilisant la fonction lm et summary.
ˆ Quelle est la valeur du R2
ˆ Commentaires ?
5
Moyenne Mobile d’un estimateur utilisant les plus
hauts et plus bas
Appliquer les mêmes procédures en utilisant l’estimateur de Garaman Klass, par exemple.
Pour le lissage optimal, on comparera la variance estimée à la date t au rendement au
carré normalisé au cours d’ouveture : r = log(close) − log(open)
Daniel Herlemont
8

Documents pareils