Gibt es eine Möglichkeit, automatisch herunterladen historische Preise von Aktien aus Yahoo Finance oder Google Finanzen (CSV-Format)? Vorzugsweise in Python.Laden Sie Geschichte Aktienkurse automatisch von Yahoo Finanzen in Python
Antwort
Kurze Antwort: Ja. Verwenden Sie Pythons urllib, um die historischen Datenseiten für die gewünschten Bestände abzurufen. Geh mit Yahoo! Finanzen; Google ist weniger zuverlässig, hat weniger Datenabdeckung und ist restriktiver in der Art und Weise, wie Sie es verwenden können, sobald Sie es haben. Außerdem glaube ich, dass Google Ihnen ausdrücklich verbietet, die Daten in ihren ToS zu scrappen.
Längere Antwort: Dies ist das Skript, das ich verwende, um alle historischen Daten zu einer bestimmten Firma zu ziehen. Er ruft die Verlaufsdatenseite für ein bestimmtes Tickersymbol ab und speichert sie in einer CSV-Datei, die mit diesem Symbol benannt ist. Sie müssen Ihre eigene Liste der Ticker-Symbole angeben, die Sie ziehen möchten.
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()
Wenn Sie gehen in Python mit einem solchen Zeitreihen arbeiten, ist pandas
unverzichtbar. Und hier sind die guten Nachrichten: Es kommt mit einem historischen Daten Downloader für 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.
Update für Pandas> = 0,19:
Das pandas.io.data
Modul von pandas>=0.19
weiter entfernt wurde. Stattdessen sollten Sie das separate pandas-datareader
package verwenden. Installieren Sie mit:
pip install pandas-datareader
Und dann können Sie tun dies 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'])
Wenn ich es versuche, funktionieren die Importe gut, aber wenn ich die 'goog' Zeile anrufe, erhalte ich einen Fehler: "IOError: nach 3 Versuchen gab Yahoo keine 200 für URL zurück 'http://ichart.finance.yahoo .com/table.csv? s = GOOG & a = 0 und b = 1 & c = 2000 & d = 0 & e = 1 & f = 2012 & g = d & ignore = .csv '"Wie könnte das behoben werden? – Cleb
Wie Cleb. 200 Statuscode nicht zurückgegeben – bluerubez
@Cleb Scheint zu sein, weil 'GOOG' nicht von der API akzeptiert wird (verstehe nicht, warum, nach dem Verschieben in Alphabet GOOG Ticker wurde beibehalten). Funktioniert gut für 'GOOGL' und verschiedene andere Symbole. Beispiel nur für den Fall angepasst. –
Erweiterung @Def_Os's Antwort mit einer aktuellen Demo ...
Wie @Def_Os schon gesagt hat - mit Pandas Datareader macht diese Aufgabe einen echten Spaß
In [12]: from pandas_datareader import data
alle verfügbaren historische Daten für AAPL
von 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')
ersten 5 Reihen
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
letzte 5 Zeilen
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
Start ziehen
speichern alle Daten als CSV
In [16]: aapl.to_csv('d:/temp/aapl_data.csv')
d file:/temp/aapl_data.csv - 5 erste Reihen
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
...
Es gibt bereits eine Bibliothek in Python yahoo_finance genannt so dass Sie die Bibliothek herunterladen müssen zuerst die folgende Befehlszeile:
sudo pip install yahoo_finance
Dann, wenn Sie installiert haben die yahoo_finance Bibliothek, hier ist ein Beispielcode, der die benötigten Daten von Yahoo Finance wird herunterladen:
#!/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")
Dies sollte es tun. Lass mich wissen ob es funktioniert.
Nur neugierig - welchen Vorteil bietet yahoo-finance über pandas_datareader (oder umgekehrt)? – Mathematician
Damals war das die einzige Bibliothek, die ich im Zusammenhang mit Yahoo Finance Stock Prices finden konnte. Es scheint jedoch nicht mehr zu funktionieren. – Naufal
Bestätigt - 21/02/2018 - 'yahoo_finance' funktioniert nicht mehr. – 3kstc
check out http://scrape-google-finance.compunect.com/ es ist eine ziemlich neue Open-Source-PHP-Scraper für Google Finanzen. Es ist kostenlos zu verwenden/ändern und Sie können alle Aktienkurse und alle Unternehmen von Google herunterladen. Sollte nicht zu schwierig sein, daraus zu lernen und dasselbe in Python zu schreiben. – John