#                                 )
    factor_dict[name] = signal  #输出结果,结果为字典

#4_施密特正交化
''' 对筛选后的因子进行组合,一般有以下常规处理:    
1:因子间存在较强同质性时,可以使用施密特正交化方法对因子做正交化处理,用得到的正交化残差作为因子,这样可以剔除同质化部分.
但是这也有一个弊端:由于正交化会破坏因子的经济学逻辑,并剔除一些原有的信息(包括原因子之间的联系,这可能导致不好的影响),造成与原因子差别太大,固也可以不使用或谨慎使用.
2:因子组合加权,常规的方法有:等权重、以某个时间窗口的滚动平均ic为权重(理由是ic越大因子效果越好,因而分配更多的权重)、
以某个时间窗口的滚动ic_ir为权重(与前面同理,同时考虑了预测效益即稳定性)、最大化(使上一期因子效果最大化)上个持有期的ic_ir为目标处理权重、最大化上个持有期的ic为目标处理权重 
注:因为计算IC需要用到下一期股票收益,因此在动态加权方法里,实际上使用的是前一期及更早的IC值(向前推移了holding_period)计算当期的权重.也就是说当前的ic是绝对不能使用的,使用了未来函数。
'''

#因子间存在较强同质性时,使用施密特正交化方法对因子做正交化处理,用得到的正交化残差作为因子  multi_factor.orthogonalize施密特正交化
new_factors = multi_factor.orthogonalize(
    factors_dict=factor_dict,  #正交化不会增加减少NAN,但会改变数值
    standardize_type=
    "rank",  #输入因子标准化方法,有"rank"(排序标准化),"z_score"(z-score标准化)两种("rank"/"z_score")
    winsorization=False,  #是否对输入因子去极值
    index_member=index_member)  # 是否只处理指数成分股

new_factors

#5_这里还是用正交化前的因子,分别进行等权、以某个时间窗口的滚动平均ic为权重、以某个时间窗口的滚动ic_ir为权重、
#最大化上个持有期的ic_ir为目标处理权重、最大化上个持有期的ic为目标处理权重的加权组合方式.共5种方式测试组合因子表现

#step1:合成新的因子comb_factors:  multi_factor.combine_factors()
#rollback_period代表滚动窗口所用到的天数,即用前多少期的数据来计算现阶段的因子权重.通常建议设置时间在半年以上,可以获得相对稳定的预期结果
#多因子组合-动态加权参数配置
props = {
    'price': dv.get_ts("close_adj"),
    'high': dv.get_ts("high_adj"),  # 可为空
    'low': dv.get_ts("low_adj"),  # 可为空
Пример #2
0
def test_multi_factor():
    from jaqs_fxdayu.research.signaldigger import multi_factor, process
    dv = DataView()
    dv.load_dataview(dataview_folder)
    dv.add_formula("momentum",
                   "Return(close_adj, 20)",
                   is_quarterly=False,
                   add_data=True)

    mask = mask_index_member(dv)
    can_enter, can_exit = limit_up_down(dv)

    ic = dict()
    factors_dict = {
        signal: dv.get_ts(signal)
        for signal in ["pb", "pe", "ps", "momentum"]
    }
    for period in [5, 15]:
        ic[period] = multi_factor.get_factors_ic_df(
            factors_dict,
            price=dv.get_ts("close_adj"),
            high=dv.get_ts("high_adj"),  # 可为空
            low=dv.get_ts("low_adj"),  # 可为空
            n_quantiles=5,  # quantile分类数
            mask=mask,  # 过滤条件
            can_enter=can_enter,  # 是否能进场
            can_exit=can_exit,  # 是否能出场
            period=period,  # 持有期
            benchmark_price=dv.
            data_benchmark,  # 基准价格 可不传入,持有期收益(return)计算为绝对收益
            commission=0.0008,
        )
    factor_dict = dict()
    index_member = dv.get_ts("index_member")
    for name in ["pb", "pe", "ps", "momentum"]:
        signal = -1 * dv.get_ts(name)  # 调整符号
        process.winsorize(factor_df=signal,
                          alpha=0.05,
                          index_member=index_member)  # 去极值
        signal = process.rank_standardize(
            signal, index_member)  # 因子在截面排序并归一化到0-1(只保留排序信息)
        signal = process.standardize(signal,
                                     index_member)  # z-score标准化 保留排序信息和分布信息
        # 行业市值中性化
        signal = process.neutralize(
            signal,
            group=dv.get_ts("sw1"),
            float_mv=dv.get_ts("float_mv"),
            index_member=index_member,  # 是否只处理时只考虑指数成份股
        )
        factor_dict[name] = signal

    # 因子间存在较强同质性时,使用施密特正交化方法对因子做正交化处理,用得到的正交化残差作为因子
    new_factors = multi_factor.orthogonalize(
        factors_dict=factor_dict,
        standardize_type="rank",
        # 输入因子标准化方法,有"rank"(排序标准化),"z_score"(z-score标准化)两种("rank"/"z_score")
        winsorization=False,  # 是否对输入因子去极值
        index_member=index_member)  # 是否只处理指数成分股

    #  多因子组合-动态加权参数配置
    props = {
        'price': dv.get_ts("close_adj"),
        'high': dv.get_ts("high_adj"),  # 可为空
        'low': dv.get_ts("low_adj"),  # 可为空
        'ret_type':
        'return',  # 可选参数还有upside_ret/downside_ret 则组合因子将以优化潜在上行、下行空间为目标
        'benchmark_price': dv.data_benchmark,  # 为空计算的是绝对收益 不为空计算相对收益
        'period': 30,  # 30天的持有期
        'mask': mask,
        'can_enter': can_enter,
        'can_exit': can_exit,
        'forward': True,
        'commission': 0.0008,
        "covariance_type": "shrink",  # 协方差矩阵估算方法 还可以为"simple"
        "rollback_period": 120
    }  # 滚动窗口天数

    comb_factors = dict()
    for method in [
            "equal_weight", "ic_weight", "ir_weight", "max_IR", "max_IC",
            "factors_ret_weight"
    ]:
        comb_factors[method] = multi_factor.combine_factors(
            factor_dict,
            standardize_type="rank",
            winsorization=False,
            weighted_method=method,
            props=props)