Python复合返回组By

Python复合返回组By,python,pandas,pandas-groupby,Python,Pandas,Pandas Groupby,我试图用python计算每个股票每日收益的月度复合收益 我的数据集如下所示: DATE STOCK RETURN Year Month 1/1/2020 A 0.02 2020 1 1/1/2020 B 0.03 2020 1 1/2/2020 A 0.04 2020 1 1/2/2020 B 0.05 2020 1 ... 6/30/2020 A 0.01

我试图用python计算每个股票每日收益的月度复合收益

我的数据集如下所示:

DATE    STOCK   RETURN  Year    Month
1/1/2020    A   0.02    2020    1
1/1/2020    B   0.03    2020    1
1/2/2020    A   0.04    2020    1
1/2/2020    B   0.05    2020    1
...             
6/30/2020   A   0.01    2020    6
6/30/2020   B   0.03    2020    6
我试过
df。groupby([STOCK'、'Year'、'Month'])['RETURN']。应用(cum_returns)
,但它不会在groupby中给出结果。理想情况下,我会尝试得到如下结果:

DATE       STOCK CUMULATIVE RETURN
01/2020    A      (1+0.02)*(1+0.04).... (1+rn) / (1/n) 
01/2020    B       same formula above for B daily stock returns
02/20      A
02/20      B
...
06/30     A
06/30     B
我使用的功能是:

def cum_returns (x):
    a = x.add(1).cumprod()
    a.iloc[0] = 1
    return a

谢谢你的帮助

假设我们有数据帧:

DATE STOCK RETURN Year Month
1/1/2020 A 0.02 2020 1
2/1/2020 A 0.01 2020 1
3/1/2020 A 0.04 2020 1
1/1/2020 B 0.03 2020 1
2/1/2020 B 0.01 2020 1
3/1/2020 B 0.04 2020 1
1/2/2020 A 0.05 2020 2
2/2/2020 A 0.02 2020 2
3/2/2020 A 0.01 2020 2
4/2/2020 A 0.04 2020 2
1/2/2020 B 0.01 2020 2
2/2/2020 B 0.03 2020 2
3/2/2020 B 0.02 2020 2
4/2/2020 B 0.05 2020 2

要计算每月每日收益的几何平均数()和股票使用:

df.groupby(['STOCK','Year','Month'])[['RETURN']].apply(lambda g: ((g+1).cumprod()**(1/len(g))-1).iloc[-1])
结果:

                    RETURN
STOCK Year Month          
A     2020 1      0.023258
           2      0.029879
B     2020 1      0.026591
           2      0.027394
您可以手动检查计算是否正确,例如库存A和一月:

(1.02*1.01*1.04)**(1/3)-1=0.023258


请注意,
iloc[-1]
在lambda函数中选择每组上次计算的收益。

假设我们有数据帧:

DATE STOCK RETURN Year Month
1/1/2020 A 0.02 2020 1
2/1/2020 A 0.01 2020 1
3/1/2020 A 0.04 2020 1
1/1/2020 B 0.03 2020 1
2/1/2020 B 0.01 2020 1
3/1/2020 B 0.04 2020 1
1/2/2020 A 0.05 2020 2
2/2/2020 A 0.02 2020 2
3/2/2020 A 0.01 2020 2
4/2/2020 A 0.04 2020 2
1/2/2020 B 0.01 2020 2
2/2/2020 B 0.03 2020 2
3/2/2020 B 0.02 2020 2
4/2/2020 B 0.05 2020 2

要计算每月每日收益的几何平均数()和股票使用:

df.groupby(['STOCK','Year','Month'])[['RETURN']].apply(lambda g: ((g+1).cumprod()**(1/len(g))-1).iloc[-1])
结果:

                    RETURN
STOCK Year Month          
A     2020 1      0.023258
           2      0.029879
B     2020 1      0.026591
           2      0.027394
您可以手动检查计算是否正确,例如库存A和一月:

(1.02*1.01*1.04)**(1/3)-1=0.023258


请注意,
iloc[-1]
在lambda函数中选择每组的上次计算收益。

您能提供更多的数据和预期结果集吗?当然。对于A股,2020年1月的回报率为0.02,0.01,0.04-对于B股,回报率为0.03,0.01,0.04-我试图计算A股的复合回报率:(1+0.02)*(1+0.01)*(1+0.04)^(1/3)-1和B股-(1+0.03)*(1+0.01)*(1+0.04)^(1/3)-1。我想对每个月进行迭代,如果2020年2月,股票A收益率为0.05,0.02,0.01,0.04,复合收益率将为1.05*1.02*1.01*1.04^(1/4)-1,并对2月、3月等进行相同的分析。你想计算每个月和股票的每日收益的几何平均数吗?结果每个(库存、月份)只有一行?请参阅:是的,确实是每个月股票的几何回报率,但为什么在您的评论示例中有不同的天数:1月3日和2月4日?您能提供更多的数据和预期结果集吗?当然。对于A股,2020年1月的回报率为0.02,0.01,0.04-对于B股,回报率为0.03,0.01,0.04-我试图计算A股的复合回报率:(1+0.02)*(1+0.01)*(1+0.04)^(1/3)-1和B股-(1+0.03)*(1+0.01)*(1+0.04)^(1/3)-1。我想对每个月进行迭代,如果2020年2月,股票A收益率为0.05,0.02,0.01,0.04,复合收益率将为1.05*1.02*1.01*1.04^(1/4)-1,并对2月、3月等进行相同的分析。你想计算每个月和股票的每日收益的几何平均数吗?结果每个(库存、月份)只有一行?请看:是的,的确如此,每个月股票的几何回报率,但为什么在您评论中的示例中有不同的天数:1月3日和2月4日?