human
2. 从不同视角训练新的边裁
和主裁类似，如下示例编写如何从不同视角组成边裁AbuUmpMainMul，其关心的视角为短线21天趋势角度，长线一年的价格rank，长线波动，以及atr波动如下所示："
Please write code following the instructions in jupyter notebook style.

Write me a code to 2?
assistant
#Here is code to 2.

class AbuUmpEdgeMul(AbuUmpEdgeBase, BuyUmpMixin):
    """从不同视角训练新的边裁示例，AbuUmpEdgeBase子类，混入BuyUmpMixin，做为买入ump类"""

    class UmpMulFiter(AbuMLPd):
        @ump.ump_edge_make_xy
        def make_xy(self, **kwarg):
            filter_list = ['profit', 'profit_cg']
            # ['profit', 'profit_cg', 'buy_deg_ang21', 'buy_price_rank252', 'buy_wave_score3', 'buy_atr_std']
            filter_list.extend(
                [feature.AbuFeatureDeg().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                 feature.AbuFeaturePrice().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                 feature.AbuFeatureWave().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                 feature.AbuFeatureAtr().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1]])
            mul_df = self.order_has_ret.filter(filter_list)
            return mul_df

    def get_predict_col(self):
        """
        边裁单混特征keys：['buy_deg_ang21', 'buy_price_rank252', 'buy_wave_score3', 'buy_atr_std']
        :return: ['buy_deg_ang21', 'buy_price_rank252', 'buy_wave_score3', 'buy_atr_std']
        """

        return [feature.AbuFeatureDeg().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                feature.AbuFeaturePrice().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                feature.AbuFeatureWave().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1],
                feature.AbuFeatureAtr().get_feature_ump_keys(ump_cls=AbuUmpEdgeMul)[-1]]

    def get_fiter_class(self):
        """
        边裁单混特征返回的AbuMLPd子类：AbuUmpEdgeMul.UmpMulFiter
        :return: AbuUmpEdgeMul.UmpMulFiter
        """
        return AbuUmpEdgeMul.UmpMulFiter

    @classmethod
    def class_unique_id(cls):
        """
         具体ump类关键字唯一名称，类方法：return 'mul_edge'
         主要针对外部user设置自定义ump使用, 需要user自己保证class_unique_id的唯一性，内部不做检测
         具体使用见ABuUmpManager中extend_ump_block方法
        """
        return 'mul_edge'
    
# 通过import的方式导入AbuUmpEdgeMul, 因为在windows系统上，启动并行后，在ipython notebook中定义的类会在子进程中无法找到
from abupy import AbuUmpEdgeMul