Descarga de acciones mutliple a la vez desde yahoo finance python

Tengo una pregunta sobre la función de las finanzas de Yahoo con el lector de datos de pandas. Estoy usando desde hace meses una lista con marcadores de acciones y la ejecuto en las siguientes líneas:

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) 

Desde ayer recibí el error “IndexError: índice de lista fuera de rango”, que aparece solo si bash obtener varias acciones.

¿Ha cambiado algo en los últimos días que debo considerar o tiene una solución mejor para mi problema?

Si leyó la documentación de Pandas DataReader, emitieron una depreciación inmediata en varias API de origen de datos, una de las cuales es Yahoo! Financiar.

v0.6.0 (24 de enero de 2018)

Depreciación inmediata de Yahoo! , Opciones de Google y Cotizaciones 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 de Yahoo! Datos de los puntos finales han sido eliminados. 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 (o cualquier otro error que normalmente no existe).


Sin embargo, hay otro paquete de Python cuyo objective es arreglar el soporte para Yahoo! Financiar para Pandas DataReader, puede encontrar ese paquete aquí:

https://pypi.python.org/pypi/fix-yahoo-finance

Según su documentación:

Yahoo! Finance ha retirado su API de datos históricos, lo que ha provocado que muchos progtwigs que dependían de ella dejaran de funcionar.

fix-yahoo-finance ofrece una solución temporal al problema al raspar los datos de Yahoo! financie usando y devuelva un DataFrame / Panel de Pandas en el mismo formato que get_data_yahoo() pandas_datareader .

Básicamente, al “secuestrar” el método pandas_datareader.data.get_data_yahoo() , la implantación de fix-yahoo-finance es fácil y solo requiere importar fix_yahoo_finance en tu código.

Todo lo que necesitas 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) 

Puedes usar el nuevo módulo de Python YahooFinancials con pandas para hacer esto. YahooFinancials está bien construido y obtiene sus datos al extraer el objeto del almacén de datos presente en cada página web de Yahoo Finance, por lo que es rápido y no se basa en la antigua API discontinua ni en un controlador web como hace un raspador. Los datos se devuelven como JSON y puede extraer tantas acciones como quiera de una sola vez pasando una lista de marcadores de acciones / índices para inicializar la clase de 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 varios datos de stocks a la vez (devuelve la 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")) 

JSON Return:

 { "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" } }