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

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())

火山引擎 最新活动