如何构建先按RETl1、再在其分位内按VOL排序的双重分组投资组合
条件十分位分组实现方法
你需要在原来单维度日期分组的基础上,增加已经生成的RETl1十分位作为第二个分组键,即可实现嵌套分组逻辑,实现代码如下:
# 第一步:先按日期对RET_l1做十分位分组(和你原有逻辑一致) merged['decile_RETl1'] = merged.groupby(['Date'])['RET_l1'].transform(lambda x: pd.qcut(x, 10, duplicates='drop', labels=False)) merged['decile_RETl1'] = merged['decile_RETl1'] + 1 # 第二步:按日期+RETl1十分位双重分组,在每个子组内部对VOL做十分位分组 merged['decile_turnover_within_RETl1'] = merged.groupby(['Date', 'decile_RETl1'])['VOL'].transform(lambda x: pd.qcut(x, 10, duplicates='drop', labels=False)) merged['decile_turnover_within_RETl1'] = merged['decile_turnover_within_RETl1'] + 1
- 核心逻辑:
groupby(['Date', 'decile_RETl1'])会先将样本按日期拆分,每个日期下再按RETl1十分位拆分为10个子组,每个子组内部单独对VOL做十分位排序,完全符合你要求的先按RETl1分组、再组内按VOL分组的条件排序规则。 - 注意事项:如果某个日期下的某个RETl1子组样本量不足10,
pd.qcut的duplicates='drop'参数会自动合并重复分箱,最终分组数会小于10。若需要严格返回10组,可以提前过滤样本量不足的子组,或将duplicates参数调整为'raise'提前排查数据异常。
内容的提问来源于stack exchange,提问作者M olly
相关产品推荐
相关产品推荐

