You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用Pandas Datareader从Yahoo获取股票数据时出现ReadTimeout错误的原因排查

关于pandas_datareader访问Yahoo Finance出现ReadTimeout的原因分析

这个ReadTimeout错误确实有可能是Yahoo Finance端的问题,但也存在不少其他常见诱因,我来给你拆解清楚:

一、Yahoo Finance端的潜在问题

  • Yahoo Finance的公开数据接口稳定性一直不算理想,尤其是近几年他们多次调整了接口的访问策略,经常会出现临时限流、服务器维护或者IP临时封锁的情况,直接导致请求超时。
  • 当Yahoo的服务器负载过高时,会放缓对第三方请求的响应速度,一旦超过你代码里默认的30秒超时阈值,就会触发这个错误。

二、其他可能的诱因

  • 本地网络问题:你的网络波动大、防火墙/代理拦截了请求,或者带宽不足,都会导致数据传输速度过慢,无法在超时时间内完成读取。
  • 请求频率过高:你循环请求8只股票的数据,短时间内连续发送请求,Yahoo可能会判定为疑似恶意访问,故意延迟响应甚至拒绝连接,最终引发超时。
  • 版本兼容问题:如果你的pandas_datareader是旧版本,可能和Yahoo Finance的最新接口不兼容,导致请求过程中出现异常阻塞,进而触发超时。

三、几个实用的解决建议

  1. 延长超时时间:在DataReader调用里手动设置更长的超时时间,给服务器足够的响应时间:
    tmp = pdr.DataReader(i, 'yahoo', '1/1/2010', dt.date.today(), timeout=60)
    
  2. 添加请求间隔:在循环中加入短暂延迟,避免密集请求触发Yahoo的限流机制:
    import time
    tickers = ['AAPL','TSM','COKE','V','GE','JNJ','T','BABA']
    Closeprice = pd.DataFrame()
    for i in tickers:
        tmp = pdr.DataReader(i, 'yahoo', '1/1/2010', dt.date.today())
        Closeprice[i] = tmp['Adj Close']
        time.sleep(1)  # 每次请求后暂停1秒,降低请求频率
    
  3. 更换更稳定的库:如果Yahoo的问题频繁出现,推荐使用yfinance库(专门针对Yahoo Finance做的替代工具,稳定性远高于pandas_datareader的Yahoo数据源),用法也很类似。
  4. 排查网络环境:确认本地网络没有被代理、防火墙限制,或者尝试切换到其他网络环境测试。

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

火山引擎 最新活动