économétrie

 avatar
unknown
plain_text
a month ago
12 kB
4
Indexable
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