如何解决如何在滚动回归中解决此错误?
我正在尝试计算此财务数据的 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
也许你们中的一些人有更好的想法 :) 谢谢!
解决方法
我们使用宽度为 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)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。