我有这样的股票收益的时间序列数据:Stock Date Return
A 2012-01 6
A 2012-02 4
A ... ...
A 2019-08 2
B 2012-01 5
B ... ...
B 2019-08 5
... ... ...
我想根据每月更新的回报表现,为整个时间框架创建股票投资组合:
投资组合1-每月最佳10%
投资组合2-每月下一个20%
投资组合3-每个月的下一个40%
投资组合4-每个月的下一个20%
投资组合5-每月最低10%
每个月,我都会根据业绩排名将每只股票分配到五个投资组合中的一个。例如,如果A股的回报率在2012-01年达到最好的10%,我想将其分配给投资组合1。如果它在2012-02年度的表现有所下降,并且只获得了30%-20%的最好成绩,我想把它转移到投资组合2
对于这五个投资组合中的每一个,我都希望得到一个理想情况下应该如下所示的数据帧:Portfolio Date Stocks included Stock Return
1 2012-01 A 6
1 2012-01 ... ...
1 2012-01 ... ...
1 2012-02 ... ...
... ... ... ...
1 2019-08 ... ...
在熊猫身上这样做的最佳方式是什么?任何提示都将不胜感激
我对熊猫还不熟悉,因此还不是很有经验。我试过groupby
和pd.cut
,但都没能做对
这是我到目前为止写的东西。这似乎有效,但我不确定这是否是最好的方法
# Group by Date
grouped = df_total.groupby('Date')
# Iterate through every month; get portfolio ranks and store them in df_total
for name, group in grouped:
portfolio_category = pd.qcut(group.Return, q=[0, .1, .3, .7, .9, 1], labels=False)
df_total['PortfolioNr'].update(portfolio_category)
# Portfolio 1 (top 10%)
df_portfolio10 = df_total.loc[df_total['PortfolioNr'] == 4.0]
df_portfolio10 = df_portfolio10.sort_values(by=['Date'])
# Portfolio 2 (next 20%)
df_portfolio10to30 = df_total.loc[df_total['PortfolioNr'] == 3.0]
df_portfolio10to30 = df_portfolio10to30.sort_values(by=['Date'])
# Portfolio 3 (next 40%)
df_portfolio30to70 = df_total.loc[df_total['PortfolioNr'] == 2.0]
df_portfolio30to70 = df_portfolio30to70.sort_values(by=['Date'])
# Portfolio 4 (next 20%)
df_portfolio70to90 = df_total.loc[df_total['PortfolioNr'] == 1.0]
df_portfolio70to90 = df_portfolio70to90.sort_values(by=['Date'])
# Portfolio 5 (lowest 10%)
df_portfolio90to100 = df_total.loc[df_total['PortfolioNr'] == 0.0]
df_portfolio90to100 = df_portfolio90to100.sort_values(by=['Date'])
目前没有回答
相关问题 更多 >
编程相关推荐