Python复合返回组By
我试图用python计算每个股票每日收益的月度复合收益 我的数据集如下所示: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
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日?