如何高效地从雅虎财经下载大量代码?

How can efficiently download a large list of tickers from Yahoo Finance?

我有一个非常大的代码列表,我想使用 Yahoo finance 下载财务数据。

我现在正在使用 python,但也欢迎使用 R 解决方案。

这是一段 python 代码,还附有带有代码的 excel 文件:

import yfinance as yf
from yahoofinancials import YahooFinancials

# get tickers 
mf_tickers = pd.read_excel('tickers_mutual_funds.xlsx')

# download data 
tickers = mf_tickers.Symbol
funds_financials = YahooFinancials(tickers)

data = funds_financials.get_historical_price_data(start_date='2019-01-01', 
                                                  end_date='2019-12-31',
                                                  time_interval='weekly')

问题是我的计算机加载这种大小的数据需要很长时间,比如几个小时。

加载这些数据的更好、更有效的方法是什么?如前所述,我对 python 或 R 解决方案都很满意。

要加载的文件: https://www.dropbox.com/s/1l41tk8gxzqvutd/tickers_mutual_funds%20copy.xlsx?dl=0

谢谢

我会提供一个名为 yahooquery 的软件包,其中包含 免责声明:我是该软件包的作者

您可以这样做:

from yahooquery import Ticker

mf_symbols = pd.read_excel('tickers_mutual_funds.xlsx')
symbols = mf_tickers.Symbol.tolist()

tickers = Ticker(symbols, asynchronous=True)

data = tickers.history(start='2019-01-01', end='2019-12-31', interval='1wk')

在大多数情况下,历史方法将 return 一个 pandas.DataFrame。但是,您的列表中有很多股票代码在 2019 年不存在,或者根本没有数据。所以,这将是一个字典,每个符号作为一个键。

以下是获取单个数据框的方法:

# Add symbol column to each dataframe
for key in data:
    if isinstance(data[key], pd.DataFrame):
        data[key]['symbol'] = key

# Concat all dataframes
df = pd.concat([data[k] for k in data if isinstance(data[k], pd.DataFrame)])

这是我 运行 使用上述相同功能时的一些统计数据:

  • 运行时间:~5 分钟
  • 有效符号(return编辑数据的符号):19,415
  • 数据框中的总行数:1,008,180
  • 没有数据的符号:6,571