【问题标题】:calculate cummulative return using loop使用循环计算累积回报
【发布时间】:2013-12-02 17:07:07
【问题描述】:

我目前正在研究一些每月回报的对冲基金数据,但我希望获得累积回报。我已经尝试过 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

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

魏

【问题讨论】:

  • 轻微的性能提升,如果你把 2 if else 合二为一。
  • 如果你的代码给了你预期的结果,这对我来说并不完全清楚。您能否提供您尝试实现的数学公式?
  • 感谢您的评论。以mock数据集中的fund 1为例,计算fund1在day3的累计收益我需要做(1+day 1 return)*(1+day2 return )*(1+day3 回报)。由于第 1 天的回报为 NA,基金 1 第 3 天的累计回报应该等于 (1-0.08)*(1+0.1)。它实际上是一个非NA的1+数字的运行产品。
  • 我花了很长时间才弄清楚您是如何获得results 中的数字的。我认为这些是第一列的方程式:1 + -0.08; (1 + 0.10) * 0.92; (1 + 0.23) * 1.012。如果是这样,这可能会帮助其他人提供解决方案。
  • 是的标记这是我计算我需要的结果的方式。为令人困惑的例子道歉。

标签: r for-loop return


【解决方案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 部分

【讨论】:

  • 谢谢,@MarkMiller。我正在尝试探究 OP 的最终要求到底是什么。
  • 感谢 Codoremifa,这正是我想要的!我将测试在我的真实数据上运行代码,看看它可以帮助节省多少时间。再次感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-08
  • 2023-01-18
  • 2016-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多