我目前正在研究一些月度回报的对冲基金数据,但我希望能有累积回报。我已经尝试过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
我将非常感谢您的任何评论。感谢
卫
答案 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部分