如何加快滚动回归?

时间:2017-11-19 14:27:37

标签: r regression

我有一大批公司股票回报和价值加权S& P500回报。我想应用滚动窗口回归,其中我在过去的12个月中对价值加权S& P500回报的公司回报进行回归,并提取平方残差的标准差。

我的代码如下

stdev <- matrix(NA,nrow = nrow(ReturnMatrix),ncol = 1)
pb <- winProgressBar(title = "",label = "",min = 1,max = 
nrow(ReturnMatrix)-11)
for(i in 1:(nrow(ReturnMatrix)-11))
{
 VWRet <- ReturnMatrix$VWReturn[i:(i+11)]
 Ret <- ReturnMatrix$Return[i:(i+11)]
 if(sum(is.na(Ret)) >= 6)
 {
   stdev[i+11] <- NA  
 }
else{
   Model <- glm(Ret~VWRet-1)
   stdev[i+11] <- sigma(Model)
   }
setWinProgressBar(pb,value = i,title = paste0(round(100*
(i/(nrow(ReturnMatrix) - 11)),2)," % Done"))
}
SD <- cbind.data.frame(ReturnMatrix,stdev)

数据帧ReturnMatrix非常大,它包含3239065行。数据框中的变量是PERMNO,它是一个公司标识符,YearMonth是YYYYMM格式的日期,Return是该月的公司回报,VWReturn是价值加权S&amp; P500的回报。

现在,运行此循环需要大约1小时。

我的问题是:有没有办法加快这个过程的速度,我尝试在动物园(ReturnMatrix)上使用rollapply,但这只会减慢它的速度。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

以下是使用data.table执行此操作的方法,这应该是执行所需操作的最快方法。首先需要构建一个sigma函数,然后将rollaplyr.SD一起使用。

set.seed(1)
library(data.table)
dt <- data.table(PERMNO=rep(LETTERS[1:3],each=13),
                 YearMonth=seq.Date(from=Sys.Date(),by="month",length.out =13),
                 Return=runif(39),VWReturn=runif(39))

#create sigma function
stdev <- function(x) sd(lm(x[, 1]~ x[, 2])$residuals)

#create new column with rollapply
dt[,roll_sd:=rollapplyr(.SD, 12, stdev, by.column = FALSE, fill = NA),
    by=.(PERMNO),.SDcols = c("Return", "VWReturn")]

    PERMNO  YearMonth     Return   VWReturn   roll_sd
 1:      A 2017-11-19 0.26550866 0.41127443        NA
 2:      A 2017-12-19 0.37212390 0.82094629        NA
 3:      A 2018-01-19 0.57285336 0.64706019        NA
 4:      A 2018-02-19 0.90820779 0.78293276        NA
 5:      A 2018-03-19 0.20168193 0.55303631        NA
 6:      A 2018-04-19 0.89838968 0.52971958        NA
 7:      A 2018-05-19 0.94467527 0.78935623        NA
 8:      A 2018-06-19 0.66079779 0.02333120        NA
 9:      A 2018-07-19 0.62911404 0.47723007        NA
10:      A 2018-08-19 0.06178627 0.73231374        NA
11:      A 2018-09-19 0.20597457 0.69273156        NA
12:      A 2018-10-19 0.17655675 0.47761962 0.3181427
13:      A 2018-11-19 0.68702285 0.86120948 0.3141638
14:      B 2017-11-19 0.38410372 0.43809711        NA
....