R语言实现带滞后项的多变量滚动回归及系数均值计算
R语言高性能实现方案
全程用data.table做数据处理、slider做滚动窗口计算,默认开启多线程,千级股票量级的计算可以在秒级完成。
步骤1:依赖安装与加载
没装过依赖包先跑安装命令,之后加载包:
install.packages(c("data.table", "slider")) library(data.table) library(slider) setDTthreads(0) # 调用所有可用CPU核心计算,大样本提速明显
步骤2:数据对齐预处理
先把宽表转长表处理,避免逐股票写重复循环,同时提前计算好所有滞后项,减少滚动阶段的重复计算:
注意:滞后项的位移逻辑完全按照你给出的2010年回归示例校准:无额外滞后时费用已经领先价格1年,因此1-5阶回归滞后对应费用列分别向前位移2-6个年份
# 假设Prices、Expenses已经读入为R数据框,Date列为整数格式的年份 setDT(Prices) setDT(Expenses) # 宽表转长表 prices_long <- melt(Prices, id.vars = "Date", variable.name = "stock", value.name = "price") expenses_long <- melt(Expenses, id.vars = "Date", variable.name = "stock", value.name = "expense") # 按年份、股票匹配两个数据集 dt <- merge(prices_long, expenses_long, by = c("Date", "stock"), all.x = TRUE) setorder(dt, stock, Date) # 提前生成1-5阶滞后对应的费用列 dt[, paste0("exp_lag", 1:5) := lapply(2:6, function(n) shift(expense, n = n)), by = stock]
步骤3:滚动回归与系数均值计算
定义单窗口计算函数,用8年滚动窗口分别跑5个滞后项的一元回归,提取自变量系数后算算术平均:
# 单窗口计算逻辑:输入8年的窗口数据,返回5个滞后回归的系数均值 get_avg_coef <- function(window_data) { # 窗口不足8个完整观测直接返回NA if (nrow(window_data) < 8) return(NA_real_) # 分别跑5个滞后的回归,提取费用项系数,报错时返回NA coef_list <- sapply(paste0("exp_lag", 1:5), function(col) { tryCatch( coef(lm(as.formula(paste("price ~", col)), data = window_data))[[2]], error = function(e) NA_real_ ) }) # 计算算术平均,自动跳过无效NA值 mean(coef_list, na.rm = TRUE) } # 按股票分组执行滚动计算 dt[, avg_coef := slide_period_dbl( .x = .SD, .i = Date, .period = "year", .f = get_avg_coef, .before = 7, # 向前回溯7年+当年,正好8年窗口 .complete = TRUE # 仅当窗口满8年时计算结果 ), by = stock, .SDcols = c("price", paste0("exp_lag", 1:5))]
步骤4:输出为要求的宽表格式
# 长表转宽表,得到最终结果 final_result <- dcast(dt[!is.na(avg_coef)], Date ~ stock, value.var = "avg_coef") setnames(final_result, "Date", "date")
优化提示
- 如果股票数量超过1000只,可以把
lm替换为RcppEigen::fastLm,回归速度可以提升5-10倍,逻辑完全兼容。 - 首次跑的时候建议抽单只股票(比如Stock1)2010年的窗口手动计算核对,确认年份、滞后项对齐无误后再跑全量。
内容的提问来源于stack exchange,提问作者Ramon
相关产品推荐
相关产品推荐

