2012-09-14 88 views
38

有没有一种方法可以自动从雅虎金融或谷歌金融(csv格式)下载股票的历史价格?最好在Python中。自动从雅虎金融在python下载历史股票价格

+0

查看http://scrape-google-finance.compunect.com/ 这是一个相当新的Google财务开源PHP刮板。 它可以免费使用/修改,您可以从Google下载所有股票价格和所有公司。不应该太难从它学习,并在python中写入相同。 – John

回答

34

简答:是的。使用Python的urllib来拉取所需股票的历史数据页面。跟雅虎一起去吧!金融;谷歌的可靠性较低,数据覆盖范围较小,并且限制性较强,一旦拥有它就可以使用它。另外,我相信Google明确禁止您在ToS中抓取数据。

较长的答案:这是我用来提取特定公司的所有历史数据的脚本。它为特定的股票代码拉动历史数据页面,然后将其保存到由该符号命名的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() 
92

当你要与在Python这样的时间序列的工作,pandas是必不可少的。这里有个好消息:它附带了雅虎的历史数据下载器: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.

更新大熊猫> = 0.19:

pandas.io.data模块已从pandas>=0.19起除去。相反,你应该使用单独的pandas-datareader package。与安装:

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']) 

Downloading from Google Finance is also supported.

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

+2

当我尝试它时,导入工作正常,但当我调用'goog'行时,我收到一个错误:“IOError:3次尝试后,雅虎没有返回200的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'“这怎么解决? – Cleb

+0

和Cleb一样。没有返回200状态代码 – bluerubez

+0

@Cleb似乎是因为'GOOG'不被API接受(不明白为什么,在移动到Alphabet GOOG ticker后)。适用于'GOOGL'和各种其他符号。为防万一,调整示例。 –

10

扩展@Def_Os's答案与实际演示...

正如@Def_Os已经说过的 - 使用Pandas Datareader使得这一任务真正的乐趣

In [12]: from pandas_datareader import data 

拉动所有可用的历史数据为AAPL1980-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:/温度/ 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库,这里是一个示例代码,将下载您从雅虎财经需要的数据:

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

这应该这样做。让我知道它是否有效。

+0

只是好奇 - 雅虎金融提供的pandas_datareader(反之亦然)有什么好处? – Mathematician

+0

当时我是唯一可以找到关于拉动雅虎财经股票价格的图书馆。但是,它似乎没有工作了。 – Naufal

+0

确认 - 21/02/2018 - 'yahoo_finance'不再有效。 – 3kstc