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

