PLAN
Liste des abreviations
Introdution
CHAPITRE 1 : Revue de litterature
1-1 Revue empirique sur la prediction de la volatilité
CHAPITRE 2 : Méthodologie et choix du modèle
2-1- Presentation des modèles
2-2- Données
2-3- Test statistique
CHAPITRE 3 : Resultats et discussions
3-1- Chargement des packages et des données
3-2- Traitement et Exploration du jeu de donnée
3-3- Analyse de la serie temporelle
3-4- Evaluation des modèles
BRVM : Boourse Régionale des valeurs mobilières
BOAB : Bank of Africa Bénin
ADF : Dickey-Fuller augmentée
AR: Autoregressive
ARMA: Autoregressive moving average
ARCH: Autoregressive Conditional Heteroskedasticity
EGARCH: Exponential GARCH
EGARCH: Exponential Generalized AutorégRessive Conditional heteroscedasticity.
GARCH: Generalized autoregressive conditional heteroscedasticity
MA: Moving Average.
TGARCH: Threshold Generalized autoregressive conditional heteroscedasticity
TARCH: Threshold Autoregressive Conditional Heteroskedasticity
La prévision des mouvements des marchés financiers est une quête cruciale pour les investisseurs et les acteurs du domaine financier. L’analyse des prix des actions, en particulier, est essentielle pour évaluer la volatilité, anticiper les tendances et prendre des décisions éclairées. Dans cet esprit, cette étude se concentre sur la prédiction de la volatilité des prix des actions de la Banque de l’Afrique de l’Ouest pour le Bénin (BOA Bénin), une entreprise cotée à la Bourse Régionale des Valeurs Mobilières (BRVM).
La volatilité des prix des actions représente la mesure des variations et des risques associés aux prix des actions d’une entreprise. Comprendre et modéliser cette volatilité peut apporter une clarté essentielle dans la prise de décision pour les investisseurs et les analystes financiers.
Pour atteindre cet objectif, cette analyse s’appuie sur des outils statistiques et des modèles financiers. Le processus débute par l’acquisition des données historiques des prix de clôture des actions de la BOA Bénin, pour ensuite effectuer une série de tests et d’analyses visant à comprendre la nature de cette série temporelle. Des tests de stationnarité, des modèles ARIMA (Auto-Regressive Integrated Moving Average), et des analyses de résidus permettent de modéliser les fluctuations des prix.
De plus, cette étude exploite des modèles de volatilité conditionnelle tels que GARCH (Generalized Autoregressive Conditional Heteroskedasticity) et ses extensions, tels que TGARCH (Threshold GARCH) et EGARCH (Exponential GARCH), pour prédire la volatilité future des prix des actions. Ces modèles fournissent des informations précieuses sur la dynamique de la volatilité, la tendance des rendements futurs et les éventuels risques associés.
L’objectif final est de fournir une analyse approfondie, des prévisions robustes et des perspectives sur la volatilité des prix des actions de la BOA Bénin, permettant ainsi aux investisseurs et aux décideurs de mieux appréhender les mouvements futurs du marché financier et de prendre des décisions plus informées.
Nelson (1991), Rabemananjara et Zakoian (1993) ont démontré que l’hypothèse de non linéarité reste fondamentale dans le processus de prédiction de la volatilité de certaines séries financières.
À l’aide des modèles EGARCH à plusieurs variables Badrinath et Prakash (2014) étudient la prédiction de la volatilité dans les marchés financiers de changes monétaires en inde. Ils trouvent que l’existence des phénomènes d’asymétries dans ces marchés est due aux faibles assimilations des informations et aux phénomènes de contagions de la volatilité.
Hagen et Yu (2001) vont utiliser des techniques différentes de séries chronologiques univariées et celles de la volatilité implicite des prix des options pour prédire la volatilité sur les marchés financiers allemand.
Dans une étude sur la prévision de la volatilité financière, Martens et Jason (2002) constatent que les modèles de prévisions GARCH ne contiennent pas assez d’informations par rapport à ceux des prévisions à volatilité implicites.
Kat et al (1994) admettent que le modèle EGARCH (1,1) est plus performant pour la prédiction de la volatilité des indices boursiers. Alors que, le modèle GARCH (1,1) est plutôt meilleur pour la prédiction de la volatilité des devises.
Brailsford et Faff (1996) testent plusieurs modèles différents de prédiction de la volatilité et admettent que le modèle GARCH est plus performant dans la prédiction de la variabilité de la volatilité sur un horizon à court terme (1mois).
Bronka (2001) approuve que la volatilité implicite semble plus efficace que la volatilité historique dans la prédiction de la volatilité future (anticipée).Il trouve que les données historiques constituent des informations passées sans réel impact sur les fluctuations avenirs.
Black et Scholes (1973), Racicot et Théoret (2005) démontrent que la volatilité historique peut être supposée comme étant un bon estimateur de la volatilité future (anticipée).
Ross (1989) admet qu’une meilleure prédiction des volatilités futures doit considérer en plus des données historiques, les phénomènes aléatoires liés à la volatilité.
Le modèle ARIMA (Autoregressive Integrated Moving Average) permet de prédire une série temporelle en intégrant l’autocorrélation et la moyenne mobile.
La formulation générale est :
\[\begin{equation*} X_{t} = c + \phi_{1}X_{t-1} + ... + \phi_{p}X_{t-p} + \theta_{1}\varepsilon_{t-1} + ... + \theta_{q}\varepsilon_{t-q} \end{equation*}\]
Où :
\(X_{t}\) représente la variable à l’instant \(t\)
\(c\) est la constante
Les termes \(\phi_{1}X_{t-1},...,\phi_{p}X_{t-p}\) captent l’autocorrélation via les valeurs passées d’ordre \(p\)
Les termes \(\theta_{1}\varepsilon_{t-1},...,\theta_{q}\varepsilon_{t-q}\) modélisent la moyenne mobile via les erreurs passées d’ordre \(q\)
Les \(\varepsilon_{t}\) sont les erreurs ou résidus à chaque période
\(p\) définit l’ordre autorégressif, \(q\) l’ordre moyenne mobile
Ce modèle ARIMA (autoregressif integrated moving average) permet de prédire une série temporelle en intégrant ses dépendances linéaires internes.
Proposé par Engle en 1982, le modèle ARCH prend en compte l’hétéroscédasticité.
La formulation est :
\[\begin{equation*} \sigma_{t}^{2} = \alpha_{0} + \alpha_{1}\varepsilon_{t-1}^{2} + ... + \alpha_{q}\varepsilon_{t-q}^{2} \end{equation*}\]
Où :
\(\sigma_{t}^{2}\) représente la variance conditionnelle à l’instant \(t\)
\(\alpha_{0}\) est la constante non conditionnelle
\(\alpha_{1}\varepsilon_{t-1}^{2}\) correspond au terme ARCH d’ordre 1, capturant l’impact des erreurs passées
De même, \(\alpha_{q}\varepsilon_{t-q}^{2}\) est le terme ARCH d’ordre \(q\)
Les \(\alpha_{i}\) mesurent l’influence du passé sur la variance conditionnelle
\(q\) définit l’ordre du processus ARCH
Ce modèle ARCH, proposé par Engle en 1982, fut le premier à prendre en compte l’hétéroscédasticité conditionnelle en faisant dépendre explicitement la variance du passé via les carrés des erreurs.
Il s’agit du modèle de base sur lequel les extensions GARCH se sont appuyées pour encore plus de flexibilité.
Généralisation du modèle ARCH par Bollerslev en 1986.
La formulation est :
\[\begin{equation*} \sigma_{t}^{2} = \alpha_{0} + \alpha_{1}\varepsilon_{t-1}^{2}/\sigma_{t-1}^{2} + ... + \alpha_{q}\varepsilon_{t-q}^{2}/\sigma_{t-q}^{2} + \beta_{1}\sigma_{t-1}^{2} + ... + \beta_{p}\sigma_{t-p}^{2} \end{equation*}\]
Où :
\(\sigma_{t}^{2}\) est la variance conditionnelle à l’instant \(t\)
\(\alpha_{0}\) est la composante constante
\(\alpha_{1}\varepsilon_{t-1}^{2}/\sigma_{t-1}^{2}\) correspond à l’impact des erreurs passées
\(\beta_{1}\sigma_{t-1}^{2}\) représente la persistance de la volatilité
\(q\) est l’ordre ARCH, \(p\) l’ordre GARCH
Les erreurs et variances passées sont pondérées par les variances Conditionnelles correspondantes
Contrairement au modèle ARCH où la variance est constante, le modèle GARCH généralisé fait dépendre la variance à la fois des erreurs et des variances passées. Cela lui confère une plus grande flexibilité dans la modélisation de l’hétéroscédasticité conditionnelle.
Développé par Nelson en 1991, le modèle EGARCH prend en compte l’effet de levier de manière non linéaire.
La formulation est :
\[\begin{equation*} \log(\sigma_{t}^{2}) = \alpha_{0} + \alpha_{1}|z_{t-1}| + \gamma z_{t-1} \end{equation*}\]
Où :
\(\sigma_{t}^{2}\) est la variance conditionnelle à l’instant \(t\)
\(\alpha_{0}\) est la composante constante
\(\alpha_{1}|z_{t-1}|\) capture l’impact des chocs, qu’ils soient positifs ou négatifs
\(z_{t-1} = \varepsilon_{t-1}/\sigma_{t-1}\) est le terme d’erreur standardisé à l’instant \(t-1\)
Le paramètre \(\gamma\) mesure spécifiquement l’effet de levier, i.e. l’impact différencié des chocs négatifs
Contrairement au modèle GARCH classique, le modèle EGARCH modélise de manière non linéaire l’influence des chocs sur la variance conditionnelle via l’utilisation du logarithme et de la valeur absolue. Cela permet de mieux rendre compte de l’asymétrie engendrée par l’effet de levier.
Développé par Zakoian en 1994, le modèle TGARCH modélise explicitement l’asymétrie avec un indice binaire sur le signe des erreurs.
La formulation est :
\[\begin{equation*} \sigma_{t}^{2} = \alpha_{0} + \alpha_{1}\varepsilon_{t-1}^{2} + \gamma_{1}\varepsilon_{t-1}I_{t-1} + \beta\sigma_{t-1}^{2} \end{equation*}\]
Où:
\(\sigma_{t}^{2}\) est la variance conditionnelle à l’instant \(t\)
\(\alpha_{0}\) est la variance non conditionnelle
\(\alpha_{1}\varepsilon_{t-1}^{2}\) représente l’impact des erreurs passées au carré
\(\gamma_{1}\varepsilon_{t-1}I_{t-1}\) capture l’effet asymétrique via l’indice binaire \(I_{t-1}\)
\(I_{t-1}=1\) si \(\varepsilon_{t-1}<0\), \(I_{t-1}=0\) sinon
\(\beta\sigma_{t-1}^{2}\) mesure la persistance de la volatilité
\(\varepsilon_{t-1}\) est le terme d’erreur à l’instant \(t-1\)
Le modèle TGARCH modélise explicitement l’asymétrie en distinguant l’impact des chocs positifs et négatifs sur la variance conditionnelle. Il permet ainsi de capturer avec plus de flexibilité l’effet de levier financier.
Les données utilisées dans le cadre de ce travail, sont celles du cours de bourse de la BOAB côté à la BRVM. Nous avons effectué ce travail avec un échantillon. Il couvre la période allant du 05 janvier 2015 au 30 décembre 2022 soit sept années d’observations qui sont toutes des cotations journalières à la fermeture des marchés et provenant de la base de données de SICA FINANCE. Par ailleurs, le marché de la BRVM ne fonctionne que les jours ouvrables, les cotations boursières n’existent pas les samedis, les dimanches et les jours fériés.
Les tests statistiques permettent de vérifier les caractéristiques de notre série financière afin de mieux les analyser et par conséquent, éviter toutes erreurs de diagnostics et de régressions fallacieuses . Dans le cadre de ce travail , les test statistiques qui seront utilisés sont :
library(tseries) # Pour l'analyse des séries temporelles
library(dplyr) # Pour le data wrangling et les opérations sur les données
library(forecast) # Pour la forecast et les modèles de prévision
library(e1071) # Pour calculer le kurtosis et le skewness des données
library(TSA) # Pour l'analyse des séries temporelles stationnaires et non stationnaires
library(nonlinearTseries) # Pour les modèles non-linéaires de séries temporelles
library(lmtest) # Pour les tests statistiques comme le test de White
library(zoo) # Pour le traitement des données de séries chronologiques
library(rugarch) # Pour les modèles ARCH/GARCH de volatilité conditionnelle
library(fGarch) # Pour les modéles TGARCH et EGARCH
library(ggplot2) # Pour la visualisation des données
library(FinTS) #La librairie FinTS (Financial Time Series) contient des fonction utiles pour l'analyse des séries financières comme la volatilité implicite/historique
library(sandwich) # La librairie sandwich contient des fonctions pour estimer des variances et écart-types robustes, utilisés notamment pour la spécification de modèles GARCH
# Chargement des données à partir du fichier CSV
Data <- read.csv("C:/Users/VICTUS/Downloads/data.csv")
# Sélection des données de l'entreprise "BOAB"
Entreprise <- "BOAB"
# New base de données
Data_BOAB <- subset(Data, Data$Ticker == Entreprise)
# Renommage des colonnes pour plus de clarté
names(Data_BOAB) <- c("Date", "Open", "High", "Low", "Close", "Volume", "Entreprise")
Data_BOAB <- subset(Data_BOAB, select = -Entreprise)
# Vérification des valeurs manquantes dans les données
sum(is.na(Data_BOAB))
## [1] 0
# Vérification du type de données
str(Data_BOAB)
## 'data.frame': 1919 obs. of 6 variables:
## $ Date : chr "2015-01-05" "2015-01-06" "2015-01-07" "2015-01-08" ...
## $ Open : num 4100 4100 4125 4100 4105 ...
## $ High : num 4100 4100 4125 4100 4110 ...
## $ Low : num 4100 4100 4000 4100 4105 ...
## $ Close : num 4100 4100 4100 4100 4110 ...
## $ Volume: num 800 80 85920 380 240 ...
# Conversion de la colonne Date en classe de date
Data_BOAB$Date <- as.Date(Data_BOAB$Date)
class(Data_BOAB$Date)
## [1] "Date"
# Tracé de l'évolution des prix de clôture au fil du temps
plot(Data_BOAB$Date, Data_BOAB$Close, type = "l", col = "blue", xlab = "Date", ylab = "Prix", main = "Serie Temporelle")
D’après le graphique, il s’agit d’une série temporelle représentant l’évolution de prix (Prix) au fil du temps (Date), de l’année 2016 à l’année 2022.
On remarque une hausse des prix au debut de l’année 2016 suivie d’une baisse jusqu’en 2019 .Puis le prix le prix range jusqu’a debut 2022 où il entame une nouvelle hausse.
Notons aussi l’absence de saisonnalité dû au faites que les données sont journalières
# Test de Dickey-Fuller augmenté (ADF) pour la stationnarité des prix de clôture
adf_result <- adf.test(Data_BOAB$Close)
# Hypothèses du test de Dickey-Fuller augmenté (ADF) :
# - Hypothèse nulle (H0) : La série temporelle possède une racine unitaire, ce qui indique qu'elle n'est pas stationnaire.
# - Hypothèse alternative (H1) : La série temporelle ne possède pas de racine unitaire, ce qui suggère la stationnarité de la série.
print(adf_result)
##
## Augmented Dickey-Fuller Test
##
## data: Data_BOAB$Close
## Dickey-Fuller = -2.0349, Lag order = 12, p-value = 0.5635
## alternative hypothesis: stationary
Le test de Dickey-Fuller augmenté (ADF) a été effectué sur la série temporelle \(DataBOAB\) $ \(Close\), avec un ordre de retard (lag order) de 12.
La statistique de test (Dickey-Fuller) est égale à \(-2.0349\).
La p-value associée est de \(0.5635\).
L’hypothèse nulle \(\mathbf{H}_{0}\) du test est que la série possède une racine unitaire, ce qui indique qu’elle n’est pas stationnaire.
L’hypothèse alternative \(\mathbf{H}_{1}\) est que la série est stationnaire.
Comme la p-value est supérieure au seuil de signification de 5%, on ne peut pas rejeter l’hypothèse nulle de non stationnarité.
Donc selon ce test ADF, la série temporelle \(DataBOAB\) $ \(Close\) ne semble pas être stationnaire en niveau, suggérant qu’elle peut nécessiter une différenciation avant d’être modélisée avec un modèle ARIMA.
# Différenciation de la série temporelle des prix de clôture
diff_data <- diff(Data_BOAB$Close)
# Tracé de la série temporelle différenciée des prix de clôture
plot(Data_BOAB$Date[-1], diff_data, type = "l", col = "red", xlab = "Date", ylab = "Différence de Prix", main = "Série Temporelle Différenciée")
D’après ce graphique, il s’agit de la représentation de la série temporelle des prix (Prix) après une étape de différenciation.
cette série temporelle différenciée permet de lisser la tendance en éliminant la composante relative à la tendance et en rendant la série possiblement stationnaire
On remarque que la moyenne est constante , puis il y a des périodes de fortes volatilités suivient de faibles volatilités
# Test de Dickey-Fuller augmenté (ADF) pour la stationnarité des prix de clôture différenciés
adf_result_diff <- adf.test(diff_data)
# Hypothèses du test de Dickey-Fuller augmenté (ADF) sur les données différenciées :
# - Hypothèse nulle (H0) : La série temporelle différenciée possède une racine unitaire, ce qui indique qu'elle n'est pas stationnaire.
# - Hypothèse alternative (H1) : La série temporelle différenciée ne possède pas de racine unitaire, ce qui suggère la stationnarité de la série différenciée.
print(adf_result_diff)
##
## Augmented Dickey-Fuller Test
##
## data: diff_data
## Dickey-Fuller = -14.527, Lag order = 12, p-value = 0.01
## alternative hypothesis: stationary
Le test de Dickey-Fuller augmenté (ADF) a été effectué sur la série temporelle différenciée, nommée \(diffdata\) dans le code R.
L’ordre de retard (lag order) utilisé est de \(12\).
La statistique de Dickey-Fuller est égale à \(-14.527\).
La p-value associée est très faible, égale à \(0.01\).
L’hypothèse nulle \(\mathbf{H}_{0}\) du test est que la série contient une racine unitaire et n’est pas stationnaire.
L’hypothèse alternative \(\mathbf{H}_{1}\) est que la série est stationnaire.
Comme la p-value est bien inférieure au seuil de 5%, on peut rejeter l’hypothèse nulle.
Donc, d’après ce test ADF effectué sur la série différenciée, on peut conclure qu’elle est maintenant stationnaire.
Cela valide l’étape de différenciation et permet de poursuivre la modélisation ARIMA sur une série stationnaire.
# Modélisation ARIMA automatique avec la série temporelle différenciée
auto_arima_model <- auto.arima(Data_BOAB$Close)
print(auto_arima_model)
## Series: Data_BOAB$Close
## ARIMA(1,1,2)
##
## Coefficients:
## ar1 ma1 ma2
## 0.4852 -0.4108 0.1469
## s.e. 0.0991 0.0997 0.0260
##
## sigma^2 = 23871: log likelihood = -12387.18
## AIC=24782.35 AICc=24782.37 BIC=24804.59
Le modèle a été estimé sur la série temporelle \(DataBOAB\) $ \(Close\) préalablement différenciée une fois (d’où le (1,1) dans ARIMA(1,1,2)).
Les coefficients estimés sont :
\(\hat{a}_{1}\) = 0.4852 : terme autorégressif d’ordre 1
\(\hat{m}_{1}\) = -0.4108 : terme moyenne mobile d’ordre 1
\(\hat{m}_{2}\) = 0.1469 : terme moyenne mobile d’ordre 2
Les écart-types des coefficients sont également présentés (\(s.e.\)).
La variance résiduelle du modèle (\(\sigma^2\)) est de 23871.
La vraisemblance du modèle (\(\log likelihood\)) est de \(-12387,18\).
Les critères d’information AIC, AICc et BIC sont reportés et pourront servir à la sélection de modèle.
On peut donc conclure que le modèle ARIMA(1,1,2) s’ajuste correctement aux données différenciées de la série \(DataBOAB\) $ \(Close\).
# Récupération des coefficients et écart-types
coefs <- auto_arima_model$coef
se <- auto_arima_model$var.coef
# Calcul des statistiques t
tstat <- coefs/se
# Affichage des statistiques t
print(tstat)
## ar1 ma1 ma2
## ar1 49.43400 -50.4396 -350.0794
## ma1 42.70708 -41.3387 -346.5484
## ma2 -105.95899 123.8816 216.6019
# Nombre de degrés de liberté
df <- length(coefs)
# Valeur critique de Student
crit <- qt(p=0.05/2, df=df)
cat("Valeur critique (bilatérale 5%) : ", crit, "\n")
## Valeur critique (bilatérale 5%) : -3.182446
D’après les résultats obtenus:
Pour le terme AR(1), \(tstat = 49.43400\) qui est très supérieur à la valeur critique de \(-2.776445\) en valeur absolue. Le coefficient AR(1) est donc significatif.
Pour le terme MA(1), \(tstat = -41.3387\) qui est également très supérieur à la valeur critique. Le coefficient MA(1) est significatif.
Pour le terme MA(2), \(tstat = 216.6019\) qui est très grand devant la valeur critique. Le coefficient MA(2) est significatif.
En conclusion, on peut affirmer que les termes \(\mathrm{AR}(1)\), \(\mathrm{MA}(1)\) et \(\mathrm{MA}(2)\) sont statistiquement significatifs dans ce modèle \(\mathrm{ARIMA}(1,0,2)\).
# Récupération des résidus du modèle ARIMA
residuals_arima <- residuals(auto_arima_model)
# Test d'hétéroscédasticité de White
white_test = white.test(residuals_arima)
# Affichage des résultats du test de White
cat("Test d'hétéroscédasticité de White\n")
## Test d'hétéroscédasticité de White
print(white_test)
##
## White Neural Network Test
##
## data: residuals_arima
## X-squared = 19.966, df = 2, p-value = 4.618e-05
# Interprétation du test de White
#Hypothèses du test de White
#- H0 : Les résidus sont homoscédastiques (variance constante).
#- H1 : Les résidus sont hétéroscédastiques (variance non constante).
On constate que la \(p-value= 1.157e-05\) est très faible quasiment nulle .
Donc on rejete l’hypothèse homoscédasticité des residus ( variance constante).
Puis on conclut que , les résidus sont hétéroscédastiques (variance non constante).
ce qui avait déjà été remarqué au niveau de notre série temporelle différenciée par des periodes de faibles volatilités suivient de fortes volatilités
# Test de normalité des résidus (Jarque-Bera)
jarque_bera_test <- jarque.bera.test(residuals_arima)
# Affichage des résultats du test de Jarque-Bera
cat("Test de normalité des résidus (Jarque-Bera)\n")
## Test de normalité des résidus (Jarque-Bera)
print(jarque_bera_test)
##
## Jarque Bera Test
##
## data: residuals_arima
## X-squared = 10524, df = 2, p-value < 2.2e-16
# Interprétation du test de Jarque-Bera
#Hypothèses du test de Jarque-Bera :
#- H0 : Les résidus suivent une distribution normale.
#- H1 : Les résidus ne suivent pas une distribution normale.
Le test de Jarque-Bera permet de tester si la distribution des résidus suit une loi normale. La statistique du test suit une loi du \(\chi^2\) à 2 degrés de liberté sous l’hypothèse de normalité.
Ici, la p-value très faible (\(\ 2.2e-16\)) indique que l’hypothèse de normalité est rejetée de manière hautement significative. La valeur élevée de la statistique du test (\(10524\)) montre un très fort décalage par rapport à la loi normale.
On peut donc conclure que la distribution des résidus ne suit pas une loi normale au vu de ce test
La non-normalité des résidus peut donc indiquer :
Des modèles de volatilité conditionnelle non capturés par le modèle.
Des queues épaisses dans la distribution, c’est-à-dire une probabilité plus élevée d’événements extrêmes par rapport à ce que la distribution normale prévoit. Ces événements extrêmes peuvent être associés à des pics de volatilité.
# Calcul du kurtosis des résidus
kurtosis_residus <- kurtosis(residuals_arima)
cat("Kurtosis des résidus :", kurtosis_residus, "\n")
## Kurtosis des résidus : 11.42661
# Calcul de l'asymétrie (skewness) des résidus
skewness_residus <- skewness(residuals_arima)
cat("Asymétrie (skewness) des résidus :", skewness_residus, "\n")
## Asymétrie (skewness) des résidus : -0.5113017
La kurtosis des résidus est de 11.42661. Cette valeur très élevée indique une distribution des résidus avec des queues épaisses par rapport à la loi normale qui a une kurtosis de 3.
Une forte kurtosis traduit la présence d’événements extrêmes plus fréquents que dans une loi normale. Cela confirme les conclusions du test de Jarque-Bera sur la non-normalité de la distribution.
L’asymétrie (skewness) des résidus est de -0.5113017. Cette valeur proche de 0 indique une distribution assez symétrique, sans biais négatif ou positif marqué.
Bien que l’asymétrie soit faible, la distribution n’est tout de même pas normale comme le montre la très forte kurtosis.
# Test d'autocorrélation des résidus avec le test Ljung-Box
ljung_box_test <- Box.test(residuals_arima, lag = 10, type = "Ljung-Box")
print(ljung_box_test)
##
## Box-Ljung test
##
## data: residuals_arima
## X-squared = 33.319, df = 10, p-value = 0.0002407
# Interprétation du test de BDS
#Test d'indépendance BDS
#Hypothèses du test BDS :
#- H0 : Les résidus sont indépendants.
#- H1 : Les résidus ne sont pas indépendants.
Le test de Box-Ljung est un test statistique utilisé pour vérifier l’indépendance des résidus d’un modèle ARIMA.
Dans le résultat du test présenté ici :
“residuals_arima” correspond aux résidus du modèle ARIMA estimé.
La statistique de test “X-squared” suit une loi du \(\chi^2\) à 10 degrés de liberté, soit la valeur observée ici est 33.319
Le nombre de degrés de liberté “df” est égal au nombre de retard pris en compte dans le test, ici 10 retards.
La p-value très faible, p-value = 0.0002407, indique que l’hypothèse nulle d’indépendance des résidus est rejetée au seuil de significativité de 5%.
Donc en conclusion, le test de Box-Ljung nous indique que les résidus du modèle ARIMA ne sont pas indépendants, ils présentent de l’autocorrélation. Cela signifie que le modèle ARIMA estimé ne capture pas parfaitement la dynamique des données.
# Test d'autocorrélation des résidus
acf(residuals(auto_arima_model))
Le graphique présente l’autocorrélogramme des résidus d’un modèle ARIMA (1, 0, 2) estimé sur une série temporelle (auto_arima_model).
L’autocorrélogramme permet de visualiser les coefficients d’autocorrélation des résidus pour différents décalages temporels, appelés “lags”.
Ici, on observe que tous les coefficients ne se situent pas à l’intérieur de l’intervalle de confiance représenté par les lignes pointillées rouges. Cela signifie qu’aucun que certains coefficients sont significativement différent de zéro.
On peut donc conclure que les résidus du modèle ARIMA présentent d’autocorrélation significative pour les lags testés, allant de 1 à 30.
Cela indique que le modèle n’a pas correctement capturé la structure temporelle des données et que l’hypothèse d’indépendance des résidus semble être remise en cause.
Le test de BDS (Brock, Dechert, Scheinkman) est un test de non-linéarité qui vise à détecter des dépendances non linéaires dans une série temporelle. Voici les principales hypothèses du test de BDS :
Hypothèse Nulle (H0) : Indépendance Linéaire
Énoncé : Les observations de la série temporelle sont indépendantes linéairement.
Implication : Si l’hypothèse nulle est vraie, cela signifie que les observations de la série temporelle sont indépendantes et ne présentent pas de dépendance non linéaire.
Hypothèse Alternative (H1) : Dépendance Non Linéaire
Énoncé : Les observations de la série temporelle présentent une dépendance non linéaire.
Implication : Rejeter l’hypothèse nulle en faveur de l’hypothèse alternative suggère la présence de dépendance non linéaire dans la série temporelle.
result_bds = bds.test(Data_BOAB$Close)
print(result_bds)
##
## BDS Test
##
## data: Data_BOAB$Close
##
## Embedding dimension = 2 3
##
## Epsilon for close points = 1095.375 2190.751 3286.126 4381.501
##
## Standard Normal =
## [ 1095.3753 ] [ 2190.7505 ] [ 3286.1258 ] [ 4381.5011 ]
## [ 2 ] 287.2371 163.278 106.7108 101.4486
## [ 3 ] 505.6143 207.360 111.9509 100.2717
##
## p-value =
## [ 1095.3753 ] [ 2190.7505 ] [ 3286.1258 ] [ 4381.5011 ]
## [ 2 ] 0 0 0 0
## [ 3 ] 0 0 0 0
Nous observons que toutes les p-values associées à la statistique du test d’indépendance BDS sont égales à zéro (p = 0,00) donc inférieures au seuil critique 5%. Par conséquent, nous rejetons l’hypothèse nulle H0 :Indépendance Linéaire
À cet effet, nous pouvons donc accepter l’hypothèse de non-linéarité de notre série et confirmer ainsi l’inefficacité du processus linéaire ARMA dans la prédiction de la volatilité
arch_test_result <- ArchTest(residuals_arima)
print(arch_test_result)
##
## ARCH LM-test; Null hypothesis: no ARCH effects
##
## data: residuals_arima
## Chi-squared = 562.13, df = 12, p-value < 2.2e-16
Le test ARCH LM (Lagrange Multiplier) permet de tester la présence d’hétéroscédasticité conditionnelle (effets ARCH) dans les résidus d’un modèle estimé.
Ici, l’hypothèse nulle est l’absence d’effets ARCH dans les résidus du modèle ARIMA.
La très petite p-value conduit à rejeter l’hypothèse nulle au profit de l’hypothèse alternative d’existence d’effets ARCH.
Cela signifie que la variance des résidus n’est pas constante et dépend de la réalisation passée des erreurs. Le modèle ARIMA ne capture pas correctement l’hétéroscédasticité conditionnelle présente dans les données. Un modèle ARCH/GARCH pourrait être plus approprié.
D’après les différents tests diagnostics effectués sur les résidus du modèle ARIMA (test de Jarque-Bera, autocorrélogramme, test de Box-Ljung, test ARCH-LM), on peut tirer les conclusions suivantes :
La distribution des résidus ne suit pas une loi normale, elle présente des queues épaisses traduisant une probabilité plus élevée d’événements extrêmes.
Les résidus présentent de l’autocorrélation significative, montrant que le modèle ARIMA n’a pas capturé correctement la dynamique temporelle des données.
L’hypothèse d’indépendance des résidus est rejetée par le test de Box-Ljung.
Le test ARCH-LM met en évidence la présence d’effets ARCH, c’est-à-dire une hétéroscédasticité conditionnelle où la variance dépend des valeurs passées.
Ces résultats diagnostics indiquent les limites du modèle ARIMA à capturer toute la structure des données, notamment l’hétéroscédasticité conditionnelle. Un modèle ARCH/GARCH serait plus approprié car il permet de modéliser explicitement la volatilité conditionnelle et sa dynamique au cours du temps en tenant compte des effets d’autarcie (clusters de volatilité).
On peut donc conclure qu’un modèle ARCH/GARCH constitue une piste pertinente pour affiner la modélisation et la prévision de cette série temporelle présentant une volatilité variable dans le temps.
rendement = diff(log(Data_BOAB$Close))
length(rendement)
## [1] 1918
length(Data_BOAB$Date)
## [1] 1919
plot(Data_BOAB$Date[-1], rendement, type = "l", xlab = "Date", ylab = "Rendement", main = "Serie temporelle du rendement ")
# Spécification du modèle GARCH(1,1) avec ugarchspec
garch_spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0)))
# Adapter le modèle aux données (assurez-vous que 'rendement' est votre série temporelle de rendements)
garch_fit <- ugarchfit(spec = garch_spec, data = rendement)
# Affichage d'un résumé du modèle ajusté
show(garch_fit)
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : sGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000177 0.000430 0.41236 0.68008
## omega 0.000038 0.000007 5.23862 0.00000
## alpha1 0.153957 0.020686 7.44246 0.00000
## beta1 0.784732 0.026717 29.37251 0.00000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000177 0.000377 0.47031 0.638130
## omega 0.000038 0.000022 1.76942 0.076824
## alpha1 0.153957 0.037925 4.05947 0.000049
## beta1 0.784732 0.071567 10.96500 0.000000
##
## LogLikelihood : 4673.373
##
## Information Criteria
## ------------------------------------
##
## Akaike -4.8690
## Bayes -4.8574
## Shibata -4.8690
## Hannan-Quinn -4.8647
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 2.677 0.10181
## Lag[2*(p+q)+(p+q)-1][2] 4.933 0.04239
## Lag[4*(p+q)+(p+q)-1][5] 8.492 0.02221
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 7.051 0.007923
## Lag[2*(p+q)+(p+q)-1][5] 8.892 0.017628
## Lag[4*(p+q)+(p+q)-1][9] 10.292 0.043412
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.9988 0.500 2.000 0.3176
## ARCH Lag[5] 2.5596 1.440 1.667 0.3603
## ARCH Lag[7] 3.2327 2.315 1.543 0.4707
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 0.8153
## Individual Statistics:
## mu 0.19021
## omega 0.08408
## alpha1 0.21093
## beta1 0.14436
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.07 1.24 1.6
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.6871 0.49208
## Negative Sign Bias 0.4018 0.68789
## Positive Sign Bias 1.6315 0.10295
## Joint Effect 7.4567 0.05868 *
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 4398 0
## 2 30 6410 0
## 3 40 7873 0
## 4 50 9423 0
##
##
## Elapsed time : 0.207108
Le modèle conditionnel retenu est un sGARCH(1,1) avec une moyenne spécifiée par un ARFIMA(0,0,0). La distribution des résidus est normale.
Les estimateurs du sGARCH sont tous significatifs, en particulier \(\alpha_1\) et \(\beta_1\) qui déterminent la dynamique conditionnelle.
Les tests robustes sur les résidus standardisés et au carré ne révèlent pas d’autocorrélation ou d’hétéroscédasticité résiduelle.
Les critères d’information indiquent une bonne adéquation du modèle aux données.
Le test de Nyblom valide la stabilité paramétrique dans le temps.
Le test ARCH ne détecte pas d’effet de levier ou de signe anormal.
Le test de Pearson rejette l’adéquation de la distribution mais c’est courant pour de grands échantillons.
En conclusion, ce modèle GARCH(1,1) semble capturer correctement la dynamique conditionnelle de la volatilité des rendements étudiés.
# Spécification du modèle TGARCH(1,1) avec ugarchspec
tgarch_spec <- ugarchspec(variance.model = list(model = "fGARCH", submodel = "TGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(0, 0)))
# Adapter le modèle aux données (assurez-vous que 'rendement' est votre série temporelle de rendements)
tgarch_fit <- ugarchfit(spec = tgarch_spec, data = rendement)
# Affichage d'un résumé du modèle ajusté
show(tgarch_fit)
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : fGARCH(1,1)
## fGARCH Sub-Model : TGARCH
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000625 0.000446 1.4005 0.161369
## omega 0.003014 0.000590 5.1088 0.000000
## alpha1 0.169635 0.020086 8.4453 0.000000
## beta1 0.761738 0.035644 21.3707 0.000000
## eta11 -0.258298 0.068314 -3.7810 0.000156
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000625 0.000525 1.1897 0.234169
## omega 0.003014 0.001768 1.7043 0.088327
## alpha1 0.169635 0.043344 3.9137 0.000091
## beta1 0.761738 0.103976 7.3261 0.000000
## eta11 -0.258298 0.105100 -2.4576 0.013986
##
## LogLikelihood : 4659.762
##
## Information Criteria
## ------------------------------------
##
## Akaike -4.8538
## Bayes -4.8393
## Shibata -4.8538
## Hannan-Quinn -4.8484
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 1.521 0.21749
## Lag[2*(p+q)+(p+q)-1][2] 4.330 0.06149
## Lag[4*(p+q)+(p+q)-1][5] 7.887 0.03143
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 5.938 0.01482
## Lag[2*(p+q)+(p+q)-1][5] 6.691 0.06158
## Lag[4*(p+q)+(p+q)-1][9] 10.393 0.04128
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.6011 0.500 2.000 0.4382
## ARCH Lag[5] 1.3414 1.440 1.667 0.6350
## ARCH Lag[7] 5.0693 2.315 1.543 0.2176
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 1.5483
## Individual Statistics:
## mu 0.09956
## omega 0.23452
## alpha1 0.49017
## beta1 0.27453
## eta11 0.22431
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.28 1.47 1.88
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.03384 0.9730
## Negative Sign Bias 0.83133 0.4059
## Positive Sign Bias 1.33155 0.1832
## Joint Effect 3.19571 0.3624
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 4177 0
## 2 30 5777 0
## 3 40 7330 0
## 4 50 9153 0
##
##
## Elapsed time : 0.597981
Le modèle conditionnel capturé l’asymétrie des impacts négatifs et positifs via le sous-modèle TGARCH.
Les estimateurs du modèle sont tous significatifs, notamment l’estimateur \(\eta_{11}\) qui caractérise l’effet de levier asymétrique.
Les diagnostics sur les résidus ne révèlent pas de problème d’autocorrélation ou d’hétéroscédasticité résiduelle.
Les critères d’information confirment la qualité d’ajustement du modèle aux données.
Le test de Nyblom valide la stabilité temporelle des paramètres.
Le test ARCH n’indique pas de terme ARCH résiduel significatif.
Le test de Pearson rejette la normalité mais c’est attendu pour de grands échantillons.
Ce modèle fGARCH(1,1)- semble donc décrire de manière robuste la dynamique conditionnelle de volatilité, en capturant spécifiquement l’effet de levier asymétrique
# Spécification du modèle EGARCH(1,1) avec ugarchspec
egarch_spec <- ugarchspec(variance.model = list(model = "eGARCH", garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(0, 0)))
# Adapter le modèle aux données (assurez-vous que 'rendement' est votre série temporelle de rendements)
egarch_fit <- ugarchfit(spec = egarch_spec, data = rendement)
# Affichage d'un résumé du modèle ajusté
show(egarch_fit)
##
## *---------------------------------*
## * GARCH Model Fit *
## *---------------------------------*
##
## Conditional Variance Dynamics
## -----------------------------------
## GARCH Model : eGARCH(1,1)
## Mean Model : ARFIMA(0,0,0)
## Distribution : norm
##
## Optimal Parameters
## ------------------------------------
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000420 0.000432 0.97335 0.330380
## omega -1.124248 0.164655 -6.82789 0.000000
## alpha1 0.070742 0.019383 3.64967 0.000263
## beta1 0.844697 0.021874 38.61564 0.000000
## gamma1 0.356135 0.033280 10.70105 0.000000
##
## Robust Standard Errors:
## Estimate Std. Error t value Pr(>|t|)
## mu 0.000420 0.000501 0.83925 0.401328
## omega -1.124248 0.448331 -2.50763 0.012154
## alpha1 0.070742 0.028699 2.46496 0.013703
## beta1 0.844697 0.059108 14.29086 0.000000
## gamma1 0.356135 0.056212 6.33556 0.000000
##
## LogLikelihood : 4670.827
##
## Information Criteria
## ------------------------------------
##
## Akaike -4.8653
## Bayes -4.8508
## Shibata -4.8653
## Hannan-Quinn -4.8600
##
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 1.303 0.25370
## Lag[2*(p+q)+(p+q)-1][2] 4.155 0.06849
## Lag[4*(p+q)+(p+q)-1][5] 7.912 0.03098
## d.o.f=0
## H0 : No serial correlation
##
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
## statistic p-value
## Lag[1] 1.774 0.1829
## Lag[2*(p+q)+(p+q)-1][5] 3.196 0.3725
## Lag[4*(p+q)+(p+q)-1][9] 6.203 0.2755
## d.o.f=2
##
## Weighted ARCH LM Tests
## ------------------------------------
## Statistic Shape Scale P-Value
## ARCH Lag[3] 0.7154 0.500 2.000 0.3976
## ARCH Lag[5] 1.5259 1.440 1.667 0.5855
## ARCH Lag[7] 4.2399 2.315 1.543 0.3133
##
## Nyblom stability test
## ------------------------------------
## Joint Statistic: 1.1182
## Individual Statistics:
## mu 0.06562
## omega 0.27361
## alpha1 0.10654
## beta1 0.25201
## gamma1 0.13386
##
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic: 1.28 1.47 1.88
## Individual Statistic: 0.35 0.47 0.75
##
## Sign Bias Test
## ------------------------------------
## t-value prob sig
## Sign Bias 0.5973 0.5503
## Negative Sign Bias 0.5568 0.5777
## Positive Sign Bias 0.2339 0.8151
## Joint Effect 1.0134 0.7980
##
##
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
## group statistic p-value(g-1)
## 1 20 4287 0
## 2 30 6103 0
## 3 40 7559 0
## 4 50 9240 0
##
##
## Elapsed time : 0.239532
Le modèle conditionnel retenu est un eGARCH(1,1) avec une moyenne spécifiée par un ARFIMA(0,0,0) et une distribution normale des résidus.
Les estimateurs du eGARCH sont tous significatifs, notamment le paramètre \(\gamma_1\) captant l’effet de levier.
Les diagnostics sur les résidus ne révèlent pas de problèmes d’autocorrélation ou d’hétéroscédasticité résiduelle.
Les critères d’information valident la qualité d’ajustement du modèle.
Le test de Nyblom montre la stabilité des paramètres dans le temps.
Le test ARCH n’indique pas d’effet ARCH résiduel significatif.
Le test de Pearson rejette la distribution normale mais c’est attendu pour de grands échantillons.
Ce modèle eGARCH(1,1) semble donc capturer correctement la dynamique conditionnelle de volatilité, y compris l’effet de levier, sur la période étudiée.
1
# Extraire les valeurs de volatilité estimées du modèle GARCH(1,1)
volatility_garch <- sigma(garch_fit)
# Tracer le graphique de volatilité
plot(volatility_garch, type = "l", col = "blue", xlab = "Temps", ylab = "Volatilité", main = "Graphique de Volatilité du Modèle GARCH(1,1)")
# Calculer les résidus du modèle GARCH(1,1)
residuals <- residuals(garch_fit)
# Tracer les résidus par rapport aux valeurs ajustées (fitted)
plot(residuals, type = "l", col = "red", xlab = "Temps", ylab = "Résidus", main = "Graphique des Résidus du Modèle GARCH(1,1)")
# Extraire les valeurs de volatilité estimées du modèle TGARCH(1,1)
volatility_tgarch <- sigma(tgarch_fit)
# Tracer le graphique de volatilité
plot(volatility_tgarch, type = "l", col = "blue", xlab = "Temps", ylab = "Volatilité", main = "Graphique de Volatilité du Modèle TGARCH(1,1)")
# Calculer les résidus du modèle TGARCH(1,1)
residuals0 <- residuals(tgarch_fit)
# Tracer les résidus par rapport aux valeurs ajustées (fitted)
plot(residuals0, type = "l", col = "red", xlab = "Temps", ylab = "Résidus", main = "Graphique des Résidus du Modèle TGARCH(1,1)")
# Extraire les valeurs de volatilité estimées du modèle EGARCH(1,1)
volatility_egarch <- sigma(egarch_fit)
# Tracer le graphique de volatilité
plot(volatility_egarch, type = "l", col = "blue", xlab = "Temps", ylab = "Volatilité", main = "Graphique de Volatilité du Modèle EGARCH(1,1)")
# Calculer les résidus du modèle EGARCH(1,1)
residuals1 <- residuals(egarch_fit)
# Tracer les résidus par rapport aux valeurs ajustées (fitted)
plot(residuals1, type = "l", col = "red", xlab = "Temps", ylab = "Résidus", main = "Graphique des Résidus du Modèle EGARCH(1,1)")
Les courbes des résidus issues des 03 modèles candidats estimés ont quasiment une même forme, seules les courbes d’évolution de la volatilité conditionnelle sont différentes pour chaque modèle candidat estimé. Ce phénomène peut s’expliquer par le fait que la série étudiée est asymétrique alors que les modèles postulés sont probablement symétriques pour la plupart.
En effet, lorsque la série réelle présente une asymétrie (par exemple un effet de levier), les modèles symétriques ne sont pas en mesure de capturer parfaitement cette caractéristique. Ils aboutissent donc à des volatilités conditionnelles légèrement différentes, bien que les résidus globaux soient similaires.
\(Akaike(AIC): -4.8690\)
\(Bayes(BIC): -4.8574\)
\(Shibata(SIC): -4.8690\)
\(Hannan-Quinn(HQIC): -4.8647\)
\(Akaike(AIC): -4.8653\)
\(Bayes(BIC): -4.8508\)
\(Shibata(SIC): -4.8653\)
\(Hannan-Quinn(HQIC): -4.8600\)
\(Akaike(AIC): -4.8538\)
\(Bayes(BIC): -4.8393\)
\(Shibata(SIC): -4.8538\)
\(Hannan-Quinn(HQIC): -4.8484\)
D’après les valeurs des critères d’information reportées:
Le modèle GARCH(1,1) a dans tous les cas des critères plus élevés que les deux autres modèles.
Le modèle TGARCH(1,1) a des valeurs de critères plus faible que celles du modèle EGARCH(1,1)
On peut donc en conclure que:
Le modèle TGARCH(1,1) a la meilleure qualité d’ajustement aux données selon les critères d’information.
Le modèle EGARCH(1,1) a une qualité d’ajustement légèrement inférieure mais reste meilleure que le GARCH(1,1).
Le modèle GARCH(1,1), étant le moins performant, n’est pas retenu comme spécification conditionnelle la plus appropriée.
# Prédire la volatilité
pred_vola_tgarch <- sigma(tgarch_fit)
# Générer les rendements simulés
set.seed(123)
n <- length(rendement)
simulated_returns_tgarch <- rnorm(n, mean=0, sd=pred_vola_tgarch)
# Tracer les résultats
plot(simulated_returns_tgarch, typ="l", col="red", ylab="Rendements")
lines(rendement, col="blue")
legend("topright", legend=c("Simulés", "Réels"),
col=c("red","blue"), lty=1)
title("Rendements simulés vs réels")
Bien que suivant des tendances similaires à certains moments, les deux courbes diffèrent dans leurs amplitudes de variation, la série simulée présentant des écarts plus importants d’un pas de temps à l’autre.
# Mesures d'erreur
rmse_tgarch <- sqrt(mean((simulated_returns_tgarch - rendement)^2))
mae_tgarch <- mean(abs(simulated_returns_tgarch - rendement))
print("Modèle TGARCH ")
## [1] "Modèle TGARCH "
# Afficher les mesures
print(paste("RMSE_tgarch =", rmse_tgarch))
## [1] "RMSE_tgarch = 0.032404753174051"
print(paste("MAE_tgarch =", mae_tgarch))
## [1] "MAE_tgarch = 0.0236239590190403"
# Récupération de la volatilité conditionnelle prédite
pred_vola_egarch <- sigma(egarch_fit)
# Génération de rendements simulés
set.seed(123)
n <- length(rendement)
simulated_returns_egarch <- rnorm(n, mean = 0, sd = pred_vola_egarch)
rmse_egarch = sqrt(mean((simulated_returns_egarch - rendement)^2))
mae_egarch = mean(abs(simulated_returns_egarch - rendement))
print("Modèle EGARCH ")
## [1] "Modèle EGARCH "
# Afficher les mesures
print(paste("RMSE_egarch =", rmse_egarch))
## [1] "RMSE_egarch = 0.0324456403399826"
print(paste("MAE_egarch =", mae_egarch))
## [1] "MAE_egarch = 0.0235804321280706"
Pour le modèle TGARCH(1,1):
La RMSE est de 0.032404753174051
Le MAE est de 0.0236239590190403
Pour le modèle EGARCH(1,1):
La RMSE est de 0.0324456403399826
Le MAE est de 0.0235804321280706
On peut donc en déduire que:
Les mesures d’erreur RMSE et MAE sont très proches entre les deux modèles TGARCH(1,1) et EGARCH(1,1).
Le TGARCH(1,1) a une RMSE et un MAE légèrement inférieurs, ce qui confirme nos résultats précédents.
Cependant, les écarts entre les modèles sont très faibles et les performances quasi équivalentes d’après ces critères de mesure .