【问题标题】:How do I solve this error in a rolling regression?如何在滚动回归中解决此错误?
【发布时间】:2021-05-10 15:45:58
【问题描述】:

我正在尝试计算此财务数据的 beta。我想提取回归的第一个系数并将该值放入一个新列中。这必须为每个股票 ID 单独完成。回归应该使用代码所示的最近 30 个月的数据。我使用滚动回归的思路如下:

check[, b := as.data.table(roll_regres(lm(check$RET.USD ~ check$RMRF), width = 30, min_obs = 12))[,2], by = Id]

当我不考虑使用 by = Id 更改 ID 时,roll_regres 函数本身可以正常工作。在我看来,这不起作用是合乎逻辑的,但我想不出不同的方法。我在 3 年内将这些数据与两个 ID 一起使用:

> head(check)
       Id RET.USD month year  RMRF       ym
1: 258580   -8.06     4 2001  7.94 Apr 2001
2: 258580  -11.57     5 2001  0.72 May 2001
3: 258580  -16.94     6 2001 -1.94 Jun 2001
4: 258580  -17.30     7 2001 -2.13 Jul 2001
5: 258580  -13.97     8 2001 -6.46 Aug 2001
6: 258580  -25.06     9 2001 -9.25 Sep 2001

也许你们中的一些人有更好的想法 :) 谢谢!

【问题讨论】:

    标签: r regression


    【解决方案1】:

    我们使用宽度为 5 且最小为 4,以便我们可以将其应用于问题中的 6 行数据表。使用定义的等效roll 函数之一。实际使用的那个避免 lm 给出相同的结果。

    library(data.table)
    library(zoo)
    
    # roll <- function(x) coef(lm(x[, 1] ~ x[, 2]))[[2]]
    roll <- function(x) cov(x[, 1], x[, 2]) / var(x[, 2])
    DT[, beta := rollapplyr(cbind(RET.USD, RMRF), 5, roll, fill = NA, 
      partial = 4, by.column = FALSE), by = Id]
    

    给予:

    > DT
           Id RET.USD month year  RMRF       ym      beta
    1: 258580   -8.06     4 2001  7.94 Apr 2001        NA
    2: 258580  -11.57     5 2001  0.72 May 2001        NA
    3: 258580  -16.94     6 2001 -1.94 Jun 2001        NA
    4: 258580  -17.30     7 2001 -2.13 Jul 2001 0.8889737
    5: 258580  -13.97     8 2001 -6.46 Aug 2001 0.5514858
    6: 258580  -25.06     9 2001 -9.25 Sep 2001 0.9459004
    

    作为检查,我们看到使用 lm 我们在第 5 行得到相同的 beta 值:

    coef(lm(RET.USD ~ RMRF, DT, subset = 1:5))[[2]]
    ## [1] 0.5514858
    

    注意

    Lines <- '
         Id RET.USD month year  RMRF       ym
     258580   -8.06     4 2001  7.94 "Apr 2001"
     258580  -11.57     5 2001  0.72 "May 2001"
     258580  -16.94     6 2001 -1.94 "Jun 2001"
     258580  -17.30     7 2001 -2.13 "Jul 2001"
     258580  -13.97     8 2001 -6.46 "Aug 2001"
     258580  -25.06     9 2001 -9.25 "Sep 2001"'
    DT <- fread(Lines)
    

    【讨论】:

      猜你喜欢
      • 2016-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 2017-12-12
      相关资源
      最近更新 更多