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

R语言处理股票事件日期:将非纽交所交易日调整为最近前序交易日

交易日偏移调整实现方案

步骤1:依赖包安装加载

我们用timeDate包获取纽交所官方节假日,dplyr做数据处理,lubridate处理日期格式:

install.packages(c("timeDate", "dplyr", "lubridate"))
library(timeDate)
library(dplyr)
library(lubridate)

步骤2:生成NYSE合法交易日序列

首先生成覆盖你数据时间范围的交易日向量,所有偏移后的日期都会匹配这个向量里的最近前值:

# 取你数据的最小和最大日期,前后多扩展1年避免边界问题
min_date <- min(showdate) - years(1)
max_date <- max(showdate) + years(1)

# 生成区间内所有自然日
all_dates <- seq.Date(min_date, max_date, by = "day")
# 排除周末 + NYSE节假日,得到交易日列表
nyse_holidays <- as.Date(holidayNYSE(year = year(min_date):year(max_date)))
trading_days <- all_dates[!wday(all_dates, week_start = 1) %in% c(6,7) & !all_dates %in% nyse_holidays]

步骤3:自定义偏移调整函数

输入基础日期、偏移天数n,自动调整为偏移后的最近前一个交易日:

adjust_trading_day <- function(base_date, n, trading_days_vec = trading_days) {
  # 先计算原始偏移日期
  raw_date <- base_date + days(n)
  # 找到小于等于raw_date的最大交易日
  max(trading_days_vec[trading_days_vec <= raw_date])
}
# 向量化函数,支持批量处理
adjust_trading_day_vec <- Vectorize(adjust_trading_day, vectorize.args = "base_date")

步骤4:结合dplyr批量处理

和你原有代码逻辑完全兼容,直接替换原来的mutate逻辑即可:

# 加1天调整示例
df <- df %>%
  mutate(testdate = adjust_trading_day_vec(showdate, n = 1))

# 减1天调整示例
df <- df %>%
  mutate(testdate = adjust_trading_day_vec(showdate, n = -1))

# 扩展到±20天直接修改n参数即可,比如加20天:
df <- df %>%
  mutate(testdate_20d = adjust_trading_day_vec(showdate, n = 20))

退市股票处理逻辑

调整后的日期如果对应股票已退市,关联价格表时不会匹配到数据,你可以直接用inner_join关联价格表自动过滤无效记录,或者用left_join后筛选非空价格行即可。

示例测试(用你提供的showdate数据)

# 加载你的示例日期数据
showdate_sample <- structure(c(18857, 18368, 17487, 17248, 16934, 17081, 17000, 
16994, 16993, 16917, 16910, 18822, 18456, 18194, 16959, 17805, 
17757, 17511, 17178, 18883, 18858, 18842, 18837, 18836, 18835, 
18831, 18821, 18815, 18814, 18808, 18800, 18795, 18792, 18773, 
18752, 18745, 18744, 18740, 18738, 18731, 18722, 18717, 18662, 
18661, 18659, 18649, 18648, 18647, 18646, 18642, 18618, 18611, 
18597, 18596, 18589, 18577, 18576, 18575, 18570, 18565, 18562, 
18561, 18558, 18556, 18555, 18548, 18547, 18542, 18528, 18519, 
18514, 18498, 18494, 18492, 18486, 18480, 18473, 18472, 18470, 
18466), class = c("IDate", "Date"))

# 测试加1天调整
test_result <- adjust_trading_day_vec(showdate_sample, n=1)
# 查看前10条结果
head(test_result, 10)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 07:54:03