You need to enable JavaScript to run this app. YFinance批量下载大量股票代码数据时出现JSONDecodeError问题求助
优惠活动
大模型
产品
解决方案
定价
更多

YFinance批量下载大量股票代码数据时出现JSONDecodeError问题求助

问题根因

你遇到的JSONDecodeError和进度卡死问题本质是雅虎财经接口的反爬限流机制触发导致的:当你一次性请求2000个标的的行情数据时,过高的并发请求会触发接口限流,服务端会返回429/503错误的HTML页面而非标准JSON格式数据,yfinance解析这类非JSON响应时就会抛出解析错误,未处理的异常会导致后续下载逻辑中断卡在99%。

解决方案

1. 调整并发参数

不要直接设置threads=True,该参数会默认启用和CPU核心数相等的并发线程,请求密度过高极易触发限流。建议将线程数调整为3~8的较小值,降低请求频率:

# 调整为小并发线程数
sample = yf.download(schwab_list, start=start, end=end, threads=5)

2. 拆分批量+增加延时

将2000个标的的列表拆分为每2050个一组,每组下载完成后停留12秒再请求下一组,进一步降低触发限流的概率:

import time

# 按每批30个拆分标的列表
batch_size = 30
batch_list = [schwab_list[i:i+batch_size] for i in range(0, len(schwab_list), batch_size)]
result = []
for batch in batch_list:
    batch_data = yf.download(batch, start=start, end=end, threads=5)
    result.append(batch_data)
    time.sleep(1.5)
# 合并所有批次数据
sample = pd.concat(result, axis=1)

3. 增加异常捕获与重试逻辑

对单次下载失败的标的单独捕获异常并重试3~5次,避免单个标的请求失败影响全量下载进度:

from tenacity import retry, stop_after_attempt, wait_exponential

@retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=2, max=10))
def download_batch(batch, start, end):
    return yf.download(batch, start=start, end=end, threads=5)

如果不想额外安装tenacity库,也可以自己写简单的循环重试逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 04:12:01