###############################################################################
# ANALYSE COMPARATIVE DES INDICES BOURSIERS CAC40, S&P500 ET NASDAQ
###############################################################################
# Ce script permet d'analyser et de comparer trois indices boursiers majeurs:
# - CAC40 (France)
# - S&P500 (États-Unis)
# - NASDAQ (États-Unis)
# L'analyse inclut la comparaison des performances, rendements et corrélations
# 1. CHARGEMENT DES BIBLIOTHÈQUES NÉCESSAIRES
###############################################################################
library(xts) # Gestion des séries temporelles
## Warning: le package 'xts' a été compilé avec la version R 4.2.3
## Le chargement a nécessité le package : zoo
## Warning: le package 'zoo' a été compilé avec la version R 4.2.3
##
## Attachement du package : 'zoo'
## Les objets suivants sont masqués depuis 'package:base':
##
## as.Date, as.Date.numeric
library(quantmod) # Analyse quantitative des données financières
## Warning: le package 'quantmod' a été compilé avec la version R 4.2.3
## Le chargement a nécessité le package : TTR
## Warning: le package 'TTR' a été compilé avec la version R 4.2.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(moments) # Calcul de moments statistiques (kurtosis, skewness)
# 2. COLLECTE DES DONNÉES
###############################################################################
# Création d'un environnement pour stocker les données téléchargées
mes_titres <- new.env(hash=TRUE)
# Définition des tickers des indices à analyser
tickers <- c("^FCHI", # CAC40
"^GSPC", # S&P500
"^IXIC") # NASDAQ
# Téléchargement des données à partir de Yahoo Finance
getSymbols(tickers,
from='2016-11-21', # Date de début
na.omit="F", # Conserver les valeurs manquantes
env=mes_titres) # Stockage dans l'environnement créé
## Warning: ^FCHI contains missing values. Some functions will not work if objects
## contain missing values in the middle of the series. Consider using na.omit(),
## na.approx(), na.fill(), etc to remove or replace them.
## [1] "FCHI" "GSPC" "IXIC"
# Vérification du nombre de lignes pour chaque indice
cat("Nombre d'observations par indice:\n")
## Nombre d'observations par indice:
cat("CAC40:", nrow(mes_titres$FCHI), "\n")
## CAC40: 2144
cat("S&P500:", nrow(mes_titres$GSPC), "\n")
## S&P500: 2103
cat("NASDAQ:", nrow(mes_titres$IXIC), "\n")
## NASDAQ: 2103
# 3. PRÉPARATION ET NETTOYAGE DES DONNÉES
###############################################################################
# Récupération des prix de clôture ajustés pour chaque indice
ClosePrices <- do.call(cbind, eapply(mes_titres, Ad)) # Prix de clôture ajustés
# Affichage des noms de colonnes pour vérification
cat("Noms des colonnes dans ClosePrices:", colnames(ClosePrices), "\n\n")
## Noms des colonnes dans ClosePrices: IXIC.Adjusted GSPC.Adjusted FCHI.Adjusted
# Interpolation linéaire pour remplacer les valeurs manquantes
# (jours fériés différents entre les pays)
Cac <- na.approx(ClosePrices[, "FCHI.Adjusted"]) # CAC40 ajusté
SP <- na.approx(ClosePrices[, "GSPC.Adjusted"]) # S&P500 ajusté
Nas <- na.approx(ClosePrices[, "IXIC.Adjusted"]) # NASDAQ ajusté
# Vérification qu'il ne reste plus de valeurs manquantes
cat("Nombre de valeurs NA restantes:\n")
## Nombre de valeurs NA restantes:
cat("CAC40:", sum(is.na(Cac)), "\n")
## CAC40: 0
cat("S&P500:", sum(is.na(SP)), "\n")
## S&P500: 0
cat("NASDAQ:", sum(is.na(Nas)), "\n\n")
## NASDAQ: 0
# 4. NORMALISATION DES INDICES (BASE 100) AVEC COMPARAISON DE PERFORMANCE
###############################################################################
# Conversion des indices en base 100 pour faciliter la comparaison
# Note: on utilise as.vector() pour éviter des problèmes liés à l'héritage de classe
# MÉTHODE 1: Approche vectorisée (recommandée pour R) - efficace et concise
start_time <- Sys.time() # Mesure du temps de début
Nas_100 <- (Nas) / as.vector(Nas[1]) * 100 # NASDAQ base 100
Cac_100 <- (Cac) / as.vector(Cac[1]) * 100 # CAC40 base 100
SP_100 <- (SP) / as.vector(SP[1]) * 100 # S&P500 base 100
end_time <- Sys.time() # Mesure du temps de fin
time_vectorized <- end_time - start_time
cat("Temps d'exécution méthode vectorisée (base 100):", time_vectorized, "secondes\n")
## Temps d'exécution méthode vectorisée (base 100): 0.002542973 secondes
# MÉTHODE 2: Alternative avec boucle (à titre pédagogique uniquement)
# Cette méthode est moins efficace en R mais aide à comprendre le concept
start_time <- Sys.time() # Mesure du temps de début
# Création de vecteurs vides pour stocker les valeurs en base 100
Nas_100_boucle <- numeric(length(Nas))
Cac_100_boucle <- numeric(length(Cac))
SP_100_boucle <- numeric(length(SP))
# Calcul des valeurs base 100 avec une boucle
for (i in 1:length(Nas)) {
Nas_100_boucle[i] <- Nas[i] / as.numeric(Nas[1]) * 100
Cac_100_boucle[i] <- Cac[i] / as.numeric(Cac[1]) * 100
SP_100_boucle[i] <- SP[i] / as.numeric(SP[1]) * 100
}
end_time <- Sys.time() # Mesure du temps de fin
time_loop <- end_time - start_time
cat("Temps d'exécution méthode avec boucle (base 100):", time_loop, "secondes\n")
## Temps d'exécution méthode avec boucle (base 100): 0.3115261 secondes
cat("Rapport de performance (boucle/vectorisé):", as.numeric(time_loop)/as.numeric(time_vectorized), "fois plus lent\n")
## Rapport de performance (boucle/vectorisé): 122.5047 fois plus lent
# Vérification que les deux méthodes donnent le même résultat
cat("Vérification base 100 NASDAQ (différence max):", max(abs(Nas_100 - Nas_100_boucle)), "\n\n")
## Vérification base 100 NASDAQ (différence max): 0
# Note: Nous utilisons les versions vectorisées (Nas_100, Cac_100, SP_100) pour la suite
# 5. CALCUL DES RENDEMENTS JOURNALIERS AVEC COMPARAISON DE PERFORMANCE
###############################################################################
# MÉTHODE 1: Méthode vectorisée avec fonction dailyReturn() (recommandée)
start_time <- Sys.time() # Mesure du temps de début
rend_nas <- dailyReturn(Nas) # Rendements journaliers du NASDAQ
rend_cac <- dailyReturn(Cac) # Rendements journaliers du CAC40
rend_sp <- dailyReturn(SP) # Rendements journaliers du S&P500
end_time <- Sys.time() # Mesure du temps de fin
time_dailyReturn <- end_time - start_time
cat("Temps d'exécution fonction dailyReturn():", time_dailyReturn, "secondes\n")
## Temps d'exécution fonction dailyReturn(): 0.1547122 secondes
# MÉTHODE 2: Alternative avec boucle (à titre pédagogique uniquement)
start_time <- Sys.time() # Mesure du temps de début
# Création de vecteurs vides pour stocker les rendements
rend_nas_boucle <- numeric(length(Nas) - 1)
rend_cac_boucle <- numeric(length(Cac) - 1)
rend_sp_boucle <- numeric(length(SP) - 1)
# Calcul des rendements journaliers avec une boucle
# Accès explicite aux valeurs numériques pour éviter les problèmes d'indexation avec xts
nas_values <- as.numeric(Nas)
cac_values <- as.numeric(Cac)
sp_values <- as.numeric(SP)
for (i in 2:length(nas_values)) {
rend_nas_boucle[i-1] <- (nas_values[i] / nas_values[i-1]) - 1
rend_cac_boucle[i-1] <- (cac_values[i] / cac_values[i-1]) - 1
rend_sp_boucle[i-1] <- (sp_values[i] / sp_values[i-1]) - 1
}
# Conversion en objets xts pour maintenir la structure temporelle
dates <- index(Nas)[-1] # On exclut la première date car pas de rendement pour J1
rend_nas_boucle <- xts(rend_nas_boucle, order.by = dates)
rend_cac_boucle <- xts(rend_cac_boucle, order.by = dates)
rend_sp_boucle <- xts(rend_sp_boucle, order.by = dates)
end_time <- Sys.time() # Mesure du temps de fin
time_loop_returns <- end_time - start_time
cat("Temps d'exécution méthode avec boucle (rendements):", time_loop_returns, "secondes\n")
## Temps d'exécution méthode avec boucle (rendements): 0.01722908 secondes
cat("Rapport de performance (boucle/dailyReturn):", as.numeric(time_loop_returns)/as.numeric(time_dailyReturn), "fois plus lent\n")
## Rapport de performance (boucle/dailyReturn): 0.1113621 fois plus lent
# Vérification que les deux méthodes donnent le même résultat
cat("Vérification rendements NASDAQ (différence max):", max(abs(rend_nas - rend_nas_boucle)), "\n\n")
## Vérification rendements NASDAQ (différence max): 0
# Note: Nous utilisons les versions vectorisées (rend_nas, rend_cac, rend_sp) pour la suite
# 6. VISUALISATION DES PERFORMANCES (BASE 100)
###############################################################################
# Configuration pour graphique unique (réinitialisation de la configuration graphique)
par(mfrow = c(1, 1))
# Calcul des valeurs minimale et maximale pour ajuster l'échelle du graphique
min_value <- min(min(Cac_100), min(Nas_100), min(SP_100))
max_value <- max(max(Cac_100), max(Nas_100), max(SP_100))
# Ajout d'une marge de 5% pour la lisibilité
y_min <- floor(min_value * 0.95)
y_max <- ceiling(max_value * 1.05)
# Graphique 1: Indices en base 100 avec échelle ajustée dynamiquement
plot(Cac_100,
ylim=c(y_min, y_max),
main='Performance des indices (Base 100)',
ylab="Valeur (Base 100)",
xlab="Date")

lines(Nas_100, col='blue')

lines(SP_100, col='red')

addLegend("topleft", on=1,
legend.names = c("CAC", "Nasdaq", "SP500"),
lty=c(1, 1, 1),
lwd=c(2, 1, 1),
col=c("black", "blue", "red"))

# Pause pour visualiser le graphique avant de passer au suivant
cat("Premier graphique affiché: Performances en base 100\n")
## Premier graphique affiché: Performances en base 100
cat("Appuyez sur [Entrée] pour afficher le graphique suivant...\n")
## Appuyez sur [Entrée] pour afficher le graphique suivant...
# 7. VISUALISATION DES RENDEMENTS JOURNALIERS
###############################################################################
# Graphique 2: Rendements journaliers
plot(rend_nas,
main='Rendements Journaliers',
ylab="Rendement",
xlab="Date")

lines(rend_cac, col='red')

lines(rend_sp, col='blue')

addLegend("topleft", on=1,
legend.names = c("Nasdaq", "CAC", "SP500"),
lty=c(1, 1, 1),
lwd=c(2, 1, 1),
col=c("black", "red", "blue"))

# Pause pour visualiser le graphique avant de passer au suivant
cat("Deuxième graphique affiché: Rendements journaliers\n")
## Deuxième graphique affiché: Rendements journaliers
cat("Appuyez sur [Entrée] pour afficher le graphique suivant...\n")
## Appuyez sur [Entrée] pour afficher le graphique suivant...
# 8. ANALYSE DE RÉGRESSION ENTRE LES INDICES
###############################################################################
# Toutes les régressions possibles entre les trois indices
# Création d'un tableau pour comparer les résultats des régressions
cat("\n--- TABLEAU COMPARATIF DES RÉGRESSIONS ---\n")
##
## --- TABLEAU COMPARATIF DES RÉGRESSIONS ---
cat("Variable dépendante | Variable explicative | Coefficient | R² ajusté\n")
## Variable dépendante | Variable explicative | Coefficient | R² ajusté
cat("------------------- | ------------------- | ----------- | ---------\n")
## ------------------- | ------------------- | ----------- | ---------
# Modèle 1: Régression du CAC40 sur le NASDAQ
lm1 <- lm(rend_cac ~ rend_nas)
cat("CAC40 | NASDAQ | ",
round(lm1$coefficients[2], 4), " | ",
round(summary(lm1)$adj.r.squared, 4), "\n")
## CAC40 | NASDAQ | 0.3813 | 0.2257
# Modèle 2: Régression du CAC40 sur le S&P500
lm2 <- lm(rend_cac ~ rend_sp)
cat("CAC40 | S&P500 | ",
round(lm2$coefficients[2], 4), " | ",
round(summary(lm2)$adj.r.squared, 4), "\n")
## CAC40 | S&P500 | 0.5426 | 0.3117
# Modèle 3: Régression du NASDAQ sur le S&P500
lm3 <- lm(rend_nas ~ rend_sp)
cat("NASDAQ | S&P500 | ",
round(lm3$coefficients[2], 4), " | ",
round(summary(lm3)$adj.r.squared, 4), "\n")
## NASDAQ | S&P500 | 1.1466 | 0.8963
# Modèle 4: Régression du S&P500 sur le CAC40
lm4 <- lm(rend_sp ~ rend_cac)
cat("S&P500 | CAC40 | ",
round(lm4$coefficients[2], 4), " | ",
round(summary(lm4)$adj.r.squared, 4), "\n")
## S&P500 | CAC40 | 0.5751 | 0.3117
# Modèle 5: Régression du S&P500 sur le NASDAQ
lm5 <- lm(rend_sp ~ rend_nas)
cat("S&P500 | NASDAQ | ",
round(lm5$coefficients[2], 4), " | ",
round(summary(lm5)$adj.r.squared, 4), "\n")
## S&P500 | NASDAQ | 0.7818 | 0.8963
# Modèle 6: Régression du NASDAQ sur le CAC40
lm6 <- lm(rend_nas ~ rend_cac)
cat("NASDAQ | CAC40 | ",
round(lm6$coefficients[2], 4), " | ",
round(summary(lm6)$adj.r.squared, 4), "\n")
## NASDAQ | CAC40 | 0.5927 | 0.2257
# Identifie la régression avec le meilleur R² ajusté
all_models <- list(lm1, lm2, lm3, lm4, lm5, lm6)
model_names <- c("CAC ~ NASDAQ", "CAC ~ S&P500", "NASDAQ ~ S&P500",
"S&P500 ~ CAC", "S&P500 ~ NASDAQ", "NASDAQ ~ CAC")
r2_values <- sapply(all_models, function(m) summary(m)$adj.r.squared)
best_model_index <- which.max(r2_values)
cat("\nMeilleur modèle:", model_names[best_model_index],
"avec R² ajusté =", round(r2_values[best_model_index], 4), "\n")
##
## Meilleur modèle: NASDAQ ~ S&P500 avec R² ajusté = 0.8963
# 9. VISUALISATION DE LA RÉGRESSION NASDAQ ~ S&P500
###############################################################################
# Conversion en data.frame pour le graphique
data3 <- as.data.frame(cbind(rend_sp, rend_cac, rend_nas))
# Nuage de points avec droite de régression
plot(data3[, 1], data3[, 3],
main="Sensibilité du NASDAQ au S&P500",
xlab="Rendement S&P500",
ylab="Rendement NASDAQ",
pch=8,
cex=0.3)
abline(lm3, col='blue')
# Ajout d'informations sur le modèle
text(-0.08, 0.06,
paste("R_Nasdaq =", round(lm3$coefficients[1], 4),
"+ R_S&P500 *", round(lm3$coefficients[2], 4)),
col="blue",
cex=0.6)
text(-0.08, 0.04,
paste("R² ajusté =", round(summary(lm3)$adj.r.squared, 3)),
col="blue",
cex=0.6)
grid(NULL, NULL)

# 10. LIMITES DE LA DÉMARCHE DE COMPARAISON INTERNATIONALE
###############################################################################
# Cette analyse comparative présente plusieurs limites méthodologiques importantes:
# A. Absence de prise en compte des taux de change
# Les indices sont comparés dans leurs devises d'origine (Euro pour CAC40, USD pour S&P500 et NASDAQ)
# Sans correction du taux de change EUR/USD, les performances relatives peuvent être biaisées:
# - Une appréciation de l'Euro face au Dollar améliorerait artificiellement la performance relative du CAC40
# - Une dépréciation de l'Euro face au Dollar détériorerait artificiellement la performance relative du CAC40
# Pour une comparaison plus pertinente, il faudrait:
# 1. Convertir tous les indices dans une devise commune
# 2. Ou inclure les variations du taux de change dans l'analyse
# B. Non-ajustement de l'inflation
# Les rendements nominaux ne reflètent pas le pouvoir d'achat réel des investisseurs:
# - Des taux d'inflation différents entre zones Euro et USA affectent les rendements réels
# - En période de forte inflation, les rendements nominaux surestiment la performance réelle
# Pour une analyse plus précise, il faudrait:
# 1. Calculer les rendements réels en soustrayant l'inflation de chaque zone
# 2. Comparer les indices en termes de pouvoir d'achat
# C. Autres limites non abordées
# - Composition différente des indices (secteurs, pondérations)
# - Biais de survivance dans les indices
# - Différences de traitement des dividendes
# - Spécificités réglementaires et fiscales des marchés
# - Différences de fuseaux horaires et heures d'ouverture des marchés
# 10. ANALYSE DESCRIPTIVE DES DISTRIBUTIONS DE RENDEMENTS
###############################################################################
# Configuration pour afficher 3 graphiques côte à côte
par(mfrow = c(1, 3))
# Histogrammes des rendements
hist(rend_cac, 50,
col='cyan',
main="Rendements CAC40",
xlab="Rendement")
hist(rend_nas, 50,
col='red',
main="Rendements NASDAQ",
xlab="Rendement")
hist(rend_sp, 50,
col='green',
main="Rendements S&P500",
xlab="Rendement")

# Statistiques descriptives sur les distributions
cat("\n--- STATISTIQUES DESCRIPTIVES DES RENDEMENTS ---\n")
##
## --- STATISTIQUES DESCRIPTIVES DES RENDEMENTS ---
cat("Indice | Moyenne | Écart-type | Kurtosis | Skewness | Min | Max \n")
## Indice | Moyenne | Écart-type | Kurtosis | Skewness | Min | Max
cat("------ | ------- | ---------- | -------- | -------- | --- | --- \n")
## ------ | ------- | ---------- | -------- | -------- | --- | ---
# CAC40
cat("CAC40 | ",
round(mean(rend_cac), 6), " | ",
round(sd(rend_cac), 6), " | ",
round(kurtosis(rend_cac), 2), " | ",
round(skewness(rend_cac), 2), " | ",
round(min(rend_cac), 4), " | ",
round(max(rend_cac), 4), "\n")
## CAC40 | 0.000301 | 0.011119 | 16.66 | -0.7 | -0.1228 | 0.0839
# NASDAQ
cat("NASDAQ | ",
round(mean(rend_nas), 6), " | ",
round(sd(rend_nas), 6), " | ",
round(kurtosis(rend_nas), 2), " | ",
round(skewness(rend_nas), 2), " | ",
round(min(rend_nas), 4), " | ",
round(max(rend_nas), 4), "\n")
## NASDAQ | 0.000617 | 0.013863 | 10.46 | -0.48 | -0.1232 | 0.0935
# S&P500
cat("S&P500 | ",
round(mean(rend_sp), 6), " | ",
round(sd(rend_sp), 6), " | ",
round(kurtosis(rend_sp), 2), " | ",
round(skewness(rend_sp), 2), " | ",
round(min(rend_sp), 4), " | ",
round(max(rend_sp), 4), "\n")
## S&P500 | 0.000481 | 0.011447 | 18.62 | -0.58 | -0.1198 | 0.0938
# Réinitialisation de la configuration graphique
par(mfrow = c(1, 1))
cat("\nSkewness (indique l'asymétrie de la distribution):\n")
##
## Skewness (indique l'asymétrie de la distribution):
cat("CAC40:", skewness(rend_cac), "\n")
## CAC40: -0.6984422
cat("NASDAQ:", skewness(rend_nas), "\n")
## NASDAQ: -0.4803873
cat("S&P500:", skewness(rend_sp), "\n")
## S&P500: -0.5778595
# 12. EXTENSION POSSIBLE : CORRECTION DES TAUX DE CHANGE ET DE L'INFLATION
###############################################################################
# Voici comment le code pourrait être étendu pour intégrer ces facteurs:
# Code commenté - pour démonstration uniquement
# Pour une analyse complète, il faudrait:
# 1. Télécharger les données de taux de change EUR/USD
# getSymbols("EUR=X", from='2016-11-21', env=mes_titres)
# fx_eurusd <- na.approx(mes_titres###############################################################################
# ANALYSE COMPARATIVE DES INDICES BOURSIERS CAC40, S&P500 ET NASDAQ
###############################################################################
# Ce script permet d'analyser et de comparer trois indices boursiers majeurs:
# - CAC40 (France)
# - S&P500 (États-Unis)
# - NASDAQ (États-Unis)
# L'analyse inclut la comparaison des performances, rendements et corrélations
# 1. CHARGEMENT DES BIBLIOTHÈQUES NÉCESSAIRES
###############################################################################
library(xts) # Gestion des séries temporelles
library(quantmod) # Analyse quantitative des données financières
library(moments) # Calcul de moments statistiques (kurtosis, skewness)
# 2. COLLECTE DES DONNÉES
###############################################################################
# Création d'un environnement pour stocker les données téléchargées
mes_titres <- new.env(hash=TRUE)
# Définition des tickers des indices à analyser
tickers <- c("^FCHI", # CAC40
"^GSPC", # S&P500
"^IXIC") # NASDAQ
# Téléchargement des données à partir de Yahoo Finance
getSymbols(tickers,
from='2016-11-21', # Date de début
na.omit="F", # Conserver les valeurs manquantes
env=mes_titres) # Stockage dans l'environnement créé
## Warning: ^FCHI contains missing values. Some functions will not work if objects
## contain missing values in the middle of the series. Consider using na.omit(),
## na.approx(), na.fill(), etc to remove or replace them.
## [1] "FCHI" "GSPC" "IXIC"
# Vérification du nombre de lignes pour chaque indice
cat("Nombre d'observations par indice:\n")
## Nombre d'observations par indice:
cat("CAC40:", nrow(mes_titres$FCHI), "\n")
## CAC40: 2144
cat("S&P500:", nrow(mes_titres$GSPC), "\n")
## S&P500: 2103
cat("NASDAQ:", nrow(mes_titres$IXIC), "\n")
## NASDAQ: 2103
# 3. PRÉPARATION ET NETTOYAGE DES DONNÉES
###############################################################################
# Fusion des données des trois indices
data1 <- merge(mes_titres$GSPC, mes_titres$IXIC, mes_titres$FCHI)
# Interpolation linéaire pour remplacer les valeurs manquantes
# (jours fériés différents entre les pays)
Cac <- na.approx(data1$FCHI.Adjusted) # CAC40 ajusté
SP <- na.approx(data1$GSPC.Adjusted) # S&P500 ajusté
Nas <- na.approx(data1$IXIC.Adjusted) # NASDAQ ajusté
# Récupération des prix de clôture
ClosePrices <- do.call(cbind, eapply(mes_titres, Cl))
# 4. NORMALISATION DES INDICES (BASE 100)
###############################################################################
# Conversion des indices en base 100 pour faciliter la comparaison
# Note: on utilise as.vector() pour éviter des problèmes liés à l'héritage de classe
Nas_100 <- (Nas) / as.vector(Nas[1]) * 100 # NASDAQ base 100
Cac_100 <- (Cac) / as.vector(Cac[1]) * 100 # CAC40 base 100
SP_100 <- (SP) / as.vector(SP[1]) * 100 # S&P500 base 100
# 5. CALCUL DES RENDEMENTS JOURNALIERS
###############################################################################
rend_nas <- dailyReturn(Nas) # Rendements journaliers du NASDAQ
rend_cac <- dailyReturn(Cac) # Rendements journaliers du CAC40
rend_sp <- dailyReturn(SP) # Rendements journaliers du S&P500
# 6. VISUALISATION DES PERFORMANCES (BASE 100)
###############################################################################
# Graphique des indices en base 100
plot(Cac_100,
ylim=c(90, 320),
main='Performance des indices (Base 100)',
ylab="Valeur (Base 100)",
xlab="Date")

lines(Nas_100, col='blue')

lines(SP_100, col='red')

addLegend("topleft",
legend.names = c("CAC40", "NASDAQ", "S&P500"),
lty=c(1, 1, 1),
lwd=c(2, 2, 2),
col=c("black", "blue", "red"))

# 7. VISUALISATION DES RENDEMENTS JOURNALIERS
###############################################################################
plot(rend_nas,
main='Rendements Journaliers',
ylab="Rendement",
xlab="Date")

lines(rend_cac, col='red')

lines(rend_sp, col='blue')

addLegend("topleft",
legend.names = c("NASDAQ", "CAC40", "S&P500"),
lty=c(1, 1, 1),
lwd=c(2, 2, 2),
col=c("black", "red", "blue"))

# 8. ANALYSE DE RÉGRESSION ENTRE LES INDICES
###############################################################################
# Modèle 1: Régression du CAC40 sur le NASDAQ
lm1 <- lm(rend_cac ~ rend_nas)
cat("\n--- Régression CAC40 ~ NASDAQ ---\n")
##
## --- Régression CAC40 ~ NASDAQ ---
print(summary(lm1))
##
## Call:
## lm(formula = rend_cac ~ rend_nas)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.086857 -0.004659 0.000278 0.004809 0.081431
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.606e-05 2.106e-04 0.314 0.754
## rend_nas 3.813e-01 1.518e-02 25.121 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.009785 on 2161 degrees of freedom
## Multiple R-squared: 0.226, Adjusted R-squared: 0.2257
## F-statistic: 631.1 on 1 and 2161 DF, p-value: < 2.2e-16
# Modèle 2: Régression du CAC40 sur le S&P500
lm2 <- lm(rend_cac ~ rend_sp)
cat("\n--- Régression CAC40 ~ S&P500 ---\n")
##
## --- Régression CAC40 ~ S&P500 ---
print(summary(lm2))
##
## Call:
## lm(formula = rend_cac ~ rend_sp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.071198 -0.004437 0.000230 0.004662 0.073624
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 4.031e-05 1.985e-04 0.203 0.839
## rend_sp 5.426e-01 1.733e-02 31.309 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.009225 on 2161 degrees of freedom
## Multiple R-squared: 0.3121, Adjusted R-squared: 0.3117
## F-statistic: 980.3 on 1 and 2161 DF, p-value: < 2.2e-16
# Modèle 3: Régression du NASDAQ sur le S&P500
lm3 <- lm(rend_nas ~ rend_sp)
cat("\n--- Régression NASDAQ ~ S&P500 ---\n")
##
## --- Régression NASDAQ ~ S&P500 ---
print(summary(lm3))
##
## Call:
## lm(formula = rend_nas ~ rend_sp)
##
## Residuals:
## Min 1Q Median 3Q Max
## -0.0287341 -0.0023199 0.0001817 0.0024889 0.0307816
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## (Intercept) 6.548e-05 9.608e-05 0.682 0.496
## rend_sp 1.147e+00 8.387e-03 136.701 <2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 0.004464 on 2161 degrees of freedom
## Multiple R-squared: 0.8963, Adjusted R-squared: 0.8963
## F-statistic: 1.869e+04 on 1 and 2161 DF, p-value: < 2.2e-16
# 9. VISUALISATION DE LA RÉGRESSION NASDAQ ~ S&P500
###############################################################################
# Conversion en data.frame pour le graphique
data3 <- as.data.frame(cbind(rend_sp, rend_cac, rend_nas))
# Nuage de points avec droite de régression
plot(data3[, 1], data3[, 3],
main="Sensibilité du NASDAQ au S&P500",
xlab="Rendement S&P500",
ylab="Rendement NASDAQ",
pch=8,
cex=0.3)
abline(lm3, col='blue')
# Ajout d'informations sur le modèle
text(-0.08, 0.06,
paste("R_Nasdaq =", round(lm3$coefficients[1], 4),
"+ R_S&P500 *", round(lm3$coefficients[2], 4)),
col="blue",
cex=0.6)
text(-0.08, 0.04,
paste("R² ajusté =", round(summary(lm3)$adj.r.squared, 3)),
col="blue",
cex=0.6)
grid(NULL, NULL)

# 10. LIMITES DE LA DÉMARCHE DE COMPARAISON INTERNATIONALE
###############################################################################
# Cette analyse comparative présente plusieurs limites méthodologiques importantes:
# A. Absence de prise en compte des taux de change
# Les indices sont comparés dans leurs devises d'origine (Euro pour CAC40, USD pour S&P500 et NASDAQ)
# Sans correction du taux de change EUR/USD, les performances relatives peuvent être biaisées:
# - Une appréciation de l'Euro face au Dollar améliorerait artificiellement la performance relative du CAC40
# - Une dépréciation de l'Euro face au Dollar détériorerait artificiellement la performance relative du CAC40
# Pour une comparaison plus pertinente, il faudrait:
# 1. Convertir tous les indices dans une devise commune
# 2. Ou inclure les variations du taux de change dans l'analyse
# B. Non-ajustement de l'inflation
# Les rendements nominaux ne reflètent pas le pouvoir d'achat réel des investisseurs:
# - Des taux d'inflation différents entre zones Euro et USA affectent les rendements réels
# - En période de forte inflation, les rendements nominaux surestiment la performance réelle
# Pour une analyse plus précise, il faudrait:
# 1. Calculer les rendements réels en soustrayant l'inflation de chaque zone
# 2. Comparer les indices en termes de pouvoir d'achat
# C. Autres limites non abordées
# - Composition différente des indices (secteurs, pondérations)
# - Biais de survivance dans les indices
# - Différences de traitement des dividendes
# - Spécificités réglementaires et fiscales des marchés
# - Différences de fuseaux horaires et heures d'ouverture des marchés