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
相关产品推荐
相关产品推荐

