使用循环计算累积回报

时间:2013-11-19 08:29:42

标签: r for-loop return

我目前正在研究一些月度回报的对冲基金数据,但我希望能有累积回报。我已经尝试过Return.cummulative函数,但是由于我的数据集中的NA,它没有给出我想要的结果。我已经编写了一个循环来获得结果,但完成循环需要很长时间。我复制下面的代码,请帮助我弄清楚如何缩短循环时间。我是R的首发,所以我的代码看起来很愚蠢。如果没有循环,请随时告诉我其他替代方案。我的真实数据集包含10000多个对冲基金和200多个月回报。正如您所料,我的代码将花费数小时来完成计算。我相信有其他选择但是在这一刻,我必须遵循我写的愚蠢的代码。

mock<-data.frame(matrix(NA,ncol=2,nrow=4))
rownames(mock)<-as.vector(c("day1","day2","day3","day4"))
colnames(mock)<-as.vector(c("fund1","fund2"))
mock[,1]<-c(NA,-0.08,0.1,0.23)
mock[,2]<-c(NA,-0.08,0.22,NA)
mock
results<-data.frame(matrix(NA,ncol=2,nrow=4))
prev <- 1 
for (j in 1:2){for(i in 1:4) { 
  if (is.na(mock[i,j])) { 
    results[i,j] <- NA 
  } else { 
    results[i,j]<-((1+mock[i,j])*prev) 
  } 
  if(is.na(results[i,j])){prev<-1}else{prev <- results[i,j]} 
} }
results

我将非常感谢您的任何评论。感谢

1 个答案:

答案 0 :(得分:1)

你是否在每栏上寻找这样的东西?

library(data.table)
mock <- data.table(mock)

# initiate mockreturns dataset
mockreturns <- copy(mock)
# overwrite NAs with 0s to allo cumprod to work
mockreturns[is.na(mockreturns)] <- 0
# names of return cols in new dataset
setnames(mockreturns,paste0(colnames(mock),"returns"))
#calculate cumulative interest
mockreturns <- mockreturns[,
      lapply(
        .SD, 
        function(x) 
          cumprod(
            x+1
            )
        )
    ]
#replace the NA returns with NAs
mockreturns[is.na(mock)] <- NA

输出 -

> mockreturns
   fund1returns fund2returns
1:           NA           NA
2:      0.92000       0.9200
3:      1.01200       1.1224
4:      1.24476           NA

感谢Mark,指出我曾经考虑过NA部分