Есть ли способ автоматически загружать исторические цены на акции из yahoo finance или google finance (формат csv)? Предпочтительно в Python.
Автоматически загружать цены на акции из yahoo finance в python
Ответ 1
Короткий ответ: Да. Используйте Python urllib, чтобы вытащить страницы исторических данных для нужных вам акций. Пойдите с Yahoo! Финансы; Google является менее надежным, имеет меньшее покрытие данных и более ограничивает то, как вы можете использовать его, как только вы его получите. Кроме того, я считаю, Google специально запрещает вам очищать данные в своих ToS.
Более длинный ответ: это script, который я использую, чтобы вытащить все исторические данные в конкретной компании. Он извлекает страницу исторических данных для определенного символа тикера, а затем сохраняет его в файл csv, названный этим символом. Вам нужно будет предоставить собственный список символов тикера, который вы хотите вытащить.
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()
Ответ 2
Когда вы собираетесь работать с такими временными рядами в Python, pandas
является незаменимым. И вот хорошая новость: он поставляется с историческим загрузчиком данных для 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'])
Вот пример из документации pandas
.
Обновление для pandas >= 0.19:
Модуль pandas.io.data
удален с pandas>=0.19
и далее. Вместо этого вы должны использовать отдельный pandas-datareader
пакет. Установите с помощью:
pip install pandas-datareader
И тогда вы можете сделать это в 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'])
Ответ 3
Расширение @Def_Os с фактической демонстрацией...
Как уже говорилось @Def_Os - используя Pandas Datareader делает эту задачу настоящей забавой
In [12]: from pandas_datareader import data
потянув все доступные исторические данные за AAPL
начиная с 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 строк
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 строк
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
сохранить все данные в формате CSV
In [16]: aapl.to_csv('d:/temp/aapl_data.csv')
d:/temp/aapl_data.csv - 5 первых строк
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
В Python уже есть библиотека с именем yahoo_finance, поэтому вам нужно сначала загрузить библиотеку, используя следующую командную строку:
sudo pip install yahoo_finance
Затем, после того как вы установили библиотеку yahoo_finance, вот пример кода, который загрузит необходимые данные из 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")
Это должно сделать это. Дайте мне знать, если это работает.
ОБНОВЛЕНИЕ: библиотека yahoo_finance больше не поддерживается.
Ответ 5
Вы можете проверить пакет yahoo_fin. Первоначально он был создан после того, как Yahoo Finance изменил свой API (документация находится здесь: 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")