L’analyse boursière ou la valorisation de portefeuilles-titres cotés nécessite d’obtenir les cours de bourse. Yahoo Finance diffuse gratuitement de nombreuses informations et actualités sur les indices boursiers, les taux, les cours de matières premières, de devises, d’actions, d’OPCVM, de trackers, de dérivés… Ces données sont aisément interrogeables à l’aide de requêtes web grâce à Power Query (Excel). En présence de portefeuilles comprenant de nombreuses lignes, l’automatisation de la collecte des données boursières est pertinente.
L’objectif de cet article est de présenter une solution prête à l’emploi qui automatise la collecte des cotations boursières d’une société cotée et la mise à jour de leur représentation graphique. Cet article s’appuie sur Power Query et les techniques de requête web abordés dans un précédent article.
Le programme VBA est d’un fonctionnement relativement simple.
Dans un premier temps, le programme va lire les paramètres saisis par l’utilisateur dans la feuille de travail Excel (code valeur, dates de début et de fin de cotation) :
'Lecture des paramètres Dans la feuille Excel CodeValeur = Sheets("Paramètres").Range("B2").Value DateDébut = Sheets("Paramètres").Range("B3").Value DateFin = Sheets("Paramètres").Range("B4").Value
Par exemple, le code valeur situé en cellule B2 est stocké dans la variable CodeValeur à l’aide de la commande Sheets(“Paramètres”).Range(“B2”).Value.
Dans un second temps, les dates de début et de fin sont calculées au format timestamp UNIX (dont le principe est présenté dans l’article Lire les données boursières Yahoo Finance à l’aide d’une requête web et de Power Query).
'Calcul des dates Unix (utilisées par la requête Yahoo) DateDébutUNIX = (DateDébut - DateSerial(1970, 1, 1)) * 86400 DateFinUNIX = (DateFin - DateSerial(1970, 1, 1)) * 86400
Ensuite, en fonction des paramètres indiqués ci-avant, la requête Yahoo Finance est calculée à la volée (le fonctionnement des requêtes web Yahoo Finance est expliqué dans l’article Lire les données boursières Yahoo Finance à l’aide d’une requête web et de Power Query) :
'Calcul de la requête Yahoo RequêteYahoo = "https://query1.finance.yahoo.com/v7/finance/download/" & CodeValeur & "?period1=" & DateDébutUNIX & "&period2=" & DateFinUNIX & "&interval=1d&events=history&includeAdjustedClose=true"
Avant de créer la requête, l’ancienne est effacée (.Delete) :
ActiveWorkbook.Queries(NomRequête).Delete
Le texte de la requête est déclaré (.Queries.Add Name:=NomRequête, Formula:=) :
ActiveWorkbook.Queries.Add Name:=NomRequête, Formula:= _ "let" & Chr(13) & "" & Chr(10) & _ " Source = Csv.Document(Web.Contents(""" & RequêteYahoo & """),[Delimiter="","", Columns=7, Encoding=65001, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & _ " #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & _ " #""Valeur remplacée"" = Table.ReplaceValue(#""En-têtes promus"",""."","","",Replacer.ReplaceText,{""Open"", ""High"", ""Low"", ""Close"", ""Adj Close""})," & Chr(13) & "" & Chr(10) & _ " #""Type modifié"" = Table.TransformColumnTypes(#""Valeur remplacée"",{{""Date"", type date}, {""Open"", type number}, {""High"", type number}, {""Low"", type number}, {""Close"", type number}, {""Adj Close"", type number}, {""Volume"", Int64.Type}})" & Chr(13) & "" & Chr(10) & _ "in" & Chr(13) & "" & Chr(10) & _ " #""Type modifié"""
Puis la requête est exécutée :
Sheets("Données YAHOO").ListObjects(NomRequête).QueryTable.Refresh BackgroundQuery:=False
Enfin, le lien hypertexte vers la page Yahoo Finance de la valeur et le titre du graphique sont mis à jour :
With Sheets("Paramètres") .Range("D1").Value = "=HYPERLINK(""https://fr.finance.yahoo.com/quote/" & .Range("B2") & "/history"",""Lien vers la fiche Yahoo de la valeur ""&B1)" .Range("D3").Value = "=""Graphique cours de l'action " & .Range("B1") & " :""" End With
Code-source VBA du programme :
Option Explicit Sub Yahoo() 'Définition des variables Dim NomRequête As String Dim CodeValeur As String Dim DateDébut As Long Dim DateFin As Long Dim DateDébutUNIX As Long Dim DateFinUNIX As Long Dim RequêteYahoo As String NomRequête = "YAHOO" 'Lecture des paramètres Dans la feuille Excel CodeValeur = Sheets("Paramètres").Range("B2").Value DateDébut = Sheets("Paramètres").Range("B3").Value DateFin = Sheets("Paramètres").Range("B4").Value 'Calcul des dates Unix (utilisées par la requête Yahoo) DateDébutUNIX = (DateDébut - DateSerial(1970, 1, 1)) * 86400 DateFinUNIX = (DateFin - DateSerial(1970, 1, 1)) * 86400 'Calcul de la requête Yahoo RequêteYahoo = "https://query1.finance.yahoo.com/v7/finance/download/" & CodeValeur & "?period1=" & DateDébutUNIX & "&period2=" & DateFinUNIX & "&interval=1d&events=history&includeAdjustedClose=true" ActiveWorkbook.Queries(NomRequête).Delete ActiveWorkbook.Queries.Add Name:=NomRequête, Formula:= _ "let" & Chr(13) & "" & Chr(10) & _ " Source = Csv.Document(Web.Contents(""" & RequêteYahoo & """),[Delimiter="","", Columns=7, Encoding=65001, QuoteStyle=QuoteStyle.None])," & Chr(13) & "" & Chr(10) & _ " #""En-têtes promus"" = Table.PromoteHeaders(Source, [PromoteAllScalars=true])," & Chr(13) & "" & Chr(10) & _ " #""Valeur remplacée"" = Table.ReplaceValue(#""En-têtes promus"",""."","","",Replacer.ReplaceText,{""Open"", ""High"", ""Low"", ""Close"", ""Adj Close""})," & Chr(13) & "" & Chr(10) & _ " #""Type modifié"" = Table.TransformColumnTypes(#""Valeur remplacée"",{{""Date"", type date}, {""Open"", type number}, {""High"", type number}, {""Low"", type number}, {""Close"", type number}, {""Adj Close"", type number}, {""Volume"", Int64.Type}})" & Chr(13) & "" & Chr(10) & _ "in" & Chr(13) & "" & Chr(10) & _ " #""Type modifié""" Sheets("Données YAHOO").ListObjects(NomRequête).QueryTable.Refresh BackgroundQuery:=False With Sheets("Paramètres") .Range("D1").Value = "=HYPERLINK(""https://fr.finance.yahoo.com/quote/" & .Range("B2") & "/history"",""Lien vers la fiche Yahoo de la valeur ""&B1)" .Range("D3").Value = "=""Graphique cours de l'action " & .Range("B1") & " :""" End With End Sub
Le classeur Excel comprenant le programme en VBA est téléchargeable ci-après.
Pour approfondir le sujet de l’automatisation de la manipulation de données avec Power Query et le Langage M : cf l’article Automatiser l’extraction des tableaux de données d’un fichier PDF.
Il est également possible d’obtenir des cotations boursières par l’intermédiaire d’une API (Application Programming Interface ou interface de programmation applicative). Malheureusement, Yahoo a désactivé la sienne. Un autre site, Marketstack.com, en propose une dont les données sont accessible gratuitement. Pour collecter des données à partir d’une API, cf l’exemple développé autour de celle de Pappers.
___
Approfondir le sujet : tous les articles sur la bourse
Derniers articles parBenoît RIVIERE (voir tous)
- Nouveautés de l’interpréteur de formules de calcul (v1.1) - dimanche 3 novembre 2024
- Dématérialisation de la facturation : nouvelles mentions obligatoires - lundi 28 octobre 2024
- Interpréteur de formules de calcul en Python - dimanche 13 octobre 2024
- Les données de la facturation électronique - mercredi 9 octobre 2024
- VBA/SQL vs Power Query : deux solutions complémentaires - mercredi 2 octobre 2024
Pingback: Python : automatiser le téléchargement en masse des documents juridiques et financiers des entreprises au format PDF à l'aide de l'API de l'INPI - Audit & Systèmes d'Information