EXCEL (Power Query & VBA) : Automatiser la lecture des données boursières Yahoo Finance

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.

Graphique et lien STELLANTIS

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.

Détail paramètres

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

Share Button
EXCEL - POWER QUERY YAHOO
EXCEL - POWER QUERY YAHOO
EXCEL-POWER-QUERY-YAHOO.xlsm
72 KiB
205 téléchargements
Détails...
The following two tabs change content below.
Après seize années passées en cabinet d’expertise-comptable et de commissariat aux comptes (où j’ai exercé comme expert-comptable et chef de mission audit), j’ai pris le poste de directeur comptable d’un groupe de distribution automobile en novembre 2014. Au cours de ma carrière, j’ai acquis une expérience significative en audit et en exploitation des systèmes d’information (analyse de données, automatisation des tâches, programmation informatique) au service de la production des comptes annuels et consolidés. C’est cette expérience personnelle et ma passion pour l’informatique que je partage sur ce blog. Mon CV / Réalisations personnelles et projets informatiques / Ma collection / Me contacter

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.