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

如何让R中用while循环通过lm函数实现13次股票回归的代码正常运行?

修正多股票Fama-French回归的R代码

原代码的问题

  1. 循环终止条件错误:原代码i <=13仅能处理3只股票(i=1、6、11),剩余10只股票完全未被处理——因为下一个i值为16,超出13后循环直接终止。
  2. 列表索引浪费:直接用i作为列表索引会导致列表中存在大量空元素(比如lm_results[[2]]到lm_results[[5]]都是空值),既不美观也不利于后续操作。

修正后的代码方案

方案一:修正原while循环逻辑

保留原循环结构,调整终止条件和列表索引方式:

df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",")

lm_results <- list()
count <- 1
i <- 1

# 每5列对应一只股票,13只股票对应i的取值为1,6,...,61
while (i <= 61) {
  # 第i列是RET,i+1到i+3分别为mktrf、smb、hml
  lm_results[[count]] <- lm(df[, i] ~ df[, i+1] + df[, i+2] + df[, i+3])
  # 为结果命名,方便后续识别对应股票
  names(lm_results)[count] <- colnames(df)[i]
  i <- i + 5
  count <- count + 1
}

方案二:用for循环实现(推荐,可读性更强)

通过生成RET列的索引序列,用for循环遍历每只股票:

df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",")

lm_results <- list()
# 生成所有股票RET列的索引:1,6,11,...,61
ret_indices <- seq(from = 1, to = 61, by = 5)

for (idx in seq_along(ret_indices)) {
  ret_col <- ret_indices[idx]
  # 对应因子列是RET列索引+1、+2、+3
  model <- lm(df[, ret_col] ~ df[, ret_col+1] + df[, ret_col+2] + df[, ret_col+3])
  lm_results[[idx]] <- model
  # 为结果命名
  names(lm_results)[idx] <- colnames(df)[ret_col]
}

方案三:基于列名规律的优雅实现(如果列名有统一规则)

假设每只股票的列名遵循StockX_RET、StockX_mktrf、StockX_smb、StockX_hml的格式,可以直接通过列名构建模型:

df <- read.csv("stockRetFF.csv", header = TRUE, sep = ",")

lm_results <- list()
# 提取所有股票的编号(从列名中剥离)
stock_ids <- unique(sub("_.*", "", colnames(df)))

for (id in stock_ids) {
  # 拼接对应列名
  ret_col <- paste0(id, "_RET")
  mktrf_col <- paste0(id, "_mktrf")
  smb_col <- paste0(id, "_smb")
  hml_col <- paste0(id, "_hml")
  # 构建回归公式
  formula_str <- paste(ret_col, "~", mktrf_col, "+", smb_col, "+", hml_col)
  model <- lm(formula_str, data = df)
  lm_results[[id]] <- model
}

结果查看

  • 查看单只股票的回归结果:summary(lm_results[[1]])(替换数字为对应股票的索引或名称)
  • 批量查看所有结果:lapply(lm_results, summary)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:00:58