AI量化知识树

反转因子的精细结构-研报复现

由ypyu创建,最终由ypyu 被浏览 536 用户

反转因子计算方法

反转因子的W式切割经过长期反复的摸索,我们找到了一个反转因子的有效切割方案,简称W式切割。具体操作步骤如下:

  1. 在每个月底,对于股票s,回溯其过去N个交易日的数据(为方便处理,N取偶数);
  2. 对于股票s,逐日计算平均单笔成交金额D(D=当日成交金额/当日成交笔数),将N个交易日按D值从大到小排序,前N/2个交易日称为高D组,后N/2个交易日称为低D组;
  3. 对于股票s,将高D组交易日的涨跌幅加总[1],得到因子M_high;将低D组交易日的涨跌幅加总,得到因子M_low;
  4. 对于所有股票,分别按照上述流程计算因子值。

W式切割的核心步骤是,按照“单笔成交金额”对交易日进行排序分组[2]。我们以20日收益率因子为例(即N取20),来说明W式切割方案的出色效果。样本空间为全部A股(剔除ST和上市未满60日的股票),回测时段仍为2010年至2018年。统计结果如图表4所示,结论是:M_high因子是非常强的反转因子(rankIC均值为-0.082),而M_low因子是较弱的动量因子(rankIC均值为0.018)[3]。

反转因子抽取和计算实现

  • m3,反转因子需要用到的两个因子
  • m15,抽取需要用到的基础因子(amount_0, deal_number_0, high_0, low_0)
  • m16,计算衍生因子
  • m4,在自定义模块中,计算 M_high, M_low,代码如下。第一个版本用的是pandas dataframe的rolling来实现;第二个版本优化了代码,去掉了rolling,使用中位数等方式,速度提升了~50倍。
  • m21,计算 M=M_high-M_low

def bigquant_run(input_1, N=20):
    assert N % 2 == 0

    import pandas as pd
    import numpy as np
    N2 = N // 2
    df = input_1.read()

    def process_instrument(x):
        x['Median'] = x['amount_0/deal_number_0'].rolling(N).median()
        high = None
        low = None
        for i in range(N):
            y = x['amount_0/deal_number_0'].shift(i) > x['Median']
            h = y.astype(np.int32) * x['high_0/low_0'].shift(i)
            if high is None:
                high = h
            else:
                high += h
            l = (~y).astype(np.int32) * x['high_0/low_0'].shift(i)
            if low is None:
                low = l
            else:
                low += l
        x['M_high'] = high
        x['M_low'] = low
        return x

    g = df[['amount_0/deal_number_0', 'high_0/low_0']].groupby(df['instrument'], as_index=False)
    df2 = g.apply(process_instrument)
    # 并行计算版
    # df2 = pd.concat(T.parallel_map(process_instrument, [{'x': x[1]} for x in g]))
    df['M_high'], df['M_low'] = df2['M_high'], df2['M_low']

    data_1 = DataSource.write_df(df[['date', 'instrument', 'M_high', 'M_low']])

    return Outputs(data_1=data_1)

完整策略代码

这里使用AI可视化模版策略

  • 将反转因子作为唯一的特征
  • 使用StockRanker算法
  • 在2015~2017的数据上训练模型
  • 预测2018~2019年
  • 使用默认目标,未来5日收益
  • 其他参数也都使用默认的

结果:多头策略,有15.49%的相对收益。

StockRanker可以最大限度的挖掘因子的alpha。一般一个长期有效的因子,通过StockRanker优化,都会有比较显著的收益。从结果看,这个因子似乎并没有研报里显示的那样长期效果。

改进建议:

你可以克隆策略,做更多尝试

策略案例


https://bigquant.com/experimentshare/54a95f0bc9dc4b86ad06b8dd2ba0438d

\