You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

yfinance 0.2.33查询无效股票后无法获取有效股票数据问题求助

yfinance 0.2.33批量查询时无效股票导致后续请求失败的解决办法

问题本质

yfinance内部默认复用全局的requests会话,当查询无效股票触发连接错误后,这个会话会处于异常状态,后续所有请求复用该会话都会失败,哪怕是查询有效股票也会返回错误。

解决办法

1. 为每个请求创建独立会话

每次查询都新建一个requests会话,避免复用异常会话:

import yfinance as yf
from requests import Session

def fetch_stock_data(symbol):
    # 新建独立会话
    session = Session()
    ticker = yf.Ticker(symbol, session=session)
    try:
        return ticker.history(period="max")
    except Exception as e:
        print(f"{symbol} 查询失败: {str(e)}")
        return None
    finally:
        # 用完关闭会话
        session.close()

# 批量查询示例
stock_symbols = ["0250.HK", "0001.HK"]
for symbol in stock_symbols:
    data = fetch_stock_data(symbol)
    if data is not None:
        print(f"{symbol} 数据获取成功,共{len(data)}条记录")

2. 捕获异常后重置全局会话

如果不想频繁创建会话,可以在捕获异常后重置yfinance的全局会话:

import yfinance as yf

stock_symbols = ["0250.HK", "0001.HK"]
for symbol in stock_symbols:
    try:
        data = yf.Ticker(symbol).history(period="max")
        print(f"{symbol} 数据获取成功")
    except Exception as e:
        print(f"{symbol} 查询失败: {str(e)}")
        # 重置全局会话,让后续请求重新创建会话
        yf.set_ticker_session(None)

3. 增加重试机制(应对临时连接问题)

针对连接超时这类临时错误,给会话添加重试逻辑,减少因单次连接失败导致的异常:

import yfinance as yf
from requests import Session
from requests.adapters import HTTPAdapter
from urllib3.util.retry import Retry

def build_retry_session(retries=3):
    session = Session()
    # 配置重试规则
    retry_strategy = Retry(
        total=retries,
        backoff_factor=0.2,  # 重试间隔递增
        status_forcelist=[429, 500, 502, 503, 504]  # 需要重试的状态码
    )
    adapter = HTTPAdapter(max_retries=retry_strategy)
    session.mount("https://", adapter)
    session.mount("http://", adapter)
    return session

def fetch_stock_data(symbol):
    session = build_retry_session()
    ticker = yf.Ticker(symbol, session=session)
    try:
        return ticker.history(period="max")
    except Exception as e:
        print(f"{symbol} 查询失败: {str(e)}")
        return None
    finally:
        session.close()

# 批量执行
for symbol in ["0250.HK", "0001.HK"]:
    fetch_stock_data(symbol)

原理说明

yfinance默认使用全局requests会话来优化请求性能,但当某个请求触发Connection refused这类致命错误时,会话的连接池会被破坏,后续请求复用这个会话就无法正常建立连接。通过创建独立会话或重置全局会话,能让后续请求使用全新的、正常的会话来和Yahoo Finance交互。

内容的提问来源于stack exchange,提问作者ecit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 19:43:33