У меня есть данные временных рядов доходности акций, которые выглядят следующим образом:
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
... ... ...
Я хочу создать портфель акций ios для полного периода времени на основе показателей доходности, которые обновляются каждые месяц:
Портфель 1 - лучшие 10% каждого месяца
Портфель 2 - следующие 20% каждого месяца
Портфель 3 - следующие 40% каждого месяца
Портфель 4 - следующие 20% каждого месяца
Портфель 5 - наименьший 10% каждого месяца
Каждый месяц я хотел бы назначать каждую акцию одному из пяти портфелей ios в зависимости от его рейтинга эффективности. Например, если доходность акций А находится в лучших 10% в 2012-01 годах, я хочу присвоить их портфелю 1. Если затем он падает в производительности и получает только лучшие 30% - 20% в 2012- 02, я хочу переместить его в портфель 2.
Для каждого из пяти портфелей ios я хочу получить DataFrame, который в идеале должен выглядеть следующим образом:
Portfolio Date Stocks included Stock Return
1 2012-01 A 6
1 2012-01 ... ...
1 2012-01 ... ...
1 2012-02 ... ...
... ... ... ...
1 2019-08 ... ...
Каков наилучший способ сделать это в pandas? Будем очень благодарны за любые подсказки!
Я новичок в pandas и, следовательно, пока не очень опытен. Я попробовал 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'])