【发布时间】: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。如果是这样,这可能会帮助其他人提供解决方案。 -
是的标记这是我计算我需要的结果的方式。为令人困惑的例子道歉。