计算每月退货的期间回报

时间:2017-07-11 19:49:01

标签: r

这可能听起来很幼稚,但我似乎无法找到解决方案。我需要计算1年,3年和5年的回报,我的数据集包括月度回报而不是价格。我正在处理的数据集类似于managers

data(managers)  
tail(managers) 
              HAM1    HAM2   HAM3    HAM4    HAM5    HAM6 EDHEC LS EQ SP500 TR US 10Y TR US 3m TR
2006-07-31 -0.0144 -0.0131 0.0102 -0.0120 -0.0164 -0.0225     -0.0031  0.00620   0.01580  0.00423
2006-08-31  0.0161 -0.0113 0.0253 -0.0183  0.0169  0.0193      0.0114  0.02380   0.02190  0.00441
2006-09-30  0.0068 -0.0231 0.0072  0.0197  0.0132 -0.0177      0.0001  0.02580   0.01140  0.00456
2006-10-31  0.0427  0.0167 0.0183  0.0518  0.0266  0.0189      0.0194  0.03260   0.00584  0.00381
2006-11-30  0.0117  0.0206 0.0269  0.0373  0.0038  0.0300      0.0200  0.01900   0.01419  0.00430
2006-12-31  0.0115 -0.0062 0.0110  0.0206  0.0317  0.0215      0.0153  0.01403  -0.01550  0.00441

我查看了包Return.cumulative中的PerformanceAnalytics,但没有指定句点的参数。来自ROC的{​​{1}}可以指定要使用的时段数,但不是基于返回。最好的方法是什么?提前谢谢!

2 个答案:

答案 0 :(得分:1)

根据您想要的内容以及您对ROC TTR的了解,我将仅提供数据准备部分

#Sample Data

df=read.table(text=' Date    HAM1    HAM2   HAM3    HAM4    HAM5    HAM6  
              2006-07-31 -0.0144 -0.0131 0.0102 -0.0120 -0.0164 -0.0225     
              2006-08-31  0.0161 -0.0113 0.0253 -0.0183  0.0169  0.0193     
              2006-09-30  0.0068 -0.0231 0.0072  0.0197  0.0132 -0.0177     
              2006-10-31  0.0427  0.0167 0.0183  0.0518  0.0266  0.0189     
              2006-11-30  0.0117  0.0206 0.0269  0.0373  0.0038  0.0300     
              2006-12-31  0.0115 -0.0062 0.0110  0.0206  0.0317  0.0215    ',header=T,stringsAsFactors=F)

#Make Return to Price假设所有股票的初始值为100

for (i in 2:dim(df)[2]){

B=Reduce(function(x,y) {x * (1+y)}, df[,i], init=100, accumulate=T)# if it is log Return: {x * exp(y)}
if (i==2){
   Price= B
}else{
    Price=cbind(Price,B)
}
}

Price=data.frame(cbind(df$Date,Price[-1,]))

names(Price)=names(df)

> Price
        Date             HAM1             HAM2             HAM3             HAM4             HAM5             HAM6
1 2006-07-31            98.56            98.69           101.02             98.8            98.36            97.75
2 2006-08-31       100.146816        97.574803       103.575806         96.99196       100.022284        99.636575
3 2006-09-30   100.8278143488    95.3208250507   104.3215518032     98.902701612   101.3425781488    97.8730076225
4 2006-10-31 105.133162021494 96.9126828290467 106.230636201199 104.025861555502 104.038290727558 99.7228074665652
5 2006-11-30 106.363220017145  98.909084095325 109.088240315011 107.906026191522 104.433636232323 102.714491690562
6 2006-12-31 107.586397047342  98.295847773934 110.288210958476 110.128890331067 107.744182500887 104.922853261909

然后您可以使用普通包来年化返回(或自定义)

答案 1 :(得分:0)

使用@ Wen的数据:

df=read.table(text=' Date    HAM1    HAM2   HAM3    HAM4    HAM5    HAM6  
          2006-07-31 -0.0144 -0.0131 0.0102 -0.0120 -0.0164 -0.0225     
          2006-08-31  0.0161 -0.0113 0.0253 -0.0183  0.0169  0.0193     
          2006-09-30  0.0068 -0.0231 0.0072  0.0197  0.0132 -0.0177     
          2006-10-31  0.0427  0.0167 0.0183  0.0518  0.0266  0.0189     
          2006-11-30  0.0117  0.0206 0.0269  0.0373  0.0038  0.0300     
          2006-12-31  0.0115 -0.0062 0.0110  0.0206  0.0317  0.0215    ',header=T,stringsAsFactors=F)

您可以使用rollaply包中的zoo功能。

library(zoo)
roll <- function(x, n, stat) {
  if (length(x) <= n) NA
  else x <- x + 1
    rollapply(x, list(-seq(n)), stat, fill = NA)
}

df2 <- transform(df, four_month_return_HAM1 = ave(HAM1, FUN = function(x) roll(x, 4, prod)-1))

将4更改为您想要计算累积回报的期间。所以,一年,这将是12.这将给你12个月的滚动回报。