【问题标题】:Slow performance of nested loop in RR中嵌套循环的性能缓慢
【发布时间】:2020-11-08 14:23:55
【问题描述】:

我有一个包含 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 performance xts stock


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

    【讨论】:

      【解决方案2】:

      您的示例中的结果对我来说看起来很奇怪。 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)
      

      【讨论】:

      • Ulrich 先生,我这样做是有目的的。实际上我是在复制动量策略,根据文献,形成期和持有期之间必须有 1 个月的差距,以避免微观结构偏差。
      • 我同意应该有 1 个月的差距。你有两个月的间隔。截至 1997 年 1 月底,您的结果表明您只能使用 1996 年 11 月底的数据做出决定。这就像说您只能使用 5 月底的数据来做出投资决策本月底。为什么你会忽略 6 月份的数据?
      • @sim235 只应用 lag.xts 而不是 lag。
      • @JoshuaUlrich 谢谢先生,你救了我。我犯了严重错误
      • @sim235:不客气,乐于助人。关于您的错误:您已加载 dplyr,它掩盖了基本 R 附带的 stats::lag() 泛型函数。这会破坏定义 lag() 方法的所有 S3 类的方法分派。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 1970-01-01
      • 2018-07-14
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      相关资源
      最近更新 更多