使用pdr.get_data_yahoo循环拉取股票数据出现日期缺失如何解决
问题成因
- 雅虎财经接口存在明确的请求频率限制,当前代码仅设置1秒的固定请求间隔,仍会触发平台限流规则。接口被限流后不会抛出可被
try-except捕获的明显异常,只会返回截断的部分数据甚至仅最近1条交易数据,最终被代码直接写入CSV文件。 - pandas_datareader内置的雅虎数据接口已停止维护多年,本身存在会话复用、参数传递的逻辑缺陷,批量循环请求时容易出现前序请求的参数残留,导致后续请求返回的数据异常。
- 小概率为标的本身在指定时间范围内存在停牌、退市等情况,对应交易日期本身就较少,该情况可通过单独拉取同时间范围的标的数据排查排除。
解决方案
- 调整请求间隔策略,替换固定1秒等待为随机间隔,规避固定频率的限流检测:
导入random模块后,将time.sleep(1)修改为time.sleep(random.uniform(1.5, 3)) - 替换雅虎接口适配层,使用仍在活跃维护的yfinance库兼容原有逻辑:
安装yfinance后在代码开头添加如下2行即可,原有pdr.get_data_yahoo调用无需修改,批量拉取稳定性会大幅提升:import yfinance as yf yf.pdr_override() - 新增数据完整性校验逻辑,拉取到数据后先校验数据量是否符合预期,不符合则自动重试,重试失败再标记异常,避免直接写入残缺数据:
比如指定时间范围预期有N个交易日,可添加判断if len(df) < int(N*0.8),触发后重试当前标的拉取,最多重试3次仍不达标再打印错误信息。 - 自定义requests会话复用逻辑,避免每次请求新建连接导致的接口校验异常,降低请求失败概率。
内容的提问来源于stack exchange,提问作者LOUIS PALANKI
相关产品推荐
相关产品推荐

