从 yahoo finance python 一次下载多个股票

新手上路,请多包涵

我对雅虎金融使用熊猫数据阅读器的功能有疑问。几个月来我一直在使用一个包含股票代码的列表,并在以下几行中执行它:

 import pandas_datareader as pdr
import datetime

stocks = ["stock1","stock2",....]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)

f = pdr.DataReader(stocks, 'yahoo',start,end)

从昨天开始,我收到错误“IndexError:list index out of range”,只有在我尝试获取多只股票时才会出现。

最近几天有什么我必须考虑的变化吗?或者你有更好的解决我的问题的方法吗?

原文由 ScharcoMolten 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

更新于 2021-01-19

 tickers = ['msft', 'aapl', 'twtr', 'intc', 'tsm', 'goog', 'amzn', 'fb', 'nvda']
df = pdr.DataReader(tickers, data_source='yahoo', start='2017-01-01', end='2020-09-28')

原始答案

如果您通读 Pandas DataReader 的 文档,他们会立即对多个数据源 API 发布贬值,其中之一是 Yahoo!金融。

v0.6.0(2018 年 1 月 24 日)

立即弃用 Yahoo! , Google Options and QuotesEDGAR 。这些 API 背后的端点发生了根本性的变化,现有读者需要完全重写。对于大多数 Yahoo! 端点已被删除的数据。 PDR 希望恢复这些功能,欢迎提出请求请求。

这可能是导致您收到 IndexError 的(或任何其他通常不存在的错误)的罪魁祸首。


然而,还有另一个 Python 包,其目标是修复对 Yahoo! 的支持。 Pandas DataReader 的财务,您可以在此处找到该软件包:

https://pypi.python.org/pypi/fix-yahoo-finance

根据他们的文档:

雅虎! finance 已经停用了他们的历史数据 API,导致许多依赖它的程序停止工作。

fix-yahoo-finance 通过从 Yahoo! 抓取数据来临时解决该问题。 finance 使用并返回格式与 pandas_datareaderget_data_yahoo() 相同的 Pandas DataFrame/Panel。

通过基本上“劫持” pandas_datareader.data.get_data_yahoo() 方法, fix-yahoo-finance 的植入很容易,只需要将 fix_yahoo_finance 导入你的代码。

您需要添加的是:

 from pandas_datareader import data as pdr
import fix_yahoo_finance as yf

yf.pdr_override()

stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)

f = pdr.get_data_yahoo(stocks, start=start, end=end)

甚至不需要 Pandas DataReader:

 import fix_yahoo_finance as yf

stocks = ["stock1","stock2", ...]
start = datetime.datetime(2012,5,31)
end = datetime.datetime(2018,3,1)
data = yf.download(stocks, start=start, end=end)

原文由 Taku 发布,翻译遵循 CC BY-SA 4.0 许可协议

您可以使用带有 pandas 的新 Python YahooFinancials 模块来执行此操作。 YahooFinancials 构建良好,通过散列出每个 Yahoo Finance 网页中存在的数据存储对象来获取数据,因此它速度很快,并且不依赖于旧的已停产的 api,也不像 scraper 那样依赖网络驱动程序。数据以 JSON 格式返回,您可以通过传入股票/指数代码列表来一次提取任意数量的股票,以初始化 YahooFinancials 类。

$ pip 安装 yahoofinancials

使用示例:

 from yahoofinancials import YahooFinancials
import pandas as pd

# Select Tickers and stock history dates
ticker = 'AAPL'
ticker2 = 'MSFT'
ticker3 = 'INTC'
index = '^NDX'
freq = 'daily'
start_date = '2012-10-01'
end_date = '2017-10-01'

# Function to clean data extracts
def clean_stock_data(stock_data_list):
    new_list = []
    for rec in stock_data_list:
        if 'type' not in rec.keys():
            new_list.append(rec)
    return new_list

# Construct yahoo financials objects for data extraction
aapl_financials = YahooFinancials(ticker)
mfst_financials = YahooFinancials(ticker2)
intl_financials = YahooFinancials(ticker3)
index_financials = YahooFinancials(index)

# Clean returned stock history data and remove dividend events from price history
daily_aapl_data = clean_stock_data(aapl_financials
                                     .get_historical_stock_data(start_date, end_date, freq)[ticker]['prices'])
daily_msft_data = clean_stock_data(mfst_financials
                                     .get_historical_stock_data(start_date, end_date, freq)[ticker2]['prices'])
daily_intl_data = clean_stock_data(intl_financials
                                     .get_historical_stock_data(start_date, end_date, freq)[ticker3]['prices'])
daily_index_data = index_financials.get_historical_stock_data(start_date, end_date, freq)[index]['prices']
stock_hist_data_list = [{'NDX': daily_index_data}, {'AAPL': daily_aapl_data}, {'MSFT': daily_msft_data},
                        {'INTL': daily_intl_data}]

# Function to construct data frame based on a stock and it's market index
def build_data_frame(data_list1, data_list2, data_list3, data_list4):
    data_dict = {}
    i = 0
    for list_item in data_list2:
        if 'type' not in list_item.keys():
            data_dict.update({list_item['formatted_date']: {'NDX': data_list1[i]['close'], 'AAPL': list_item['close'],
                                                            'MSFT': data_list3[i]['close'],
                                                            'INTL': data_list4[i]['close']}})
            i += 1
    tseries = pd.to_datetime(list(data_dict.keys()))
    df = pd.DataFrame(data=list(data_dict.values()), index=tseries,
                      columns=['NDX', 'AAPL', 'MSFT', 'INTL']).sort_index()
    return df

多个股票数据示例(返回每个代码的 JSON 对象列表):

 from yahoofinancials import YahooFinancials

tech_stocks = ['AAPL', 'MSFT', 'INTC']
bank_stocks = ['WFC', 'BAC', 'C']

yahoo_financials_tech = YahooFinancials(tech_stocks)
yahoo_financials_banks = YahooFinancials(bank_stocks)

tech_cash_flow_data_an = yahoo_financials_tech.get_financial_stmts('annual', 'cash')
bank_cash_flow_data_an = yahoo_financials_banks.get_financial_stmts('annual', 'cash')

banks_net_ebit = yahoo_financials_banks.get_ebit()
tech_stock_price_data = tech_cash_flow_data.get_stock_price_data()
daily_bank_stock_prices = yahoo_financials_banks.get_historical_stock_data('2008-09-15', '2017-09-15', 'daily')

JSON 输出示例:

代码:

 yahoo_financials = YahooFinancials('WFC')
print(yahoo_financials.get_historical_stock_data("2017-09-10", "2017-10-10", "monthly"))

JSON 返回:

 {
    "WFC": {
        "prices": [
            {
                "volume": 260271600,
                "formatted_date": "2017-09-30",
                "high": 55.77000045776367,
                "adjclose": 54.91999816894531,
                "low": 52.84000015258789,
                "date": 1506830400,
                "close": 54.91999816894531,
                "open": 55.15999984741211
            }
        ],
        "eventsData": [],
        "firstTradeDate": {
            "date": 76233600,
            "formatted_date": "1972-06-01"
        },
        "isPending": false,
        "timeZone": {
            "gmtOffset": -14400
        },
        "id": "1mo15050196001507611600"
    }
}

原文由 alt777 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题