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

使用yfinance多线程下载ticker追加到外部列表数据缺失如何解决

yfinance多线程下载股票数据丢包问题解决方案

核心问题原因

  • yfinance的yf.download()方法本身已内置多线程处理逻辑,同时自定义外层ThreadPoolExecutor多线程调用会导致嵌套多线程冲突,yfinance内部的全局进度统计、请求会话变量被多个线程同时改写,你看到的200%异常下载进度就是该冲突的典型表现,最终会导致返回的DataFrame丢失部分ticker数据。
  • 多个线程同时向雅虎财经接口发起批量请求,会触发接口限流规则,部分请求被拦截丢弃,也会导致返回数据不全。
  • 可确认multi_df的append操作无问题:Python中list.append是原子操作,线程安全,你输出的multi_df length 5也证明5个线程的执行结果都已正常追加到列表中,问题完全出在yf.download()的调用逻辑上。

修复方案

方案1:直接使用yfinance内置多线程(推荐)

不需要自己拆分ticker列表、自定义外层多线程,直接将全量ticker传入yf.download(),用其自带的threads参数实现并发即可,代码简化后如下:

import yfinance as yf
from datetime import datetime

all_tickers = sp500_tickers.copy()
full_df = yf.download(
    all_tickers, 
    period="max", 
    start=start_date, 
    end=datetime.now().date(), 
    threads=True
)

该方案性能优于自定义外层多线程,且不会出现冲突问题。

方案2:保留外层多线程,关闭yfinance内置多线程

如果需要自己控制拆分逻辑,可将yf.download()的threads参数设为False,避免嵌套多线程冲突,修正后的thread_download函数如下:

def thread_download(i):
    the_list = sublists[i].tolist()
    print('the_list',the_list)
    # 关闭yfinance内部多线程
    dl_df = yf.download(
        the_list, 
        period="max", 
        start=start_date, 
        end=datetime.now().date(), 
        threads=False
    )
    multi_df.append(dl_df)

该方案修复后可正常拿到所有子列表的ticker数据。

额外排查建议

如果修复后仍有个别ticker数据缺失,可单独调用yf.download()下载该ticker的数据,确认是否为ticker代码错误、标的退市、接口无对应历史数据导致的正常缺失。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 05:54:03