我有一个20天的5场股票的数据框架,看起来像这样。指数是日期,列是股票,元素是回报。
ELET3 ELET6 EMBR3 ENBR3 EQTL3 (...)
Dates
2/8/2018 0.277450 0.307260 0.064575 -0.025936 0.051672
3/12/2018 0.149723 0.100899 0.017105 0.056956 0.044669
4/10/2018 -0.235531 -0.180462 0.020565 0.026310 -0.006893
5/9/2018 -0.019453 -0.057651 0.033495 -0.055192 -0.042110
我已经构建了一个数据框,其中列出了每个股票在该期间的表现(与上述相同,但是使用等级而不是回报):
ELET3 ELET6 EMBR3 ENBR3 EQTL3 (...)
Dates
2/8/2018 2.0 1.0 3.0 5.0 4.0
3/12/2018 1.0 2.0 5.0 3.0 4.0
4/10/2018 5.0 4.0 2.0 1.0 3.0
5/9/2018 2.0 5.0 1.0 4.0 3.0
(...)
对于每个期间(i),我想计算50个宇宙中2个股票的期间(i)的平均收益率,这些股票在前一个时期(期间(i-1))表现最佳。< / p>
以下是我要找的输出。 2/8/2018没有回报,因为这是第一个期间。在第一阶段,ELET3和ELET6是表现最好的两只股票,因此该策略将在下一个时期进行投资。他们在2/8/2018 - 3/12/2018期间的回报是0.149723和0.100899,因此代码应返回其平均值(0.12531)。它们也是2/8/2018 - 3/12/2018期间表现最好的两只股票。因此,该策略将在3/12/2018 - 4/10/2018期间继续投资。在那个时期他们返回-0.20800。在此期间,2个最佳股票是EMBR3和ENBR3,因此该策略在4/10/2018 - 5/9/2018投资,并且它们的平均回报率为-0.01085。
Strategy Return
Dates
2/8/2018
3/12/2018 0.12531
4/10/2018 -0.20800
5/9/2018 -0.01085
答案 0 :(得分:0)
我使用以下代码解决了它
my_df_returns_rank = my_df_returns.rank(axis = 1,method ='average',numeric_only = True,na_option ='keep',ascending = False,pct = False)
掩模=(my_df_rank&LT; 3).shift(1) 掩模= mask.replace(np.nan,FALSE)
my_df_2_best_returns = my_df_returns [掩模]
my_df_average_return_selected = my_df_2_best_returns.mean(axis = 1,skipna ='true')