为何重采样Yahoo Finance日线OHLC数据需用shift(-1)匹配周线?
技术解析:为何重采样周线需要
shift(-1) 核心原因:周区间定义与标签锚点的差异
你遇到的问题本质是Pandas重采样的周区间规则和Yahoo Finance周线的规则存在偏移,具体拆解如下:
Pandas
W-Sat的周规则
当使用resample('W-Sat')时,Pandas将每周六作为周区间的结束标签,周的覆盖范围是上周日至本周六。但美股仅在周一至周五交易,所以每个区间的有效数据是该周周一到周五的行情。
例如:- 标签
2024-04-06(周六)对应的数据是2024-04-01至2024-04-05(周一至周五)的交易数据; - 标签
2024-04-13(周六)对应的数据是2024-04-08至2024-04-12的交易数据。
- 标签
Yahoo Finance周线的规则
Yahoo的周线数据直接采用周一至周五作为交易周区间,并将**当周最后一个交易日(周五)**作为数据的索引标签。
例如:- 标签
2024-04-05(周五)对应的数据就是2024-04-01至2024-04-05的行情; - 标签
2024-04-12(周五)对应的数据是2024-04-08至2024-04-12的行情。
- 标签
shift(-1)的作用:对齐数据匹配Yahoo的返回结果
对比两者可以发现:Pandas中标签为周六的行,其数据正好等于Yahoo中标签为前一天周五的行。但由于你的时间范围是2024-04-01至2024-05-03,Pandas重采样后会多生成一组对应2024-04-29至2024-05-03数据的区间(标签2024-05-04)。执行
shift(-1)会将所有数据行向上移动一行:- 原标签
2024-04-13的数据(对应Yahoo的2024-04-12周)移到2024-04-06的位置; - 原标签
2024-04-20的数据移到2024-04-13的位置; - 最后一行(标签
2024-05-04)的数据移到2024-04-27的位置,最后一行变为NaN。
再执行
dropna()删除空行后,剩下的数据就和Yahoo返回的周线数据完全匹配。- 原标签
更优替代方案
其实无需使用shift(-1),直接将重采样频率改为W-Fri,让Pandas以周五作为周标签,就能和Yahoo的周线规则完全对齐:
weekly_data = daily_data.resample('W-Fri').agg({ 'Open': 'first', 'High': 'max', 'Low': 'min', 'Close': 'last', 'Volume': 'sum' }).dropna()
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

