【问题标题】:How do I speed up rolling regressions?如何加快滚动回归?
【发布时间】:2017-11-19 14:27:36
【问题描述】:

我有大量公司股票回报率和价值加权标准普尔 500 指数回报率。我想应用滚动窗口回归,将过去十二个月的公司收益回归到价值加权 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&P500 回报。

目前,运行此 for 循环大约需要 1 小时。

我的问题是:有什么方法可以加快这个过程,我已经尝试在 zoo(ReturnMatrix) 上使用 rollapply,但这只会更慢。

任何帮助将不胜感激。

【问题讨论】:

    标签: r regression


    【解决方案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
    ....
    

    【讨论】:

    • 像魅力一样工作,而且速度很快!非常感谢先生!
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 2021-10-17
    • 2018-06-16
    • 1970-01-01
    • 2019-09-25
    • 1970-01-01
    • 2016-06-04
    • 2013-05-24
    相关资源
    最近更新 更多