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
'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
'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
'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 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"
'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"
'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
ActiveWorkbook.Queries(NomRequête).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) & _
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é"""
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
Sheets("Données YAHOO").ListObjects(NomRequête).QueryTable.Refresh BackgroundQuery:=False
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") & " :"""
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
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 :
'Définition des variables
Dim DateDébutUNIX As Long
Dim RequêteYahoo As String
'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) & _
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") & " :"""
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
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
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
2.13.0.0
EXCEL - POWER QUERY YAHOO
Auteur: | Benoît RIVIERE |
Date: | vendredi 23 décembre 2022 |
The following two tabs change content below.
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