R中嵌套循环的性能降低

时间:2020-07-19 05:35:00

标签: r performance xts stock

我有一个xts系列,包含250个观察值和584列。我正在本系列上运行一个嵌套的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])
    
  }
})

2 个答案:

答案 0 :(得分:3)

您的示例中的结果对我来说很奇怪。您对1997-01-31的收益是1996-01-31到1996-11-30的累积收益。为什么您不理会1996-12-31的回报?

无论如何,您使用rollapply来获得答案。对于我来说,您的示例运行速度比Jerome答案中的单循环快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)

答案 1 :(得分:1)

R循环异常缓慢。您可以同时计算多个列上的累计收益:

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倍。

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

相关问题