分组年度回报

时间:2018-11-27 21:30:14

标签: python pandas dataframe

我有每月收益,想按两组计算年化收益。以下是示例数据。

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

1 个答案:

答案 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进行了此计算:

  • 我取了每个值(1加Return_M)的乘积
  • 将乘积提高到(12除以组长,该组为7)。

(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

因此,只需检查您的逻辑是否正确即可。如果可以解决您的问题,请将此答案标记为已接受。