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