Python如何自动选取上一交易日收盘价计算涨跌幅 解决移位日期缺失问题
问题原因
你当前代码返回NaN的核心原因是:shift(1, freq='B')仅会将索引按工作日规则偏移1天,之后直接和原索引做对齐匹配,如果偏移后的日期不在你的原始数据的交易日索引内(比如2009/10/26为节假日,未纳入你的数据索引),对应位置就会返回空值,不会自动回溯选取最近的上一交易日数据。
推荐解决方法
方法1:直接按行移位(适用数据索引已按交易日排序的场景)
如果你的stock_store的时间索引已经是按交易日升序排序、无重复、仅包含实际交易日期,直接去掉freq参数即可,不带freq的shift是按数据行的顺序移位,上一行天然就是上一交易日的对应数据,不用考虑中间的节假日空缺:
# 日涨跌幅 data["D-Chg"] = stock_store['Adj Close'] - stock_store['Adj Close'].shift(1) # 3日涨跌幅 data["3D-Chg"] = stock_store['Adj Close'] - stock_store['Adj Close'].shift(3) # 2周(10个交易日)涨跌幅 data["2W-Chg"] = stock_store['Adj Close'] - stock_store['Adj Close'].shift(10)
方法2:按日期偏移+前向填充(适用需要严格按自然日偏移找最近交易日的场景)
如果你需要严格按日历规则计算偏移天数,再自动匹配最近的上一交易日,可以用reindex+前向填充的方式实现:
import pandas as pd # 先确保索引是datetime类型且已排序 stock_store = stock_store.sort_index() # 计算日涨跌幅:偏移1个工作日 offset = pd.offsets.BDay(1) offset_dates = stock_store.index - offset # 用偏移后的日期重索引,缺失值自动取最近的前一个有效值 prev_1d_close = stock_store['Adj Close'].reindex(offset_dates, method='pad') prev_1d_close.index = stock_store.index data["D-Chg"] = stock_store['Adj Close'] - prev_1d_close # 计算3日涨跌幅:偏移3个工作日 offset_3d = pd.offsets.BDay(3) offset_dates_3d = stock_store.index - offset_3d prev_3d_close = stock_store['Adj Close'].reindex(offset_dates_3d, method='pad') prev_3d_close.index = stock_store.index data["3D-Chg"] = stock_store['Adj Close'] - prev_3d_close # 计算2周涨跌幅:偏移10个工作日/或按自然周偏移可替换为pd.offsets.Week(2) offset_2w = pd.offsets.BDay(10) offset_dates_2w = stock_store.index - offset_2w prev_2w_close = stock_store['Adj Close'].reindex(offset_dates_2w, method='pad') prev_2w_close.index = stock_store.index data["2W-Chg"] = stock_store['Adj Close'] - prev_2w_close
内容的提问来源于stack exchange,提问作者user125104
相关产品推荐
相关产品推荐

