R语言循环优化:NZDUSD与多证券时间序列线性回归
时间序列回归代码优化方案
需求说明
- 以
nzdusd为因变量,分别与spx、adxy、vix三个自变量执行时间序列线性回归,获取每个回归的R²值 - 原代码仅针对
spx实现了完整逻辑(含60天滑动窗口、收益率转换、回归计算),需通过循环重构代码,消除重复复制变量名的冗余操作,支持后续快速添加更多自变量 - 保留原代码的核心计算逻辑,确保结果一致性
优化后代码
library(tseries) library(lmtest) library(dplyr) library(lubridate) # 配置参数:60天时间窗口 window_days <- 60 # 加载数据(修正原代码路径语法错误) my_path <- file.path("K:", "X", "bbg_daily.Rdata") load(file = my_path) # 处理因变量nzdusd的收益率 pct_nzdusd <- nzdusd %>% select(date, PX_LAST) %>% mutate( lag_price = lag(PX_LAST), pct_chg = (PX_LAST - lag_price) * 100 / lag_price ) %>% select(date, pct_chg) %>% drop_na() # 移除缺失值(lag后第一行缺失) # 定义单个自变量的回归处理函数 run_regression <- function(var_name) { # 获取对应的数据框 var_data <- get(var_name) # 处理自变量收益率 pct_var <- var_data %>% select(date, PX_LAST) %>% mutate( lag_price = lag(PX_LAST), pct_chg = (PX_LAST - lag_price) * 100 / lag_price ) %>% select(date, pct_chg) %>% drop_na() # 合并因变量和自变量的收益率数据 combined_ts <- inner_join(pct_nzdusd, pct_var, by = "date") # 截取最后60天的窗口数据 start_idx <- nrow(combined_ts) - window_days + 1 ts_sub <- combined_ts[start_idx:nrow(combined_ts), ] # 执行回归 reg_model <- lm(pct_chg.x ~ pct_chg.y, data = ts_sub) # 提取结果 r2 <- summary(reg_model)$r.squared stderr <- sqrt(deviance(reg_model)/df.residual(reg_model)) # 返回结果列表 return(list( variable = var_name, r_squared = r2, standard_error = stderr )) } # 定义需要处理的自变量列表(后续添加新变量直接修改此处) independent_vars <- c("spx", "adxy", "vix") # 循环执行所有回归并收集结果 reg_results <- lapply(independent_vars, run_regression) reg_results_df <- bind_rows(reg_results) # 查看结果 print(reg_results_df) # 保存结果到指定路径 save_path <- file.path("K:", "x", "regression_results.Rdata") save(reg_results_df, file = save_path)
代码优化说明
- 消除冗余代码:将重复的收益率转换、窗口截取、回归计算逻辑封装为
run_regression函数,避免重复复制变量名 - 灵活扩展:只需修改
independent_vars向量即可添加新的自变量,无需修改核心逻辑 - 规范数据处理:添加
drop_na()移除收益率计算后的缺失值,避免回归报错;用数据框统一存储结果,便于后续分析和查看 - 修正原代码问题:修复了原代码中路径字符串的语法错误,移除了不必要的
assign操作(R中不推荐使用assign动态创建变量,易导致代码混乱)
内容的提问来源于stack exchange,提问作者Niall Healy
相关产品推荐
相关产品推荐

