You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

yfinance指定起止日期无效?返回数据日期不符的问题排查与解决

解决yfinance返回数据日期与设置起止日期不符的问题

问题重现

用户执行以下代码获取股票数据:

import yfinance as yf
import pandas as pd

tickers = ['AAPL','NVDA','MSFT']
b_date = '2010-01-01'
e_date = '2020-12-31'
stock_data = yf.download(tickers,b_date,e_date)
print(stock_data)

用户疑问

我设置的起止日期为2010-01-01至2020-12-31,但返回的结果仅显示2010-01-04至2020-12-30的数据,这让我无法理解,因为2010-01-01是周三,2020-12-31是周四,并非非交易日。请问该如何解决?

返回数据示例

[*********************100%%**********************]  3 of 3 completed
             Adj Close                          ...     Volume                    
                  AAPL        MSFT        NVDA  ...       AAPL      MSFT      NVDA
Date                                            ...                               
2010-01-04    6.487534   23.522572    4.240801  ...  493729600  38409100  80020400
2010-01-05    6.498749   23.530165    4.302728  ...  601904800  49749600  72864800
2010-01-06    6.395379   23.385765    4.330251  ...  552160000  58182400  64916800
2010-01-07    6.383555   23.142555    4.245389  ...  477131200  50559700  54779200
2010-01-08    6.425995   23.302160    4.254561  ...  447610800  51197400  47816800
...                ...         ...         ...  ...        ...       ...       ...
2020-12-23  128.856812  215.676376  129.811371  ...   88223700  18699600  17914400
2020-12-24  129.850571  217.364548  129.656723  ...   54930100  10550600   9788400
2020-12-28  134.494797  219.521133  128.721237  ...  124486200  17933500  21256400
2020-12-29  132.704025  218.730698  129.152817  ...  121047300  17403200  17037200
2020-12-30  131.572495  216.320389  131.173416  ...   96452100  20272300  22539600

[2768 rows x 18 columns]

环境信息

  • yfinance 0.2.28
  • pandas 2.0.3

问题原因

  1. 目标日期为美股休市日:
    • 2010年1月1日是美国新年法定假期,美股当日休市,无交易数据。
    • 2020年12月31日因新年假期调整,美股当日休市,无交易数据。
  2. yfinance的默认逻辑:
    yfinance的download方法仅返回存在交易记录的交易日数据,自动过滤休市日;同时end参数会获取不晚于该日期的最后一个交易日数据,因此返回2020-12-30的数据。

解决方案

1. 验证目标日期是否为交易日

可以通过yfinance的Ticker对象单独查询目标日期的交易数据,确认是否为休市日:

aapl = yf.Ticker("AAPL")
# 检查2010-01-01是否有数据
print(aapl.history(start='2010-01-01', end='2010-01-02'))
# 检查2020-12-31是否有数据
print(aapl.history(start='2020-12-31', end='2021-01-01'))

运行后会发现这两个日期均无数据,证明是休市日。

2. 生成包含所有日期的数据集(填充缺失值)

如果需要数据覆盖设置的全部日期(包括休市日),可以用pandas重新生成日期范围,再填充缺失值:

# 生成完整的日期范围(按天)
full_date_range = pd.date_range(start=b_date, end=e_date, freq='D')
# 重新索引原数据,引入休市日的空值行
stock_data_full = stock_data.reindex(full_date_range)
# 用前一个交易日的数据填充休市日的缺失值,也可根据需求选择bfill(后向填充)或其他方式
stock_data_full = stock_data_full.ffill()

处理后的数据会包含你设置的所有日期,休市日的数据将沿用前一个交易日的数值。


内容的提问来源于stack exchange,提问作者Aiden Huang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:44:55