samedi 1 avril 2017

Yahoo stocks API: données manquantes sur les etf depuis le vendredi 24 mars 2017

pandas datareader yahoo problem foreign stocks

Récupérer les données avec pandas datareader sur le marché français

Comme je l'ai déjà dit, je suis en train de monter un outil de machine learning pour mettre en place une plateforme d'allocation stratégique sur les etf du marché français.

Pour ce faire, je construit plus de 87 séries financières distinctes (techniques ou économiques),que je construis avec Quandl, la FED et Yahoo stock API.

Yahoo stock API est essentiel car il me permet de récupérer les valeurs journalières pour mes actifs de leur Open High Low Close Volume (OHLCV) sur un historique partant de 2005 (oui je sais c'est peu...) soit 3000 valeurs à peu prés.

Pour  être plus efficient, je ne récupère plus l'historique complet de mes actifs depuis 2005, mais je procède par incréments de date à date. De cette manière, je ne récupère que les données de la semaine en cours.

Techniquement, j'utilise depuis le départ pandas datareader pour cette tache. Qui me donne entière satisfaction mais qui a révélé ses limites au cours de l'incident actuel sur yahoo.

En effet, depuis le 23 mars 2017, les données yahoo sur tous les etfs (mais pas les actions) sont figées. Pas moyen de récupérer ces données, et donc toute ma chaine était bloquée.
cours historique etf Euronext manuant sur yaho stock depuis le 23 mars

Ayant déjà anticipé ce problème, je me suis immédiatement tourné vers Google stock API via pandas datareader. Mais je suis tombé sur un autre os: pandas ne récupère pas d'historique sur les marchés autre que uk ou us.

Heureusement, nous sommes en python, et les solutions ne manquent pas: Beautiful Soup !

Récupérer les derniers cours des etf via bs et pandas

Dans le code ci-dessous, je vais utiliser la librairie pandas et beautiful soup pour construire un outil récupérant le dernier historique d'une Série d'actifs sur Google finance API. Le code est self explanatory, je vous laisse le lire:


from datetime import datetime
import requests
import bs4
import pandas as pd

google_tickers=[ 
    'NRGW','ASI' 
    ]

def get_scraped_google_stock_prices(begin,end):
    data={}
    for ticker in google_tickers:
        print ticker,
        url = 'https://www.google.com/finance/historical?q=EPA:'+ticker
        req = requests.get(url)
        bs = bs4.BeautifulSoup(req.text,'lxml')
        div_price = bs.find(attrs={'class': 'gf-table historical_price'})
        df=pd.read_html(str(div_price),parse_dates=True,index_col=0,header=0)[0].sort_index().loc[begin:end]
        data[ticker]=df
        print 'fetched from: ',df.index.min(),', to:',df.index.max(),', ', len(df),' rows '
    pane=pd.Panel.from_dict(data,orient='minor')
    return pane

 
print get_scraped_google_stock_prices(datetime(2017,3,20),datetime(2017,3,30))


ce qui nous retourne:


Dimensions: 5 (items) x 9 (major_axis) x 2 (minor_axis)
Items axis: Open to Volume
Major_axis axis: 2017-03-20 00:00:00 to 2017-03-30 00:00:00
Minor_axis axis: ASI to NRGW

et voila.

Newsletter

Vous voulez suivre ce blog ?

Saisissez votre adresse email :

Flux RSS