Yahoo Finance API / URL 不起作用:Pandas DataReader 的 Python 修复
Posted
技术标签:
【中文标题】Yahoo Finance API / URL 不起作用:Pandas DataReader 的 Python 修复【英文标题】:Yahoo Finance API / URL not working: Python fix for Pandas DataReader 【发布时间】:2017-10-22 02:01:03 【问题描述】:自 2017 年 5 月 16 日以来,使用 Pandas DataReader 的“yahoo”方法无法访问雅虎财经 URL。我尚未测试昨天发布的这个 fix-yahoo-finance:https://pypi.python.org/pypi/fix-yahoo-finance,声明:“Yahoo !finance 已停用其历史数据 API”。
编辑 2017 年 8 月 2 日:此后我按照https://pypi.python.org/pypi/fix-yahoo-finance 中的步骤执行以下操作:$ pip3 install fix_yahoo_finance --upgrade --no-cache-dir,升级 pandas_datareader 以使用“fix-yahoo-finance 0.0.6 ",以及修改后的代码:
from pandas_datareader import data as pdr
import fix_yahoo_finance
data = pdr.get_data_yahoo('AAPL', start='2017-04-23', end='2017-05-24')
请注意,最后 2 个数据列的顺序是“Adj Close”和“Volume”,即。不是以前的格式。出于我的目的,它们只是重置为原始格式:
cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
data.reindex(columns=cols)
【问题讨论】:
【参考方案1】:我会推荐使用 Quandl。我不确定雅虎在被收购后是否可靠。 在 Quandl 中,如果您有多个符号,则必须循环。阅读docs 并执行以下操作:
import quandl as qdl
start_date = '2016-01-01'
end_date = '2017-05-22'
for symbol in symbols:
quandldata = qdl.get_table("WIKI/PRICES",qopts="columns":["date", "adj_close"],
ticker=symbol, date = 'gte': start_date,'lte' : end_date)
# specify that the quandldata df has index col = 'date'
quandldata = quandldata.set_index(["date"], drop=True)
# rename col adj close to the respective symbol to prevent *** w/ same name for all cols
quandldata = quandldata.rename(columns='adj_close': symbol)
df = df.join(quandldata)
【讨论】:
谢谢,我不确定 Quandl 是否提供 ASX 股票的数据。一家数据供应商 eoddata.com 可能值得一看。 我只能抓20只股票,每10分钟有时间限制。如果在10分钟内超过20只股票,就会弹出错误,破码。因此,如果我想从标准普尔 500 指数中抓取所有 505 只股票,我至少需要 4.2 小时(((505 只股票/20 只股票)*10 分钟)/60 分钟)。这是非常低效的。如果您尝试使用带有 yahoo 的 pandas_datareader 获取 MSFT 的股票数据,然后单击从错误消息中获得的链接“YAHOO!马上回来”。https://ichart.finance.yahoo.com/table.csv?s=MSFT&a=0&b=1&c=2016&d=0&e=1&f=2017&g=d&ignore=.csv
使用 Quandl,您会想开设一个免费帐户。当您这样做时,您将获得 2000 个电话/10 分钟。【参考方案2】:
import pandas_datareader.data as pdweb
from pandas_datareader import data as pdr
import fix_yahoo_finance # must pip install first
data = pdr.get_data_yahoo('SPY','2017-05-20','2017-05-23')
data = pdr.get_data_yahoo(['SPY','QQQ'],'2017-05-01','2017-05-23', as_panel=False,group_by = 'ticker')
【讨论】:
【参考方案3】:我已按照https://pypi.python.org/pypi/fix-yahoo-finance 中的步骤执行以下操作: $ pip3 install fix_yahoo_finance --upgrade --no-cache-dir 并且还升级了 pandas_datareader 以确保。
“fix-yahoo-finance 0.0.6”运行良好,例如 BHP.AX:
from pandas_datareader import data as pdr
import fix_yahoo_finance
data = pdr.get_data_yahoo('BHP.AX', start='2017-04-23', end='2017-05-24')
请注意,最后 2 个数据列的顺序是“Adj Close”和“Volume”,即。不是以前的格式。出于我的目的,它们被重置为原始格式:
cols = ['Date', 'Open', 'High', 'Low', 'Close', 'Volume', 'Adj Close']
data.reindex(columns=cols)
【讨论】:
【参考方案4】:我喜欢 user3443068 的回答,因为它很简单。
我还建议将 Google 用作您的来源,因为考虑到公司的发展方向,雅虎实例可能会经历许多已弃用的版本。
def get_ret(tickers_ls, start_dt, end_dt):
#create dataframe
df_ret=pd.DataFrame()
#get prices for all tickers
for tk in tickers:
p = wb.DataReader(tk, "google", start_date, end_date).Close
df_ret_tmp = p.to_frame()['Close'].reset_index()
df_ret_tmp['Ticker']=tk
## append
df_ret=df_ret.append(df_ret_tmp)
#pivot and get into single dataframe
pivoted = df_ret.pivot(index='Date', columns='Ticker')
pivoted.columns = pivoted.columns.droplevel(0)
return pivoted
【讨论】:
Google 并不是一个真正可行的选择,因为他们会调整拆分价格,而不是股息以上是关于Yahoo Finance API / URL 不起作用:Pandas DataReader 的 Python 修复的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas datareader 不再适用于 yahoo-finance 更改的 url
Yahoo Finance API 股票/股票代码查找只允许完全匹配
如何使用 Yahoo,Finance stock API 获取股票数据