在python中自动从yahoo finance下载历史股票价格

Download history stock prices automatically from yahoo finance in python

提问人:zzzbbx 提问时间:9/15/2012 最后编辑:MaxU - stand with Ukrainezzzbbx 更新时间:8/28/2021 访问量:133708

问:

有没有办法从雅虎财经或谷歌财经(csv格式)自动下载股票的历史价格?最好是 Python。

熊猫 金融 雅虎财经 谷歌财经 股票行情

评论

0赞 John 6/23/2014
看看 scrape-google-finance.compunect.com 这是一个相当新的开源 PHP 抓取工具,用于 Google 金融。它是免费使用/修改的,您可以从 Google 下载所有股票价格和所有公司。从中学习并用 python 编写相同的内容应该不会太难。

答:

42赞 Joe C. 9/15/2012 #1

简短的回答:是的。使用 Python 的 urllib 提取您想要的股票的历史数据页面。选择雅虎财经;谷歌既不那么可靠,数据覆盖率也越小,而且在拥有它后如何使用它也更加严格。此外,我相信 Google 明确禁止您抓取其服务条款中的数据。

更长的答案:这是我用来提取特定公司的所有历史数据的脚本。它提取特定股票代码的历史数据页面,然后将其保存到以该代码命名的 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()
108赞 Def_Os 9/20/2012 #2

当你要在Python中使用这样的时间序列时,是必不可少的。好消息是:它附带了雅虎的历史数据下载器:.pandaspandas.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-datareader 软件包。安装方式:pandas.io.datapandas>=0.19

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

还支持从 Google 财经下载。

pandas-datareader 的文档中还有更多内容。

14赞 MaxU - stand with Ukraine 6/14/2016 #3

用实际演示扩展@Def_Os的答案......

正如 @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:/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
...
8赞 Naufal 7/26/2016 #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")

这应该可以做到。让我知道它是否有效。

更新: 不再支持yahoo_finance库。

4赞 atreadw 4/13/2019 #5

您可以查看yahoo_fin包。它最初是在雅虎财经更改其 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_data.to_csv("aapl_data.csv")

nflx_data.to_csv("nflx_data.csv")
2赞 Jonas Byström 10/15/2020 #6

当您知道如何操作时,这是微不足道的:

import yfinance as yf
df = yf.download('CVS', '2015-01-01')
df.to_csv('cvs-health-corp.csv')

如果你想绘制它:

import finplot as fplt
fplt.candlestick_ochl(df[['Open','Close','High','Low']])
fplt.show()

enter image description here