Siéntete libre de compartir nuestro sitio y códigos con tus amigos, necesitamos tu ayuda para aumentar esta comunidad.
Solución:
Actualizado el 2021-01-19
- En este momento, la implementación en el OP funciona sin problemas, para descargar múltiples acciones.
- Versión: 0.9.0 Fecha: 10 de julio de 2020
- GitHub: pydata / pandas-datareader
tickers = ['msft', 'aapl', 'twtr', 'intc', 'tsm', 'goog', 'amzn', 'fb', 'nvda']
df = pdr.DataReader(tickers, data_source='yahoo', start='2017-01-01', end='2020-09-28')
Respuesta original
Si lee la documentación de Pandas DataReader, emitieron una depreciación inmediata en varias API de fuentes de datos, una de las cuales es Yahoo! Finanzas.
v0.6.0 (24 de enero de 2018)
Desaprobación inmediata de Yahoo!, Opciones de Google y Citas y EDGAR. Los puntos finales detrás de estas API han cambiado radicalmente y los lectores existentes requieren reescrituras completas. En el caso de la mayoría Yahoo!
datos que se han eliminado los puntos finales. PDR desea restaurar estas funciones y las solicitudes de extracción son bienvenidas.
Este podría ser el culpable de por qué ha estado recibiendo IndexError
‘s (o cualquier otro error que normalmente no existe).
Sin embargo, hay otro paquete de Python cuyo objetivo es arreglar el soporte para Yahoo! Finance for Pandas DataReader, puede encontrar ese paquete aquí:
https://pypi.python.org/pypi/fix-yahoo-finance
Según su documentación:
Yahoo! Finanzas ha retirado su API de datos históricos, lo que ha provocado que muchos programas que dependían de ella dejen de funcionar.
arreglar-yahoo-finanzas ofrece una solución temporal al problema al extraer los datos de Yahoo! Finanzas usando y devuelve un Pandas DataFrame / Panel en el mismo formato que pandas_datareader‘s
get_data_yahoo()
.Básicamente, “secuestrando”
pandas_datareader.data.get_data_yahoo()
método, arreglar-yahoo-finanzasLa implantación es fácil y solo requiere importarfix_yahoo_finance
en su código.
Todo lo que necesita agregar es esto:
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)
O incluso sin la necesidad 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)
Puede usar el nuevo módulo Python YahooFinancials con pandas para hacer esto. YahooFinancials está bien construido y obtiene sus datos procesando el objeto del almacén de datos presente en cada página web de Yahoo Finance, por lo que es rápido y no depende de la antigua API descontinuada ni de un controlador web como lo hace un raspador. Los datos se devuelven como JSON y puede extraer tantas acciones como desee a la vez pasando una lista de tickers de acciones / índices para inicializar la clase YahooFinancials.
$ pip instalar yahoofinancials
Ejemplo de uso:
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
Ejemplo de datos de varias acciones a la vez (devuelve una lista de objetos JSON para cada 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')
Ejemplo de salida JSON:
Código:
yahoo_financials = YahooFinancials('WFC')
print(yahoo_financials.get_historical_stock_data("2017-09-10", "2017-10-10", "monthly"))
Devolución de 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"