这可能听起来很幼稚,但我似乎无法找到解决方案。我需要计算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}}可以指定要使用的时段数,但不是基于返回。最好的方法是什么?提前谢谢!
答案 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个月的滚动回报。