问题描述
我有大量的股票行情清单,我想使用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