# Installation des packages nécessaires (à exécuter une seule fois)
# install.packages(« quantmod »)
# Chargement des packages
library(quantmod)
# Fonction Black-Scholes pour évaluer les options
black_scholes <- function(S, K, r, T, sigma, type = « call ») {
# S: prix actuel de l’actif sous-jacent
# K: prix d’exercice
# r: taux d’intérêt sans risque (annuel)
# T: temps jusqu’à l’échéance (en années)
# sigma: volatilité de l’actif sous-jacent (annuelle)
# type: « call » ou « put »
d1 <- (log(S/K) + (r + sigma^2/2) * T) / (sigma * sqrt(T))
d2 <- d1 – sigma * sqrt(T)
if (type == « call ») {
# Formule pour l’option d’achat (call)
prix <- S * pnorm(d1) – K * exp(-r * T) * pnorm(d2)
} else {
# Formule pour l’option de vente (put)
prix <- K * exp(-r * T) * pnorm(-d2) – S * pnorm(-d1)
}
return(prix)
}
# Définition des dates (6 mois en arrière à partir d’aujourd’hui)
date_fin <- Sys.Date()
date_debut <- date_fin – 180 # environ 6 mois
# Téléchargement des données du CAC 40
cac40 <- getSymbols(« ^FCHI », src = « yahoo »,
from = date_debut,
to = date_fin,
auto.assign = FALSE)
# Extraction des prix de clôture
cac40_close <- Cl(cac40)
colnames(cac40_close) <- « CAC40 »
# Conversion en data frame
cac40_df <- data.frame(
Date = index(cac40_close),
Prix = as.numeric(cac40_close)
)
# Calcul des rendements journaliers
cac40_df <- cac40_df %>%
arrange(Date) %>%
mutate(Rendement = (Prix / lag(Prix) – 1) * 100)
# Calcul de la volatilité (écart-type des rendements journaliers)
volatilite_journaliere <- sd(cac40_df$Rendement, na.rm = TRUE)
volatilite_annuelle <- volatilite_journaliere * sqrt(252) # 252 jours de trading par an
# Récupération du prix actuel (dernière valeur)
S <- tail(cac40_df$Prix, 1)
# Utilisation de la volatilité calculée
sigma <- volatilite_annuelle / 100 # Conversion en décimal
# Affichage des paramètres
cat(« Prix actuel du CAC 40: », S, « \n »)
cat(« Volatilité annualisée: », volatilite_annuelle, « % (« , sigma, « )\n »)
# Paramètres pour le calcul de l’option
K <- 8100 # Prix d’exercice demandé
r <- 0.03 # Taux d’intérêt sans risque (3%, à ajuster selon le taux actuel)
T <- 3/12 # Durée jusqu’à l’échéance (3 mois = 0.25 an)
# Calcul du prix de l’option d’achat (call)
prix_call <- black_scholes(S, K, r, T, sigma, « call »)
# Calcul des Grecques
# Delta (sensibilité du prix de l’option par rapport au prix de l’actif sous-jacent)
delta_call <- function(S, K, r, T, sigma) {
d1 <- (log(S/K) + (r + sigma^2/2) * T) / (sigma * sqrt(T))
return(pnorm(d1))
}
# Gamma (taux de variation du delta)
gamma <- function(S, K, r, T, sigma) {
d1 <- (log(S/K) + (r + sigma^2/2) * T) / (sigma * sqrt(T))
return(dnorm(d1) / (S * sigma * sqrt(T)))
}
# Vega (sensibilité à la volatilité)
vega <- function(S, K, r, T, sigma) {
d1 <- (log(S/K) + (r + sigma^2/2) * T) / (sigma * sqrt(T))
return(S * dnorm(d1) * sqrt(T) / 100) # divisé par 100 pour exprimer en % de volatilité
}
# Thêta (sensibilité au temps)
theta_call <- function(S, K, r, T, sigma) {
d1 <- (log(S/K) + (r + sigma^2/2) * T) / (sigma * sqrt(T))
d2 <- d1 – sigma * sqrt(T)
return(-S * dnorm(d1) * sigma / (2 * sqrt(T)) – r * K * exp(-r * T) * pnorm(d2))
}
# Calcul des grecques pour notre option
delta_c <- delta_call(S, K, r, T, sigma)
gamma_val <- gamma(S, K, r, T, sigma)
vega_val <- vega(S, K, r, T, sigma)
theta_val <- theta_call(S, K, r, T, sigma) / 365 # Convertir en valeur journalière
# Affichage des résultats
cat(« \n—– RÉSULTATS POUR L’OPTION D’ACHAT (CALL) SUR LE CAC 40 —–\n »)
cat(« Prix d’exercice (Strike): », K, « \n »)
cat(« Temps jusqu’à l’échéance: », T*12, « mois\n »)
cat(« Taux sans risque: », r*100, « %\n\n »)
cat(« Prix de l’option d’achat (call): », round(prix_call, 2), « EUR\n\n »)
cat(« ——- GRECQUES ——-\n »)
cat(« Delta: », round(delta_c, 4), « \n »)
cat(« Gamma: », round(gamma_val, 6), « \n »)
cat(« Vega: », round(vega_val, 2), « (pour 1% de volatilité)\n »)
cat(« Theta: », round(theta_val, 2), « par jour\n »)
head(cac40)
tail(cac)
cac40