如何对数据框按公司分组取各日期[-50,-10]区间计算回归截距和beta
滚动窗口回归实现方案
你需要的是按公司分组的偏移滚动窗口回归,我们可以结合data.table的分组运算和zoo的rollapply函数实现需求,完整操作步骤如下:
首先先确保数据按公司和日期排序,避免时序错乱:
# 按公司、日期排序,保证时序正确 setkey(stocks, Company, date)
然后自定义回归函数,处理窗口长度不足的边界情况:
# 自定义回归函数,输入对应窗口的Return和indexfactor,返回截距和beta roll_reg <- function(data) { # data是两列的矩阵,第一列Return,第二列indexfactor fit <- lm(Return ~ indexfactor, data = as.data.frame(data)) return(coef(fit)) }
最后执行分组滚动计算,把结果写入新列:
# 按公司分组执行滚动回归 stocks[, c("intercept", "beta") := { # 合并当前组的Return和indexfactor为矩阵 mat <- cbind(Return, indexfactor) # 滚动窗口设置:取当前行之前偏移-50到-10的观测,共41个样本点 res <- rollapply(mat, width = list(seq(-50, -10)), FUN = roll_reg, by.column = FALSE, align = "right", fill = NA) as.data.table(res) }, by = Company]
关键参数说明
width = list(seq(-50, -10)):指定窗口取当前行的前50个到前10个观测,刚好匹配你要求的区间by.column = FALSE:表示把整段窗口的多列数据一起传入自定义函数,而不是按列单独计算fill = NA:如果当前行之前的观测数不足50个,无法取到有效回归区间时,对应字段返回NA- 回归结果的两列会自动映射到新增的
intercept(截距)和beta(indexfactor系数)字段
内容的提问来源于stack exchange,提问作者thomas.diridondo
相关产品推荐
相关产品推荐

