Last active
March 27, 2018 08:54
-
-
Save Demandrel/431b9c5b4dbf2419f5a757e0816b272c to your computer and use it in GitHub Desktop.
Calculs de rendements journaliers ajustés de stocks en R a partir des tickers
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#On install la librairie tidyquant qui nous aide à récupérer les données financiéres | |
install.packages("tidyquant") | |
#On charge la librairie pour pouvoir l'utiliser | |
library("tidyquant") | |
#On crée un vecteur qui contient nos tickers (REMARQUE : il s'agit des nom de tickers exacts de YAHOO finance) | |
tickers = c("CABK.MC","BBVA.MC") | |
#Date de départ à partir de laquelle récupérer les prix | |
date_start = as.Date("2015-01-01") | |
#Date de fin | |
date_end = as.Date("2018-03-20") | |
#on crée un nouvel environnement dans lequel seront créer les variables contenant les prix de chaque stock | |
data = new.env() | |
#On récupere tous les prix (ouvertures, cloture etc) de chaque stock et on les importent dans l'environnement data | |
getSymbols(Symbols = tickers, env = data, from = date_start, to = date_end) | |
#Comme on ne veut pas travailler avec l'environnment data et qu'on veut uniquement le prix | |
#de cloture ajusté, on va utiliser une fonction personnalisée qui nous renvois les prix | |
#ajustés dont nous avons besoins | |
#On déclare la fonction utilitaire qui fait ce travail | |
get_adjusted_prices_xts = function(tickers, env = parent.frame()) { | |
prices_time_series = xts() | |
for (index in 1:length(tickers)) { | |
#on extrait la série de prix du tickers de l'environnement spécifié, puis la série ajusté et on merge a l'objet xts de retour | |
ticket_prices_buffer = get(tickers[index], pos = env) | |
prices_time_series = merge.xts(prices_time_series,ticket_prices_buffer[,6]) | |
} | |
#On passe l'index en date de format européen | |
indexClass(prices_time_series) = "Date" | |
indexFormat(prices_time_series) = "%d-%m-%Y" | |
#On retourne le résultat | |
return(prices_time_series) | |
} | |
#On utilise alors cette fonction en donant la liste des tickers, l'environnement ou récupérer les données | |
price_series_daily = get_adjusted_prices_xts(tickers, env = data) | |
#Remarque : cette fonction retourn un objet de type xts et non un dataframe | |
#On affiche la série : | |
View(price_series_daily) | |
#GESTION DES DONNES MANQUANTES | |
# On fait une interpolation linéaire si il a y des trous dans la série | |
price_series_daily = na.approx(price_series_daily, na.rm = FALSE) | |
#Si des données sont manquantes en début de série (car l'action n'est pas coté par exemple) on met un prix à 0 | |
price_series_daily = na.fill(price_series_daily, 0) | |
#CALCUL DES RENDEMENTS | |
daily_returns = apply(price_series_daily, 2 , Return.calculate) | |
#On repasse les données au format xts et non matriciel car plus pratique pour travailler avec en R | |
daily_returns = as.xts(daily_returns, order.by = index(price_series_daily), indexClass = "Date", indexFormat = "%m-%y") | |
#On retire la première ligne car les rendements n'existent pas pour le premier mois | |
daily_returns = daily_returns[-1,] | |
#Les actifs non disponibles dont les valeurs NA ont été remplacés par 0 donnent des rendement NaN (division par 0) ou Inf (passage du prix de 0 à positif) | |
#On doit considérer ces rendements comme 0. On remplace donc les NA et NaN par 0 : | |
daily_returns = na.fill(daily_returns, 0) | |
#Les valeurs infinies doivent aussi être remplacées par 0 | |
daily_returns[is.infinite(daily_returns)] = 0 | |
#On transformer les données en dataframe : | |
daily_returns = data.frame(date = index(daily_returns), coredata(daily_returns)) | |
#EXPORTATION DES DONNEES | |
#on sauvegarde un dataset en format csv | |
write.csv(daily_returns, "monFicher.csv") | |
#Astuce : le fichier sera enregistré dans le répertoire de travail. Pour retrouver votre répertoire de travail, éxécuter la ligne suivante : | |
getwd() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment