2012-09-14 32 views
38

Esiste un modo per scaricare automaticamente i prezzi storici degli stock da yahoo finance o google finance (formato csv)? Preferibilmente in Python.Scarica automaticamente i prezzi delle scorte dalla yahoo finance in python

+0

check out http://scrape-google-finance.compunect.com/ è un nuovo scraper PHP open source per Google finance. È gratuito da usare/modificare ed è possibile scaricare tutti i prezzi delle azioni e tutte le società da Google. Non dovrebbe essere troppo difficile imparare da esso e scrivere lo stesso in Python. – John

risposta

34

Risposta breve: Sì. Usa Python urllib per estrarre le pagine di dati storici per gli stock che desideri. Vai con Yahoo! Finanza; Google è meno affidabile, ha meno copertura dei dati ed è più restrittivo nel modo in cui puoi usarlo una volta ottenuto. Inoltre, credo che in particolare Google vieti di raschiare i dati nel loro ToS.

Risposta più lunga: questo è lo script che utilizzo per estrarre tutti i dati storici di una determinata azienda. Estrae la pagina dei dati storici per un particolare simbolo ticker, quindi salva in un file csv chiamato da quel simbolo. Dovrai fornire il tuo elenco di simboli ticker che vuoi estrarre.

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

Quando si sta andando a lavorare con una tale serie temporali in Python, pandas è indispensabile. Ed ecco la buona notizia: viene fornito con un downloader di dati storici per 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.

Aggiornamento per pandi> = 0.19:

Il modulo pandas.io.data è stato rimosso dalla pandas>=0.19 poi. Invece, dovresti usare il separato pandas-datareader package. Installazione con:

pip install pandas-datareader 

E poi si può fare questo in 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

Quando provo, le importazioni funzionano bene, ma quando chiamo la riga 'goog' ricevo un errore: "IOError: dopo 3 tentativi, Yahoo! non ha restituito un 200 per 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 '"Come potrebbe essere risolto? – Cleb

+0

Uguale a Cleb. Non ha restituito il codice di stato 200 – bluerubez

+0

@Cleb Sembra essere dovuto al fatto che 'GOOG' non è accettato dall'API (non capisco perché, dopo lo spostamento in Alfabetico, GOOG ticker è stato mantenuto). Funziona bene per 'GOOGL' e vari altri simboli. Esempio corretto per ogni evenienza. –

10

Estendere @Def_Os's risposta con una demo vero e proprio ...

Come ha già detto @Def_Os, usando Pandas Datareader rende questo compito un vero divertimento

In [12]: from pandas_datareader import data 

tirando tutti i dati storici disponibili per AAPL a partire dal 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') 

prime 5 file

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 

ultimi 5 file

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 

salvare tutti i dati come file CSV

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

d:/temp/aapl_data.csv - 5 prime file

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

c'è già una libreria in Python chiamato yahoo_finance quindi è necessario scaricare la libreria prima utilizzando la seguente riga di comando:

sudo pip install yahoo_finance 

Poi una volta che hai installato la biblioteca yahoo_finance, ecco un esempio di codice che scaricherà i dati necessari da 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") 

Questo dovrebbe farlo. Fammi sapere se funziona.

+0

Solo curioso: quale vantaggio offre yahoo-finance rispetto a pandas_datareader (o viceversa)? – Mathematician

+0

All'epoca era l'unica libreria che riuscivo a trovare in relazione ai prezzi azionari di Yahoo Finance. Tuttavia, sembra che non funzioni più. – Naufal

+0

affermata - 21/02/2018 - 'yahoo_finance' non funziona più. – 3kstc