使用 yfinance 快速获取多个股票行情信息

Get info on multiple stock tickers quickly using yfinance

我正在尝试获取 S&P500 中所有代码的当前价格和市值,而我目前这样做的方式非常缓慢,所以我想知道我是否可以做些什么来改进它,或任何其他方法。 这是我目前的方法,只需打印名称、市值和当前价格:

import yfinance as yf

#I am using a csv file with a list of all the tickers which I use to create a pandas dataframe and form a space seperated string of all of the tickers called all_symbols
#I have simplified the pandas dataframe to a list for the purpose of this question

ticker_list = ["A", "AL", "AAP", "AAPL", ... "ZBRA", "ZION", "ZTS"]
all_symbols  = " ".join(ticker_list)

tickers = yf.Tickers(all_symbols)

for ticker in ticker_list:
    price = tickers.tickers[ticker].info["currentPrice"]
    market_cap = tickers.tickers[ticker].info["marketCap"]
    print(ticker, market_cap, price)

这种方法目前非常慢,一次接收一个信息,所以有没有办法让它更快and/or批量获取代码信息。

我也试过用yf.download的方法一次下载多个行情的信息,这样比较快,但是我无法从中得到我想要的信息,所以有没有可能得到市场使用 yf.download 方法的上限和当前价格?

虽然也有类似的问题,但是好像都是和我一样的思路,在tickers多的时候耗时比较长,目前还没找到更快的解决方案比我目前的建议,所以任何建议都值得赞赏,即使是不使用 yfinance 的解决方案,只要他们获得实时数据而不会出现大量延迟。

您可能会发现,在离散线程中获取单个代码的值会给您带来更好的整体性能。这是一个例子:

import yfinance as yf
from concurrent.futures import ThreadPoolExecutor

def get_stats(ticker):
    info = yf.Tickers(ticker).tickers[ticker].info
    print(f"{ticker} {info['currentPrice']} {info['marketCap']}")

ticker_list = ['AAPL', 'ORCL', 'PREM.L', 'UKOG.L', 'KOD.L', 'TOM.L', 'VELA.L', 'MSFT', 'AMZN', 'GOOG']

with ThreadPoolExecutor() as executor:
    executor.map(get_stats, ticker_list)

输出:

VELA.L 0.035 6004320
UKOG.L 0.1139 18496450
PREM.L 0.461 89516976
ORCL 76.755 204970377216
MSFT 294.8669 2210578825216
TOM.L 0.604 10558403
KOD.L 0.3 47496900
AMZN 3152.02 1603886514176
AAPL 171.425 2797553057792
GOOG 2698.05 1784584732672

您可以尝试另一个名为 yahooquery 的库。在我的试用中,时间从 34 秒减少到 0.4 秒。

from yahooquery import Ticker

ticker_list = ["A", "AL", "AAP", "AAPL", "ZBRA", "ZION", "ZTS"]
all_symbols = " ".join(ticker_list)
myInfo = Ticker(all_symbols)
myDict = myInfo.price

for ticker in ticker_list:
    ticker = str(ticker)
    longName = myDict[ticker]['longName']
    market_cap = myDict[ticker]['marketCap']
    price = myDict[ticker]['regularMarketPrice']
    print(ticker, longName, market_cap, price)

myDict{}字典中还有很多其他信息,请查看。