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
相关产品推荐
相关产品推荐

