web-dev-qa-db-fra.com

Téléchargement simultané de plusieurs actions depuis Yahoo Finance python

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?

7
ScharcoMolten

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'importer fix_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)
9
abccd

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"
    }
}
5
alt777

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 =

0
Gerry