Charger des données de prix : fichiers CSV et API gratuites, prix ajustés et non ajustés, valeurs manquantes et fuseaux horaires
Lisez des fichiers de prix et des téléchargements d'API dans un DataFrame propre, comprenez le fonctionnement des ajustements pour splits et dividendes, et traitez correctement les trous et les fuseaux horaires.
Ce que vous allez apprendre
- Comment lire un fichier CSV dans un DataFrame avec des dates correctes, et quels arguments corrigent les problèmes d'import habituels.
- Ce que vous apportent les API de données gratuites, ce que signifient leurs licences et leurs paramètres par défaut, et comment mettre les téléchargements en cache.
- Comment se calculent les facteurs d'ajustement pour splits et dividendes, et pourquoi un backtest a besoin de prix ajustés alors qu'un ordre réel a besoin de prix non ajustés.
- Comment repérer et traiter les valeurs manquantes, et comment localiser et convertir les fuseaux horaires sans décaler vos barres.
Explication
Fichiers CSV. Un fichier CSV (comma-separated values, valeurs séparées par des virgules) est un fichier texte comportant une ligne par barre. L'appel clé est :
df = pd.read_csv("data/raw/xyz.csv", parse_dates=["Date"], index_col="Date")
parse_dates convertit la colonne de texte en timestamps et index_col en fait l'index. Corrections fréquentes : sep=";" et decimal="," pour les exports allemands, dayfirst=True pour des dates comme 03.04.2025, et date_format="%d.%m.%Y" lorsque l'interprétation des dates est erronée. Après le chargement, exécutez df = df.sort_index() (certains exports commencent par la date la plus récente), vérifiez df.index.is_unique et mettez les noms de colonnes en minuscules avec df.columns = df.columns.str.lower().
API gratuites. Une API (application programming interface, interface de programmation) permet à du code de demander des données à un serveur. Pour un premier projet, la bibliothèque yfinance (données de Yahoo Finance) est le choix habituel : yf.download("SAP.DE", start="2015-01-01") ; elle est destinée à la recherche personnelle et son exactitude n'est pas garantie. Un paramètre par défaut compte : en 2026, auto_adjust=True, de sorte que l'ouverture, le plus haut, le plus bas et la clôture sont déjà ajustés des splits et des dividendes et qu'il n'existe pas de colonne « Adj Close » ; avec auto_adjust=False, vous obtenez des OHLC ajustés des splits plus une colonne « Adj Close » qui inclut aussi les dividendes. Parmi les alternatives dotées d'une offre gratuite figurent Stooq (téléchargements CSV), Alpha Vantage et Tiingo (inscription et clé d'API obligatoires, limites de requêtes strictes) ; les conditions changent, vérifiez donc celles en vigueur, et la leçon 12 traite de la gestion des clés et des limites de requêtes. Quelle que soit la source, enregistrez une seule fois le téléchargement brut dans data/raw/ (CSV ou Parquet) et travaillez à partir du fichier ; les fournisseurs révisent l'historique, et les quotas sont rares.
Ajusté ou non ajusté. Le cours Trading systématique expliquait pourquoi les splits et les dividendes faussent les backtests ; voici comment fonctionne la correction. Pour un split de n pour 1, chaque prix antérieur est divisé par n (et le volume multiplié par n). Pour un dividende en espèces D dont la date de détachement est le jour t, la méthode standard multiplie tous les prix antérieurs au jour t par le facteur 1 − D ÷ C, où C est la clôture du dernier jour précédant la date de détachement. Les ajustements se cumulent en remontant le temps. Conséquences : l'historique ajusté change à chaque nouveau dividende, et les rendements en pourcentage sont corrects alors que les niveaux de prix en euros ne le sont pas. Règle : backtestez sur des données ajustées, passez les ordres réels à des prix non ajustés, et ne mélangez jamais les deux dans un même calcul.
Valeurs manquantes. pandas marque les trous par NaN. Repérez-les avec df.isna().sum(). Combler quelques trous de prix par report de la dernière valeur avec df["close"].ffill() est acceptable, mais ne reportez jamais le volume, et n'interpolez jamais les prix, car l'interpolation utilise la valeur future et introduit un biais d'anticipation (look-ahead bias, leçon 7). Sinon, supprimez les lignes avec df.dropna(subset=["close"]) et notez combien il y en a. Notez que l'ancienne syntaxe fillna(method="ffill") est dépréciée depuis pandas 2.1 et ne doit pas être utilisée dans du nouveau code ; écrivez .ffill().
Fuseaux horaires. Les barres journalières en ont rarement besoin ; les données intraday toujours. tz_localize("Europe/Berlin") attache un fuseau à un index naïf sans modifier les heures ; tz_convert("America/New_York") modifie les heures. Localiser par erreur des données UTC sur Berlin décale silencieusement chaque barre d'une ou deux heures ; consultez donc la documentation du fournisseur. Les dates de passage à l'heure d'été diffèrent entre l'Europe et les États-Unis, et c'est à ces moments que des timestamps mal gérés désalignent les instruments.
Exemple commenté
Exemple hypothétique : une action clôture à €50.00 le lundi. Un dividende de €1.00 est détaché le mardi, jour où l'action clôture à €49.50. Frais et impôts ignorés.
Facteur d'ajustement = 1 − 1.00 ÷ 50.00 = 0.98. Tous les prix antérieurs au mardi sont multipliés par 0.98 : la clôture du lundi devient 50 × 0.98 = €49.00 ; une clôture de €48.00 de la semaine précédente devient 48 × 0.98 = €47.04.
Rendement sur la date de détachement : non ajusté, (49.50 − 50.00) ÷ 50.00 = −1.0%, ce qui ressemble à tort à une perte. Ajusté, (49.50 − 49.00) ÷ 49.00 = +1.02%, ce qui reflète correctement €1.00 d'espèces reçues face à une baisse de prix de €0.50 (net +€0.50 sur €50 ; le petit écart s'explique par le fait que la base ajustée est de €49).
Prenons maintenant un split de 2 pour 1 : clôtures brutes de 100, 102, 104 avant et de 52, 53 après. Diviser les prix d'avant le split par 2 donne 50, 51, 52, 52, 53, une série continue. Sans cela, pct_change() affiche un rendement de −50% le jour du split, un krach qui n'a jamais eu lieu.
Erreur fréquente
info(), head(), tail(), isna().sum() et à un graphique en ligne de la clôture.Exercice pratique
Sur papier : une action clôture à €90.00 puis €93.00 sur deux jours, puis connaît un split de 3 pour 1, puis clôture à €31.00 et €30.38 (hypothétique). Le jour de la clôture à €30.38, un dividende de €0.60 est détaché, et la clôture précédente était de €31.00. (a) Écrivez les valeurs ajustées du split des deux clôtures d'avant le split. (b) Calculez le facteur d'ajustement du dividende et appliquez-le aux trois clôtures antérieures à la date de détachement. (c) Indiquez le rendement brut et le rendement entièrement ajusté de la clôture à €31.00 à la clôture à €30.38.
Afficher la solution
(a) Divisez par 3 : €90.00 → €30.00 et €93.00 → €31.00.
(b) Facteur = 1 − 0.60 ÷ 31.00 = 0.98065 (arrondi). En l'appliquant : 30.00 × 0.98065 = €29.42 ; 31.00 × 0.98065 = €30.40 ; et la clôture à €31.00 d'avant la date de détachement devient elle aussi €30.40. La clôture à €30.38 reste inchangée.
(c) Brut : (30.38 − 31.00) ÷ 31.00 = −2.00%. Ajusté : (30.38 − 30.40) ÷ 30.40 = −0.07%, soit quasiment stable : le prix a baissé d'environ le montant du dividende, si bien que le détenteur n'a presque rien perdu en rendement total.
Limites : les fournisseurs arrondissent les facteurs différemment et certains utilisent un autre prix de référence ; utilisez de manière cohérente la série ajustée d'un seul fournisseur.
Points clés à retenir
- Chargez avec
parse_datesetindex_col, puis triez, vérifiez l'unicité et normalisez les noms de colonnes. - Téléchargez une seule fois, enregistrez les données brutes en local, et lisez la licence de l'API ainsi que ses paramètres d'ajustement par défaut (yfinance :
auto_adjust=Trueen 2026). - Facteur de split 1 ÷ n, facteur de dividende 1 − D ÷ C, appliqués en remontant le temps ; backtestez sur des prix ajustés, tradez sur des prix non ajustés.
- Comblez au plus quelques trous de prix par report, n'interpolez jamais, ne reportez jamais le volume, et localisez les fuseaux horaires une seule fois avec le fuseau réel du fournisseur.
Étape suivante
La leçon 5 transforme les prix en rendements : rendements simples ou logarithmiques, rendements cumulés, rendement et volatilité annualisés, et fenêtres glissantes.
Auto-évaluation
Répondez aux questions, puis vérifiez vos réponses. Vous pouvez recommencer autant de fois que vous le souhaitez.
Auto-évaluation automatique pour vos propres révisions. Vos réponses sont vérifiées dans votre navigateur ; nous ne les voyons pas et ne les évaluons pas. Ce n'est ni un examen ni une qualification.
Votre progression
« Terminée » signifie seulement que vous avez marqué la leçon comme lue. Ce n'est pas un test de votre compréhension. La progression et les notes sont enregistrées uniquement dans ce navigateur, sur cet appareil — pas dans un compte.