使用yfinance下载数据时出现JSONDecodeError异常的排查咨询
报错本质
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0) 出现的核心原因是yfinance从雅虎财经服务端拿到的响应不是合法JSON内容——可能是空响应、限流返回的HTML提示页、接口鉴权失效返回的空字符串,直接调用.json()解析就会触发报错。
yfinance底层用多线程做异步下载,线程内部抛出的异常不会向上传递到主程序,这也是为什么你的主程序不会被异常中断,但实际拿不到有效数据的原因。
排查修复步骤
- 优先升级yfinance版本
雅虎财经的公开接口会不定期调整鉴权规则、请求路径,旧版本yfinance因为没有同步适配改动,就会突发这类全量下载失效的问题。直接执行命令pip install --upgrade yfinance拉取最新稳定版,能解决90%以上同类无预兆突发报错。 - 检查网络与IP限流状态
如果升级后报错依旧存在,就需要排查当前网络出口IP是否被雅虎接口临时限流。可以手动在浏览器访问对应行情接口的返回内容,比如复制https://query1.finance.yahoo.com/v8/finance/chart/BTC-USD?interval=1wk&range=3000d这个地址到浏览器查看,如果返回的是空白内容、安全验证页、登录跳转页,就说明IP被临时拦截,一般等待12-24小时会自动解封,也可以直接切换其他网络环境快速验证。 - 禁用多线程并发降低拦截概率
多线程并发请求是触发服务端限流的常见原因,在yf.download调用时增加threads=False参数,改成单线程顺序下载,能大幅降低被服务端拦截的概率,修改后的代码参考:for ticker in tickers: df[ticker] = yf.download( ticker, start, end, interval="1wk", threads=False )['Adj Close'].dropna() - 补全容错逻辑
因为yfinance会静默吞掉线程内的异常,建议在循环下载逻辑里增加数据空值判断,当单只标的下载结果为空时自动重试2-3次,应对服务端偶发的接口波动。
内容的提问来源于stack exchange,提问作者HenryChinasky
相关产品推荐
相关产品推荐

