économétrie
rm(list = ls()) graphics.off() pack <- c("car", "readxl", "ggplot2", "vtable", "tidyverse", "jtools", "e1071", "tseries", "ggplot2", "plotly", "fRegression", "ggthemes", "summarytools", "quantmod", "dplyr", "Quandl", "vtable", "moments", "stats") lapply(pack, require, character.only = TRUE) install.packages("vars") library("vars") # Lecture des données INDICES <- read_excel("C:\\INDICES.xlsx", sheet = "INDICES", col_names = TRUE, col_types = c('date', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric', 'numeric')) # Nom des colonnes names(INDICES)[1] = "Date" names(INDICES)[2] = "SP500price" names(INDICES)[3] = "SP500volume" names(INDICES)[4] = "FTSE100price" names(INDICES)[5] = "FTSE100volume" names(INDICES)[6] = "CAC40price" names(INDICES)[7] = "CAC40volume" SP500price <- INDICES$SP500price FTSE100price <- INDICES$FTSE100price CAC40price <- INDICES$CAC40price Date <- INDICES$Date plot(SP500price) plot(FTSE100price) plot(CAC40price) # Calcul des rendements logarithmiques returns_SP500 <- diff(log(SP500price)) returns_FTSE100 <- diff(log(FTSE100price)) returns_CAC40 <- diff(log(CAC40price)) # Créer un dataframe pour faciliter l'analyse log_returns <- data.frame( Asset = rep(c("S&P", "FTSE", "CAC40"), each = length(returns_SP500)), Return = c(returns_SP500, returns_FTSE100, returns_CAC40) ) # Tracer les histogrammes des rendements ggplot(log_returns, aes(x = Return, fill = Asset)) + geom_histogram(bins = 30, alpha = 0.6, position = "identity") + facet_wrap(~Asset) + labs(title = "Histogram of Log Returns", x = "Log Return", y = "Frequency") + theme_minimal() # Tracer les boxplots des rendements ggplot(log_returns, aes(x = Asset, y = Return, fill = Asset)) + geom_boxplot() + labs(title = "Boxplot of Log Returns", x = "Asset", y = "Log Return") + theme_minimal() # Calculer des statistiques descriptives descriptive_stats <- log_returns %>% group_by(Asset) %>% summarise( Mean = mean(Return, na.rm = TRUE), Median = median(Return, na.rm = TRUE), Std_Dev = sd(Return, na.rm = TRUE), Min = min(Return, na.rm = TRUE), Max = max(Return, na.rm = TRUE), Skewness = mean((Return - mean(Return, na.rm = TRUE))^3, na.rm = TRUE) / sd(Return, na.rm = TRUE)^3, Kurtosis = mean((Return - mean(Return, na.rm = TRUE))^4, na.rm = TRUE) / sd(Return, na.rm = TRUE)^4 - 3 ) print(descriptive_stats) # Task 2 # ___________________________________________ #ADF test task 2.1 ADF_SP500 = adf.test(returns_SP500) ADF_FTSE100 = adf.test(returns_FTSE100) ADF_CAC40 = adf.test(returns_CAC40) print (ADF_SP500) print (ADF_FTSE100) print (ADF_CAC40) library(forecast) # Graphique de l'ACF et PACF pour les rendements log SP500 par(mfrow=c(1,2)) # Configurer pour afficher deux graphiques côte à côte acf(returns_SP500, main="ACF: SP500 Log-Returns") pacf(returns_SP500, main="PACF: SP500 Log-Returns") # Graphique de l'ACF et PACF pour les rendements log FTSE100 acf(returns_FTSE100, main="ACF: FTSE100 Log-Returns") pacf(returns_FTSE100, main="PACF: FTSE100 Log-Returns") # Graphique de l'ACF et PACF pour les rendements log CAC40 acf(returns_CAC40, main="ACF: CAC40 Log-Returns") pacf(returns_CAC40, main="PACF: CAC40 Log-Returns") # Homoskedacity model_SP500 <- lm(returns_SP500 ~ 1) # Modèle simple (moyenne) model_FTSE100 <- lm(returns_FTSE100 ~ 1) model_CAC40 <- lm(returns_CAC40 ~ 1) residuals_SP500 <- residuals(model_SP500) residuals_FTSE100 <- residuals(model_FTSE100) residuals_CAC40 <- residuals(model_CAC40) # Tracer les histogrammes et boxplots des résidus pour chaque actif par(mfrow=c(2, 3)) # Disposition 2x3 pour les graphiques # Histogramme des erreurs de SP500 hist(residuals_SP500, main="Histogramme des erreurs SP500", xlab="Erreurs SP500", col="lightblue", breaks=30) # Boxplot des erreurs de SP500 boxplot(residuals_SP500, main="Boxplot des erreurs SP500", ylab="Erreurs SP500", col="lightgreen") # Histogramme des erreurs de FTSE100 hist(residuals_FTSE100, main="Histogramme des erreurs FTSE100", xlab="Erreurs FTSE100", col="lightblue", breaks=30) # Boxplot des erreurs de FTSE100 boxplot(residuals_FTSE100, main="Boxplot des erreurs FTSE100", ylab="Erreurs FTSE100", col="lightgreen") # Histogramme des erreurs de CAC40 hist(residuals_CAC40, main="Histogramme des erreurs CAC40", xlab="Erreurs CAC40", col="lightblue", breaks=30) # Boxplot des erreurs de CAC40 boxplot(residuals_CAC40, main="Boxplot des erreurs CAC40", ylab="Erreurs CAC40", col="lightgreen") # Task 2.2 acf(returns_SP500, main="ACF - SP500", lag.max=30) pacf(returns_SP500, main="PACF - SP500", lag.max=30) # ACF et PACF pour FTSE100 acf(returns_FTSE100, main="ACF - FTSE100", lag.max=30) pacf(returns_FTSE100, main="PACF - FTSE100", lag.max=30) # ACF et PACF pour CAC40 acf(returns_CAC40, main="ACF - CAC40", lag.max=30) pacf(returns_CAC40, main="PACF - CAC40", lag.max=30) #____________________________________________ model_SP500_arma <- auto.arima(returns_SP500, d=0) # ARMA(p,q) model_FTSE100_arma <- auto.arima(returns_FTSE100, d=0) # ARMA(p,q) model_CAC40_arma <- auto.arima(returns_CAC40, d=0) # ARMA(p,q) # Résumé des modèles ajustés summary(model_SP500_arma) summary(model_FTSE100_arma) summary(model_CAC40_arma) residuals_SP500 <- residuals(model_SP500_arma) residuals_FTSE100 <- residuals(model_FTSE100_arma) residuals_CAC40 <- residuals(model_CAC40_arma) # pour vérifier si le modèle généralise bien acf(residuals_SP500, main="ACF des résidus SP500") acf(residuals_FTSE100, main="ACF des résidus FTSE100") acf(residuals_CAC40, main="ACF des résidus CAC40") install.packages("rugarch") library(rugarch) garch_spec <- ugarchspec( mean.model = list(armaOrder = c(0, 0), include.mean = TRUE), # Modèle ARMA(0,0), sans terme constant variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), # Modèle GARCH(1,1) distribution.model = "norm" # Distribution normale des erreurs ) # Ajuster le modèle GARCH aux rendements de chaque actif model_garch_SP500 <- ugarchfit(spec = garch_spec, data = returns_SP500) model_garch_FTSE100 <- ugarchfit(spec = garch_spec, data = returns_FTSE100) model_garch_CAC40 <- ugarchfit(spec = garch_spec, data = returns_CAC40) # Afficher les résultats summary(model_garch_SP500) summary(model_garch_FTSE100) summary(model_garch_CAC40) # Extraire les résidus du modèle GARCH residuals_SP500 <- residuals(model_garch_SP500) residuals_FTSE100 <- residuals(model_garch_FTSE100) residuals_CAC40 <- residuals(model_garch_CAC40) # Visualiser les résidus (erreurs) sous forme de graphique linéaire par(mfrow = c(3, 1)) # Pour afficher 3 graphiques dans une même fenêtre plot(residuals_SP500, type = "l", col = "blue", main = "Résidus du modèle GARCH - S&P500", ylab = "Résidus", xlab = "Temps") plot(residuals_FTSE100, type = "l", col = "red", main = "Résidus du modèle GARCH - FTSE100", ylab = "Résidus", xlab = "Temps") plot(residuals_CAC40, type = "l", col = "green", main = "Résidus du modèle GARCH - CAC40", ylab = "Résidus", xlab = "Temps") # Tracer l'histogramme des résidus par(mfrow = c(3, 1)) # Affichage des 3 histogrammes hist(residuals_SP500, col = "blue", main = "Histogramme des Résidus - S&P500", xlab = "Résidus", ylab = "Fréquence", breaks = 50) hist(residuals_FTSE100, col = "red", main = "Histogramme des Résidus - FTSE100", xlab = "Résidus", ylab = "Fréquence", breaks = 50) hist(residuals_CAC40, col = "green", main = "Histogramme des Résidus - CAC40", xlab = "Résidus", ylab = "Fréquence", breaks = 50) # GARCH(1, 1) model specifications for each asset spec_garch <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(0, 0), include.mean = TRUE)) # Fit the GARCH model for each series fit_SP500 <- ugarchfit(spec_garch, returns_SP500) fit_FTSE100 <- ugarchfit(spec_garch, returns_FTSE100) fit_CAC40 <- ugarchfit(spec_garch, returns_CAC40) # DCC-GARCH specification spec_dcc <- dccspec(uspec = multispec(replicate(3, spec_garch)), dccOrder = c(1, 1), distribution = "mvnorm") # Fit the DCC-GARCH model fit_dcc <- dccfit(spec_dcc, data = cbind(returns_SP500, returns_FTSE100, returns_CAC40)) library(rmgarch) dcc_correlations <- rcorr(fit_dcc) # Plot the conditional correlations par(mfrow = c(3, 1)) # Plotting in a 3-row layout plot(dcc_correlations[, 1, 2], type = "l", col = "blue", main = "Conditional Correlation S&P500 vs FTSE100", ylab = "Correlation", xlab = "Time") plot(dcc_correlations[, 1, 3], type = "l", col = "red", main = "Conditional Correlation S&P500 vs CAC40", ylab = "Correlation", xlab = "Time") plot(dcc_correlations[, 2, 3], type = "l", col = "green", main = "Conditional Correlation FTSE100 vs CAC40", ylab = "Correlation", xlab = "Time") # Task 3 library(urca) data <- cbind(returns_CAC40, returns_SP500, returns_FTSE100) # Effectuer le test de Johansen pour les séries de rendements johansen_test <- ca.jo(data, type = "trace", K = 2, spec = "longrun", season = NULL) # Résultats du test de Johansen summary(johansen_test) # ___________________________________________ startDate <- Date[1] endDate <- Date[length(Date)] par(cex.axis = 1.5, cex.lab = 1.5, lwd = 1) par(mfrow=c(1,3)) # set the plotting area into a 1*2 array plot(Date, L_SP500, type = 'l', col="blue", xlab =" Date ", main ="SP500", ylab ="Log-prices", xlim=c(startDate, endDate), cex.axis=1.5, cex.main=1.5,cex.lab=1.5,lwd=1) par(new=TRUE) plot(Date, L_FTSE100, type = 'l', col="green", xlab =" Date ",main ="FTSE100", ylab ="Log-prices", xlim=c(startDate, endDate), cex.axis=1.5, cex.main=1.5,cex.lab=1.5,lwd=1) plot(Date, L_CAC40, type = 'l', col="red", xlab =" Date ",main ="CAC40", ylab ="Log-prices", xlim=c(startDate, endDate), cex.axis=1.5, cex.main=1.5,cex.lab=1.5,lwd=1) legend("bottomright", legend=c("SP500", "FTSE100","CAC40"), col=c("blue","green","red"), lty=1, cex=1, box.lty=1) # Histogramme par(mfrow=c(1,3)) hist(L_SP500, main = "SP500 Log Returns", xlab = "Log Returns", col = "blue", border = "black") hist(L_FTSE100, main = "FTSE100 Log Returns", xlab = "Log Returns", col = "green", border = "black") hist(L_CAC40, main = "CAC40 Log Returns", xlab = "Log Returns", col = "red", border = "black") # Box-plots par(mfrow=c(1,3)) boxplot(L_SP500, main = "SP500 Log Returns", ylab = "Log Returns", col = "blue") boxplot(L_FTSE100, main = "FTSE100 Log Returns", ylab = "Log Returns", col = "green") boxplot(L_CAC40, main = "CAC40 Log Returns", ylab = "Log Returns", col = "red") # Descriptive Statistics install.packages("psych") library(psych) Log_Prices<-data.frame(L_SP500, L_FTSE100,L_CAC40) describe(Log_Prices) # Autocorrelation function par(mfrow=c(2,2)) acf(L_SP500, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'ACF SP500', col="blue") acf(L_FTSE100, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'ACF FTSE100', col="green") acf(L_CAC40, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'ACF CAC40', col="red") pacf(L_SP500, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'PACF SP500', col="blue") pacf(L_FTSE100, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'PACF FTSE100', col="green") pacf(L_CAC40, lag.max=NULL, cex.axis=1, cex.main=1,cex.lab=1,lwd=5, main = 'PACF CAC40', col="red") # ADF Test ADF_SP500 = adf.test(L_SP500) ADF_FTSE100 = adf.test(L_FTSE100) ADF_CAC40 = adf.test(L_CAC40) print (ADF_SP500) print (ADF_FTSE100) print (ADF_CAC40) # _____________________________ # Task 2 # _____________________________
Leave a Comment