我有一个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])
}
})
答案 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中计算。