遍历 yfinance 代码列表的最快方法是什么?

What is the fastest way to iterate through a list of yfinance tickers?

我正在使用 python yfinance yahoo API 进行股票数据检索。现在我得到挂钩比率,这是一个公司价格与其增长和收益相关的指标。我从这里下载了一个 csv:https://www.nasdaq.com/market-activity/stocks/screener。 它正好有 8000 只股票。

我所做的是获取符号列表,并对其进行迭代以访问雅虎自动收报机。然后我得到一个使用 ticker.info 方法的 returns 字典。我通过 8000 个符号重复这个过程。它以每分钟 6 个符号的速度运行,这是不可行的。使用另一个 API 或其他结构是否有更快的方法?我不关心API,只要我能获得基本信息,如增长、收益、EPS 和那些东西。

代码如下:

import pandas as pd
import yfinance as yf


data = pd.read_csv("data/stock_list.csv")
symbols = data['Symbol']
for symbol in symbols:
    stock = yf.Ticker(symbol)
    try:
        if stock.info['pegRatio']:
            print(stock.info['shortName'] + " : " + str(stock.info['pegRatio']))
    except KeyError:
        pass

似乎需要Ticker.info属性中的某些数据时,会发出HTTP请求来获取它们。多线程将有助于改善问题。试试这个:-

import pandas as pd
import yfinance as yf
import concurrent.futures

data = pd.read_csv('data/stock_list.csv')

def getPR(symbol):
    sn = None
    pr = None
    try:
        stock = yf.Ticker(symbol)
        pr = stock.info['pegRatio']
        sn = stock.info['shortName']
    except Exception:
        pass
    return (sn, pr)


with concurrent.futures.ThreadPoolExecutor() as executor:
    futures = {executor.submit(getPR, sym): sym for sym in data['Symbol']}
    for future in concurrent.futures.as_completed(futures):
        sn, pr = future.result()
        if sn:
            print(f'{sn} : {pr}')