yfinance 在 Python 中获取历史数据时返回空 DataFrame/错误
yfinance 在 Python 中获取历史数据时返回空 DataFrame/错误
问题描述
尝试使用 yfinance 下载微软(MSFT)的历史股票数据时,遇到下载失败错误,提示股票代码未找到时区或可能已退市;即使切换到其他股票代码(如AAPL)也出现相同问题,最终返回空的DataFrame。
环境配置
- Python 版本:3.11.3
- yfinance 版本:0.2.31
- 操作系统:Windows 10 专业版
问题复现代码
import yfinance as yf # 尝试获取2025年1月的MSFT数据 df = yf.download("MSFT", start='2025-01-01', end='2025-02-01') df.head()
错误信息
获取股票代码“MSFT”失败,原因:预期值:第 1 行第 1 列(字符 0)
[100%%*****] 1/1 已完成
1 下载失败:
['MSFT']:异常('%ticker%:未找到时区,股票代码可能已退市')
已尝试的排查步骤
- 执行
pip install --upgrade yfinance确保使用最新版本 - 确认网络连接稳定
- 测试其他股票代码(如AAPL),结果相同
解决方案
1. 修正日期范围(最优先的即时修复)
你的代码中指定的start='2025-01-01'是未来日期,当前时间(截至2024年)该时间段还未产生任何历史数据,这是导致空DataFrame的核心原因。请调整为过去的有效日期范围:
# 示例:获取2024年1月的MSFT数据 df = yf.download("MSFT", start='2024-01-01', end='2024-02-01')
2. 解决yfinance 0.2.31版本的时区Bug
yfinance 0.2.31版本存在已知的时区获取逻辑缺陷,即使日期正确也会触发错误。可通过以下方式修复:
方案A:降级到稳定版本
降级到经过验证的0.2.30版本(社区反馈该版本无此问题):
pip install yfinance==0.2.30 --force-reinstall
方案B:使用period参数替代start/end
避免直接指定日期范围,改用period参数快速获取历史数据:
# 获取最近1年的MSFT数据 df = yf.download("MSFT", period="1y")
方案C:使用Ticker对象的历史数据接口
绕开yf.download()的问题,直接使用Ticker对象的history()方法:
msft = yf.Ticker("MSFT") df = msft.history(start='2024-01-01', end='2024-02-01', auto_adjust=False)
3. 验证数据源访问权限
如果上述方法无效,可能是网络或数据源接口问题:
- 检查yfinance的GitHub Issues页面,确认是否有官方已知的接口变更Bug
- 尝试关闭VPN或切换网络环境,部分网络会限制Yahoo Finance的访问
- 清除yfinance的本地缓存:删除用户目录下的
~/.cache/yfinance文件夹
验证修复结果
完成操作后,通过以下代码验证数据是否成功获取:
print(f"数据行数:{df.shape[0]}") # 输出应大于0 print(df.head())




