我有以下类型的数据集:
ID date RET
1 10026 20171227 -0.003768
2 10026 20171228 0.008958
3 10027 20171227 -0.001447
4 10027 20171228 -0.017454
5 10028 20171227 -0.009988
6 10028 20171228 0.013813
我的目的是创建一个新的绩效列,其中包含从每个日期t之前的252天开始到t天(包括在内)的21天之前为止的累积回报。此类累积回报需要按天数来缩放,以得出平均值,即总公式为
$(\sum_{tau=t-252}^{t-21} (1+r_{tau}^{i}) )^{1/(252-21)}$
这需要分别对每个ID进行。
我现在最好的解决方案是使用zoo
软件包:
df$performance<-0
df$performance<-rollapply(df$RET,252:21,function(x) (prod(x+1)-1))^(252-21)
但是我收到一条消息
Error in `$<-.data.frame`(`*tmp*`, performance, value = c(0.092128914384922, :
replacement has 25281 rows, data has 25300
此外,我不确定指示252:21是否是继续获得我想要的东西的正确方法。我知道这可能很乏味,但是我对R很陌生,希望有人可以找到解决方案并解释使用的正确逻辑
作为替代解决方案,我将使用:
df<-df %>%
group_by(ID) %>%
mutate(performance = myfunc)
其中myfunc
是用于计算过去(252-21)天的累积回报的函数。但是,我在编写适当的函数时遇到了麻烦