2012-09-14 93 views
38

¿Hay alguna forma de descargar automáticamente los precios históricos de las acciones de yahoo finance o google finance (formato csv)? Preferiblemente en Python.Descargar automáticamente los precios de las acciones de yahoo en python

+0

echa un vistazo a http://scrape-google-finance.compunect.com/ es un raspador PHP de código abierto bastante nuevo para Google finance. Es gratis de usar/modificar y puede descargar todos los precios de acciones y todas las compañías de Google. No debería ser demasiado difícil aprender de él y escribir lo mismo en python. – John

Respuesta

34

Respuesta corta: Sí. Use Python's urllib para obtener las páginas de datos históricos de las existencias que desea. Vete con Yahoo! Financiar; Google es a la vez menos confiable, tiene menos cobertura de datos y es más restrictiva en cómo puede usarlo una vez que lo tiene. Además, creo que Google le prohíbe específicamente robar los datos en sus ToS.

Respuesta más larga: Esta es la secuencia de comandos que utilizo para extraer todos los datos históricos de una empresa en particular. Tira de la página de datos históricos para un símbolo de cotización en particular, luego la guarda en un archivo csv nombrado por ese símbolo. Tendrás que proporcionar tu propia lista de símbolos de cotización que deseas extraer.

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() 
92

Cuando vas a trabajar con tales series de tiempo en Python, pandas es indispensable. Y esta es la buena noticia: viene con un descargador de datos históricos para 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']) 

Here's an example from the pandas documentation.

Actualización para pandas> = 0,19:

El módulo pandas.io.data se ha eliminado de pandas>=0.19 en adelante. En su lugar, debe usar el pandas-datareader package por separado. Instala con:

pip install pandas-datareader 

Y entonces usted puede hacer esto 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']) 

Downloading from Google Finance is also supported.

There's more in the documentation of pandas-datareader.

+2

Cuando lo intento, las importaciones funcionan bien, pero cuando llamo a la línea 'goog' recibo un error: "IOError: después de 3 intentos, Yahoo! no devolvió un 200 para la URL 'http://ichart.finance.yahoo .com/table.csv? s = GOOG & a = 0 & b = 1 & c = 2000 & d = 0 & e = 1 & f = 2012 & g = d & ignore = .csv '"¿Cómo se pudo arreglar esto? – Cleb

+0

Igual que Cleb. No devolvió el código de estado 200 – bluerubez

+0

@Cleb parece ser porque 'GOOG' no es aceptado por la API (no entiendo por qué, después de pasar a Alphabet, se mantuvo el ticker de GOOGI). Funciona bien para 'GOOGL' y varios otros símbolos. Ejemplo ajustado por si acaso. –

10

Extendiendo @Def_Os's respuesta con una demostración real ...

Como @Def_Os ya ha dicho - usando Pandas Datareader hace esta tarea una verdadera diversión

In [12]: from pandas_datareader import data 

tirando todos los datos históricos disponibles para 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') 

primeras 5 filas

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 

últimos 5 filas

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 

guardar todos los datos como archivo CSV

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

d:/temp/aapl_data.csv - 5 primeras filas

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 
... 
4

ya hay una biblioteca en Python llamado yahoo_finance por lo que tendrá que descargar la biblioteca primero utilizando la siguiente línea de comandos:

sudo pip install yahoo_finance 

Luego, una vez que haya instalado la biblioteca yahoo_finance, aquí hay un código de ejemplo que descargará los datos que necesita de Yahoo Finanzas:

#!/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") 

Esto debe hacerlo. Déjame saber si funciona.

+0

Simplemente curioso: ¿qué beneficio ofrece yahoo-finance sobre pandas_datareader (o viceversa)? – Mathematician

+0

En ese momento era la única biblioteca que podía encontrar en relación con tirar de los precios de las acciones de Yahoo Finance. Sin embargo, parece que ya no funciona. – Naufal

+0

Afirmado - 21/02/2018 - 'yahoo_finance' ya no funciona. – 3kstc

Cuestiones relacionadas