web-dev-qa-db-fra.com

Télécharger l'historique des cours des actions automatiquement à partir de Yahoo Finance dans python

Existe-t-il un moyen de télécharger automatiquement les cours historiques des actions depuis Yahoo Finance ou Google Finance (format CSV)? De préférence en Python.

44
Bob

Réponse courte: oui. Utilisez rllib de Python pour extraire les pages de données historiques des actions de votre choix. Allez avec Yahoo! La finance; Google est à la fois moins fiable, moins couvert en termes de données et plus restrictif quant à la manière de l'utiliser une fois que vous l'avez. En outre, je pense que Google vous interdit spécifiquement de supprimer les données dans leur ToS.

Réponse plus longue: C’est le script que j’utilise pour extraire toutes les données historiques d’une entreprise donnée. Il extrait la page de données d'historique d'un symbole particulier, puis l'enregistre dans un fichier csv nommé par ce symbole. Vous devrez fournir votre propre liste de symboles que vous souhaitez extraire.

import urllib

base_url = "http://ichart.finance.yahoo.com/table.csv?s="
def make_url(ticker_symbol):
    return base_url + ticker_symbol

output_path = "C:/path/to/output/directory"
def make_filename(ticker_symbol, directory="S&P"):
    return output_path + "/" + directory + "/" + ticker_symbol + ".csv"

def pull_historical_data(ticker_symbol, directory="S&P"):
    try:
        urllib.urlretrieve(make_url(ticker_symbol), make_filename(ticker_symbol, directory))
    except urllib.ContentTooShortError as e:
        outfile = open(make_filename(ticker_symbol, directory), "w")
        outfile.write(e.content)
        outfile.close()
40
Joe C.

Quand vous allez travailler avec de telles séries temporelles en Python, pandas est indispensable. Et voici la bonne nouvelle: il contient un téléchargeur de données historiques pour Yahoo: pandas.io.data.DataReader.

from pandas.io.data import DataReader
from datetime import datetime

ibm = DataReader('IBM',  'yahoo', datetime(2000, 1, 1), datetime(2012, 1, 1))
print(ibm['Adj Close'])

Voici un exemple tiré de la documentation pandas.

Mise à jour pour pandas>> 0.19:

Le pandas.io.data le module a été supprimé de pandas>=0.19 à partir de. Au lieu de cela, vous devriez utiliser le caractère séparé pandas-datareader package . Installer avec:

pip install pandas-datareader

Et puis vous pouvez le faire en Python:

import pandas_datareader as pdr
from datetime import datetime

ibm = pdr.get_data_yahoo(symbols='IBM', start=datetime(2000, 1, 1), end=datetime(2012, 1, 1))
print(ibm['Adj Close'])

Le téléchargement depuis Google Finance est également pris en charge.

Il y a plus dans la documentation de pandas-datareader.

103
Def_Os

Étendre @ Def_Os's répondre avec une démonstration réelle ...

Comme @Def_Os l'a déjà dit - utiliser Pandas Datareader rend cette tâche très amusante

In [12]: from pandas_datareader import data

extraire toutes les données historiques disponibles pour AAPL à partir de 1980-01-01

#In [13]: aapl = data.DataReader('AAPL', 'yahoo', '1980-01-01')

# yahoo api is inconsistent for getting historical data, please use google instead.
In [13]: aapl = data.DataReader('AAPL', 'google', '1980-01-01')

5 premières lignes

In [14]: aapl.head()
Out[14]:
                 Open       High     Low   Close     Volume  Adj Close
Date
1980-12-12  28.750000  28.875000  28.750  28.750  117258400   0.431358
1980-12-15  27.375001  27.375001  27.250  27.250   43971200   0.408852
1980-12-16  25.375000  25.375000  25.250  25.250   26432000   0.378845
1980-12-17  25.875000  25.999999  25.875  25.875   21610400   0.388222
1980-12-18  26.625000  26.750000  26.625  26.625   18362400   0.399475

5 dernières lignes

In [15]: aapl.tail()
Out[15]:
                 Open       High        Low      Close    Volume  Adj Close
Date
2016-06-07  99.250000  99.870003  98.959999  99.029999  22366400  99.029999
2016-06-08  99.019997  99.559998  98.680000  98.940002  20812700  98.940002
2016-06-09  98.500000  99.989998  98.459999  99.650002  26419600  99.650002
2016-06-10  98.529999  99.349998  98.480003  98.830002  31462100  98.830002
2016-06-13  98.690002  99.120003  97.099998  97.339996  37612900  97.339996

enregistrer toutes les données en tant que fichier CSV

In [16]: aapl.to_csv('d:/temp/aapl_data.csv')

d: /temp/aapl_data.csv - 5 premières lignes

Date,Open,High,Low,Close,Volume,Adj Close
1980-12-12,28.75,28.875,28.75,28.75,117258400,0.431358
1980-12-15,27.375001,27.375001,27.25,27.25,43971200,0.408852
1980-12-16,25.375,25.375,25.25,25.25,26432000,0.378845
1980-12-17,25.875,25.999999,25.875,25.875,21610400,0.38822199999999996
1980-12-18,26.625,26.75,26.625,26.625,18362400,0.399475
...
15
MaxU

Il y a déjà une bibliothèque dans Python appelée yahoo_finance. Vous devez donc tout d'abord la télécharger à l'aide de la ligne de commande suivante:

Sudo pip install yahoo_finance

Ensuite, une fois que vous avez installé la bibliothèque yahoo_finance, voici un exemple de code qui téléchargera les données dont vous avez besoin à partir de Yahoo Finance:

#!/usr/bin/python
import yahoo_finance
import pandas as pd

symbol = yahoo_finance.Share("GOOG")
google_data = symbol.get_historical("1999-01-01", "2016-06-30")
google_df = pd.DataFrame(google_data)

# Output data into CSV
google_df.to_csv("/home/username/google_stock_data.csv")

Cela devrait le faire. Laissez-moi savoir si cela fonctionne.

UPDATE: La bibliothèque yahoo_finance n'est plus prise en charge.

8
Naufal

Vous pouvez consulter le package yahoo_fin. Il a été initialement créé après que Yahoo Finance ait modifié son API (la documentation est ici: http://theautomatic.net/yahoo_fin-documentation ).

from yahoo_fin import stock_info as si

aapl_data = si.get_data("aapl")

nflx_data = si.get_data("nflx")

aapl_data.head()

nflx_data.head()

aapl.to_csv("aapl_data.csv")

nflx_data.to_csv("nflx_data.csv")
4
atreadw