J'ai une question sur la fonction de yahoo finance en utilisant le lecteur de données pandas. J'utilise depuis des mois maintenant une liste avec des tickers boursiers et l'exécute dans les lignes suivantes:
import pandas_datareader as pdr
import datetime
stocks = ["stock1","stock2",....]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
f = pdr.DataReader(stocks, 'yahoo',start,end)
Depuis hier, je reçois l'erreur "IndexError: list index out of range", qui n'apparaît que si j'essaie d'obtenir plusieurs actions.
Quelque chose a-t-il changé ces derniers jours que je dois considérer ou avez-vous une meilleure solution à mon problème?
Si vous lisez Pandas DataReader documentation , ils ont émis une dépréciation immédiate sur plusieurs API de source de données, dont Yahoo! Finance.
v0.6.0 (24 janvier 2018)
Dépréciation immédiate de Yahoo !, Options Google et Citations et [~ # ~] edgar [~ # ~]. Les points d'extrémité derrière ces API ont radicalement changé et les lecteurs existants nécessitent des réécritures complètes. Dans le cas de la plupart des données Yahoo !, les points de terminaison ont été supprimés. PDR souhaite restaurer ces fonctionnalités et les demandes de tirage sont les bienvenues.
Cela pourrait être le coupable de la raison pour laquelle vous obtenez des IndexError
(ou toute autre erreur normalement inexistante).
Cependant, il existe un autre package Python dont le but est de corriger la prise en charge de Yahoo! Finance pour Pandas DataReader, vous pouvez trouver ce package ici:
https://pypi.python.org/pypi/fix-yahoo-finance
Selon leur documentation:
Yahoo! Finance a mis hors service son API de données historiques, provoquant l'arrêt de nombreux programmes qui en dépendaient.
fix-yahoo-finance offre une solution temporaire au problème en supprimant les données de Yahoo! finance utiliser et renvoyer un Pandas DataFrame/Panel dans le même format que pandas_datareader
get_data_yahoo()
.En "détournant" essentiellement la méthode
pandas_datareader.data.get_data_yahoo()
, l'implantation de fix-yahoo-finance est facile et ne nécessite que d'importerfix_yahoo_finance
dans votre code.
Tout ce que vous devez ajouter est le suivant:
from pandas_datareader import data as pdr
import fix_yahoo_finance as yf
yf.pdr_override()
stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
f = pdr.get_data_yahoo(stocks, start=start, end=end)
Ou même sans avoir besoin de Pandas DataReader:
import fix_yahoo_finance as yf
stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
data = yf.download(stocks, start=start, end=end)
Vous pouvez utiliser le nouveau module Python YahooFinancials avec pandas pour ce faire. YahooFinancials est bien construit et obtient ses données en hachant l'objet de magasin de données présent dans chaque Yahoo Finance Web page, donc c'est rapide et ne dépend pas de l'ancienne API abandonnée ni d'un pilote web comme le fait un scraper. Les données sont renvoyées en JSON et vous pouvez extraire autant de stocks que vous le souhaitez en passant dans une liste de stock/index tickers pour initialiser la classe YahooFinancials avec.
$ pip install yahoofinancials
Exemple d'utilisation:
from yahoofinancials import YahooFinancials
import pandas as pd
# Select Tickers and stock history dates
ticker = 'AAPL'
ticker2 = 'MSFT'
ticker3 = 'INTC'
index = '^NDX'
freq = 'daily'
start_date = '2012-10-01'
end_date = '2017-10-01'
# Function to clean data extracts
def clean_stock_data(stock_data_list):
new_list = []
for rec in stock_data_list:
if 'type' not in rec.keys():
new_list.append(rec)
return new_list
# Construct yahoo financials objects for data extraction
aapl_financials = YahooFinancials(ticker)
mfst_financials = YahooFinancials(ticker2)
intl_financials = YahooFinancials(ticker3)
index_financials = YahooFinancials(index)
# Clean returned stock history data and remove dividend events from price history
daily_aapl_data = clean_stock_data(aapl_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker]['prices'])
daily_msft_data = clean_stock_data(mfst_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker2]['prices'])
daily_intl_data = clean_stock_data(intl_financials
.get_historical_stock_data(start_date, end_date, freq)[ticker3]['prices'])
daily_index_data = index_financials.get_historical_stock_data(start_date, end_date, freq)[index]['prices']
stock_hist_data_list = [{'NDX': daily_index_data}, {'AAPL': daily_aapl_data}, {'MSFT': daily_msft_data},
{'INTL': daily_intl_data}]
# Function to construct data frame based on a stock and it's market index
def build_data_frame(data_list1, data_list2, data_list3, data_list4):
data_dict = {}
i = 0
for list_item in data_list2:
if 'type' not in list_item.keys():
data_dict.update({list_item['formatted_date']: {'NDX': data_list1[i]['close'], 'AAPL': list_item['close'],
'MSFT': data_list3[i]['close'],
'INTL': data_list4[i]['close']}})
i += 1
tseries = pd.to_datetime(list(data_dict.keys()))
df = pd.DataFrame(data=list(data_dict.values()), index=tseries,
columns=['NDX', 'AAPL', 'MSFT', 'INTL']).sort_index()
return df
Exemple de données de stocks multiples à la fois (retourne la liste des objets JSON pour chaque ticker):
from yahoofinancials import YahooFinancials
tech_stocks = ['AAPL', 'MSFT', 'INTC']
bank_stocks = ['WFC', 'BAC', 'C']
yahoo_financials_tech = YahooFinancials(tech_stocks)
yahoo_financials_banks = YahooFinancials(bank_stocks)
tech_cash_flow_data_an = yahoo_financials_tech.get_financial_stmts('annual', 'cash')
bank_cash_flow_data_an = yahoo_financials_banks.get_financial_stmts('annual', 'cash')
banks_net_ebit = yahoo_financials_banks.get_ebit()
tech_stock_price_data = tech_cash_flow_data.get_stock_price_data()
daily_bank_stock_prices = yahoo_financials_banks.get_historical_stock_data('2008-09-15', '2017-09-15', 'daily')
Exemple de sortie JSON:
Code:
yahoo_financials = YahooFinancials('WFC')
print(yahoo_financials.get_historical_stock_data("2017-09-10", "2017-10-10", "monthly"))
Retour JSON:
{
"WFC": {
"prices": [
{
"volume": 260271600,
"formatted_date": "2017-09-30",
"high": 55.77000045776367,
"adjclose": 54.91999816894531,
"low": 52.84000015258789,
"date": 1506830400,
"close": 54.91999816894531,
"open": 55.15999984741211
}
],
"eventsData": [],
"firstTradeDate": {
"date": 76233600,
"formatted_date": "1972-06-01"
},
"isPending": false,
"timeZone": {
"gmtOffset": -14400
},
"id": "1mo15050196001507611600"
}
}
yahoo_finance n'est plus en mesure d'utiliser depuis que Yahoo a changé le format, fix_yahoo_finance est assez bon pour télécharger des données. Cependant, pour analyser, vous aurez besoin d'autres bibliothèques, voici l'exemple de travail simple:
import numpy as np #python library for scientific computing
import pandas as pd #python library for data manipulation and analysis
import matplotlib.pyplot as plt #python library for charting
import fix_yahoo_finance as yf #python library to scrap data from yahoo finance
from pandas_datareader import data as pdr #extract data from internet sources into pandas data frame
yf.pdr_override()
data = pdr.get_data_yahoo(‘^DJI’, start=”2006–01–01")
data2 = pdr.get_data_yahoo(“MSFT”, start=”2006–01–01")
data3 = pdr.get_data_yahoo(“AAPL”, start=”2006–01–01")
data4 = pdr.get_data_yahoo(“BB.TO”, start=”2006–01–01")
ax = (data[‘Close’] / data[‘Close’].iloc[0] * 100).plot(figsize=(15, 6))
(data2[‘Close’] / data2[‘Close’].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
(data3[‘Close’] / data3[‘Close’].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
(data4[‘Close’] / data5[‘Close’].iloc[0] * 100).plot(ax=ax, figsize=(15,6))
plt.legend([‘Dow Jones’, ‘Microsoft’, ‘Apple’, ‘Blackberry’], loc=’upper left’)
plt.show()
pour l'explication du code, vous pouvez visiter à https://medium.com/@gerrysabar/charting-stocks-price-from-yahoo-finance-using-fix-yahoo-finance-library-6b690cac5447 =