économétrie
unknown
plain_text
a year ago
12 kB
8
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
# _____________________________
Editor is loading...
Leave a Comment