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
问题原因
- 目标日期为美股休市日:
- 2010年1月1日是美国新年法定假期,美股当日休市,无交易数据。
- 2020年12月31日因新年假期调整,美股当日休市,无交易数据。
- 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
相关产品推荐
相关产品推荐

