R中嵌套循环的性能缓慢

Slow performance of nested loop in R

我有一个包含 250 个观测值和 584 列的 xts 系列。我是 运行 本系列的嵌套 for 循环。这种嵌套循环需要太多时间。我试图创建一个可重现的示例。在实际数据集上,嵌套循环花费了太多时间。请建议一些有效的方法来执行相同的嵌套循环

library(PerformanceAnalytics)
library(xts)
library(zoo)
## dataset
bsereturn<-managers
##### calculating bse_lag
bse_lag<-head(bsereturn,-1)

## calculating bse forward
bse_forward<-tail(bsereturn,-1)

## defining look back and skip period
s=12
k=1
## Empty xts to store looping results
XSMOM = bse_lag
XSMOM[1:nrow(XSMOM),1:ncol(XSMOM)] <- NA
# Compute Momentum
system.time(for (i in 1:ncol(bse_lag)){
  
  for (t in (s + 1):nrow(bse_lag)){
    XSMOM[t,i] =  Return.cumulative(bse_lag[(t-s):(t-1-k),i])
    
  }
})

R 循环非常慢。您可以同时计算多个列的累积 return:

system.time(
    for (t in (s + 1):nrow(bse_lag)){
        XSMOM[t,1:ncol(bse_lag)] =  Return.cumulative(bse_lag[(t-s):(t-1-k),1:ncol(bse_lag)])
    }
)

这在我的机器上快了大约 5 倍。

我认为您也可以以增量方式有效地计算累积 return(因此速度大约 s=12 倍),但可能不能直接在 R 中计算。

我觉得你例子中的结果很奇怪。 1997-01-31 的 return 是 1996-01-31 到 1996-11-30 的累积 return。为什么忽略 1996-12-31 的 return?

无论如何,您使用 rollapply 来获得答案。你的例子对我来说比杰罗姆的答案中的单循环快 4 倍。

# this is what I would do
xsmom <- lag(rollapplyr(1 + bsereturn, 11, prod) - 1)
# this is what you have (lagged 2 periods)
xsmom2 <- lag(rollapplyr(1 + bsereturn, 11, prod) - 1, 2)