如何有效地从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')

在大多数情况下,history方法将返回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分钟
  • 有效符号(返回数据的符号):19,415
  • 数据框中的总行数:1,008,180
  • 没有数据的符号:6,571

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...