You need to enable JavaScript to run this app. Python如何自动选取上一交易日收盘价计算涨跌幅 解决移位日期缺失问题
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:45:04