我有每月收益,想按两组计算年化收益。以下是示例数据。
Return_M Rise
0.097425 1
0.188547 1
-0.1509 1
0.28011 1
-0.09596 1
0.041459 1
0.106838 1
0.046581 0
-0.16068 0
0.009242 0
0.006104 0
-0.00709 0
0.050352 0
-0.01023 0
-0.00731 0
0.031946 0
0.048552 0
这是我尝试过的方法,但是代码实际上不是按组来计算df1的长度。我希望可以广泛应用一种方法。
df2 = df1.groupby(['Rise'])[['Return_M']].apply(lambda x:np.prod(1+x)**(12/len(x)))
这是预期的输出:
Rise Return_M
1 0.249862
0 -0.00443
答案 0 :(得分:1)
您只需在groupby
列上Rise
并在Return_M
列上进行汇总。
以下代码段假设您要除以12(根据您的问题)
df2 = df1.groupby('Rise').agg({'Return_M': 'sum'}).reset_index()
df2['avg'] = df2['Return_M']/12
df2[['Rise', 'avg']]
但是,如果您需要基于每组Rise
拥有多少条记录的平均值,则可以执行以下操作:
df2 = df1.groupby('Rise').agg('Return_M': 'mean')
编辑:根据OP的评论编辑答案:
要根据您的公式获得几何年化收益率,请执行以下操作:
df.groupby('Rise').Return_M.apply(lambda x: (1+x).product() ** (12/float(len(x))))
但是,输出结果与您在问题中发布的预期输出结果不同:
Rise
0 0.986765
1 1.952498
然而,这正是您所描述的公式的正确输出。
我也手动为Rise = 1
进行了此计算:
Return_M
)的乘积 (1 + 0.097425) * (1 + 0.188547) * (1 + -0.1509) * (1 + 0.28011) * (1 + -0.09596)* (1 + 0.041459)* (1 + 0.106838) = 1.4774446702
1.4774446702 ^ (12/7) = 1.9524983367
因此,只需检查您的逻辑是否正确即可。如果可以解决您的问题,请将此答案标记为已接受。