Introduction
AlphaVantage est un service web qui donne la possibilité de récupérer (gratuitement) des données historiques sur des instruments financiers.
Pour les actions, ce service (qui rappelle le défunt Yahoo Finance) offre une API web REST pour consulter les données suivantes : - Données intraday : OHLC (Open, High, Low et Close) et volume de la journée courante (ou précédente si le marché est fermée). On doit préciser l’intervalle de temps (1, 5, 15, 30 ou 60 minutes) et le nombre de données à récupérer (les 100 dernières par défaut ou toute la journée). Malheureusement, ce service n’est proposé que pour les actions américaines. - Données journalières : le volume et l’OHLC de l’instrument pour les 100 derniers jours ou depuis Janvier 2000. - Données hebdomadaires : le dernier jour de la semaine courante et les données des vendredi depuis Janvier 2000. - Données mensuelles depuis janvier 2000.
Pour les données journalières, hebdomadaires et mensuelles, le service propose deux types de fonction, adjustée et non adjustée pour prendre en compte les dividendes. Ces informations (le montant du dividende et le close adjusté) ne sont pas proposées pour les instruments européens.
Pour utiliser le service, il faut obtenir une clé. Cette opération est très simple et se fait en remplissant un simple formulaire.
Voici quelques exemple de requêtes (remplacer API_KEY par votre clé) :
- Les données journalières de Saint-Gobain des 20 dernières années
https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=SGO.PA&outputsize=full&apikey=API_KEY
- Les données journalières de Société Générale des 100 derniers jours
https://www.alphavantage.co/query?function=TIME_SERIES_DAILY&symbol=GLE.PA&apikey=XD6HTE47G8ZZIDRB
- Les données mensuelles de LVMH
https://www.alphavantage.co/query?function=TIME_SERIES_MONTHLY&symbol=MC.PA&apikey=API_KEY
AV.NET
Pour utiliser ce service, j’ai développé une bibliothèque en C# pour accéder aux différentes données. Ce projet que j’ai appelé Av.NET est hébergé sur Github (Av.NET).
Installation
L’API peut être installée via le gestionnaire de package nuget. L’adresse sur le repository nuget.org est la suivante : https://www.nuget.org/packages/Av.API/.
Utilisation
Pour récupérer les données d’Alpha Vantage, l’API propose le type
AvStockProvider
. Le constructeur de ce dernier reçoit en paramètre votre clé
personnelle pour accéder aux services d’Alpha Vantage (pour rappel, l’obtention
de cette clé peut se faire facilement à cette adresse https://www.alphavantage.co/support/#api-key). Le type AvStockProvider
fournit les méthodes pour récupérer les différents types de données
historiques :
1. Données journalières
AvStockProvider provider = new AvStockProvider(avKey);
StockData stockData = provider.RequestDaily("SGO.PA");
- Données hebdomadaires :
csharp AvStockProvider provider = new AvStockProvider(avKey); StockData stockData = provider.RequestWeekly("SGO.PA");
- Données mensuelles :
csharp AvStockProvider provider = new AvStockProvider(avKey); StockData stockData = provider.RequestMonthly("SGO.PA");
- Données en mode Batch : seul les instruments financiers américains sont disponibles pour cette fonction et uniquement pendant les heures d’ouverture du marché (ceci est dû au fait que cette source est fourni par IEX pour lequel je suis également entrain de développer une API IEX.Net).
AvStockProvider provider = new AvStockProvider(avKey);
IDictionary<string, StockRealtime> batchData = provider.BatchRequest(new string[] { "MSFT", "IBM", "AAPL" });
L’objet StockData
contient un ensemble de données de type StockDataItem
.
Chaque données de type StockDataItem
est associée à une date. La définition
d’un objet StockDataItem
est la suivante :
public class StockDataItem
{
public StockDataItem(DateTime dateTime)
{
DateTime = dateTime;
}
public DateTime DateTime { get; set; }
public double Open { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; }
public long Volume { get; set; }
public double AdjustedClose { get; set; }
}
Alors qu’un objet StockData
est défini comme ci-dessous :
public class StockData
{
public StockData(string symbol)
{
Symbol = symbol;
Data = new SortedDictionary<DateTime, StockDataItem>();
}
public string Symbol { get; }
public IDictionary<DateTime, StockDataItem> Data { get; }
// ...
}
Pour les requêtes en mode batch, le type de données retourné est
StockRealtime
. Sa définition est la suivante :
public class StockRealtime
{
public StockRealtime(string symbol)
{
Symbol = symbol;
}
public string Symbol { get; }
public double Price { get; set; }
public long Volume { get; set; }
public DateTime Timestamp { get; set; }
}
Utilisation de AvRequestManager
L’accès aux services d’Alpha Vantage a une contrainte sur la fréquence des requêtes à exécuter. La page support d’Alpha Vantage ne précise pas une limite de fréquence pour l’envoi des requêtes mais recommande d’envoyer les requêtes de manière espacée dans le temps. D’après les tests que j’ai effectués, un délai de deux secondes entre deux requêtes successives m’a permis d’éviter le problème. Lorsque le service reçoit trop de requêtes, le message suivant est retourné
{
"Information": "Please consider optimizing your API call frequency."
}
Ce délai de deux secondes n’est pas une garantie d’éviter les rejets. Même en respectant ce délai (ou en l’augmentant), la requête peut être rejetée si le nombre de requêtes est grand. Pour donner un ordre d’idée, récupérer les données historiques des 40 actions qui composent le CAC40 peut échouer pour certaines d’entre elles même avec un délai de deux secondes.
Pour gérer cette limitation (des comptes gratuits), l’API fournit le type
AvRequestManager
qui permet de gérer les appels successifs sans avoir à
temporiser les appels entre deux requêtes successives. Le constructeur
reçoit en paramètre l’objet AvStockProvider
et doit être démarré avec la
méthode Start
qui démarre le thread de traitement.
AvRequestManager requestManager = new AvRequestManager(provider);
requestManager.Start();
C’est la méthode Add
qui permet d’ajouter une requête à Alpha Vantage. La
requête est exécutée de manière asynchrone par le thread de traitement et son
résultat est retournée via la callback fournie lors de l’appel à Add
. La
signature de cette fonction est la suivante :
Add(RequestType requestType, string symbol, Action<RequestType, string, StockData> callback)
Le type RequestType
est une enum qui définit les différents types de
requêtes disponibles
public enum RequestType { Daily, DailyFull, DailyAdjusted, DailyAdjustedFull, Weekly, WeeklyAdjusted, Monthly, MonthlyAdjusted}
Voici ci-dessous un exemple d’utilisation de l’objet AvRequestManager
. Dans
cet exemple, les données historiques journalières, hebdomadaires et mensuelles
sont téléchargées pour un ensemble d’actions.
AvStockProvider provider = new AvStockProvider(avKey);
AvRequestManager requestManager = new AvRequestManager(provider);
string[] stocks = new string[] { "SGO.PA", "GLE.PA", "BNP.PA", "VIV.PA", "RNO.PA", "CS.PA" };
requestManager.Start();
foreach (var stock in stocks)
{
requestManager.Add(RequestType.Daily, stock, Callback);
requestManager.Add(RequestType.Weekly, stock, Callback);
requestManager.Add(RequestType.Monthly, stock, Callback);
}
requestManager.Stop(true);
On remarque à la fin l’appel à la méthode AvRequestManager.Stop
avec le
paramètre true
. La valeur true
permet d’exécuter toutes les requêtes en
attente avant d’arrêter le thread du AvRequestManager
.
L’utilisation de AvRequestManager
n’est pas une solution au problème du rejet.
Il permet de gérer les délais entre les requêtes et de renvoyer les réponses
de manière asynchrone. Le délai par défaut utilisé par cet objet est de deux
secondes mais l’utilisateur peut le modifier via l’attribut Delay
.
int Delay { get; set; }
Exemples
Le projet contient un certain nombre d’exemples :
Av.CLI
C’est un programme en ligne de commande qui permet d’illustrer les différentes requêtes disponibles dans l’API. Pour le lancer, il faut fournir en argument de la ligne de commande votre clé AlphaVantage personnelle.
VolumeChart
C’est un programme graphique (en WPF) qui permet d’afficher le graphe de volume pour les cents dernier jour. Au démarrage, le graphe de Saint-Gobain est affiché, mais on peut choisir un nouvel instrument pour en afficher le graphe de volume.
MultipleStockVolumeChart
C’est un programme similaire au précédent mais il permet d’afficher plusieurs graphe en même temps. Les instruments à afficher peuvent être ajoutés ou supprimés.
StcokPerformance
Ce programme permet de mesurer les performances des instruments qui composent l’indice CAC40 par rapport à l’indice lui-même ou par rapport à l’une des actions de l’indice. La performance est calculée par rapport à une date donnée.
Si l’indice CAC40 a une performance de +10% depuis le premier Avril, un instrument qui a fait +15% a une performance de +5% par rapport à l’indice, tandis qu’un instrument avec une performance de +7% sur la même période a une performance de -3% par rapport à l’indice. La date de référence peut-être choisie via l’interface.
Conclusion
AlphaVantage propose un service intéressant et accessible à tout le monde. Ce service gratuit dans sa version de base, n’est pas sans rappeler Yahoo Finance. Ce dernier a fourni pendant des années un service gratuit de données historiques avant d’être arrêté brusquement. J’avais développé à l’époque une API C++ pour récupérer les données de Yahoo Finance pour faire des simulations. La question de la continuité du service d’AlphaVantage (surtout dans sa version gratuite) se pose forcément. Si le service devient populaire au sein de la communauté des développeurs qui s’intéressent aux données financières, il y a aussi le risque d’un bridage plus fort sur les requêtes autorisées. Je suis également de près le service fourni par IEX et j’attends en particulier le support des marchés européens par leur API.