反转因子的精细结构-研报复现
由ypyu创建,最终由ypyu 被浏览 609 用户
反转因子计算方法
反转因子的W式切割经过长期反复的摸索,我们找到了一个反转因子的有效切割方案,简称W式切割。具体操作步骤如下:
- 在每个月底,对于股票s,回溯其过去N个交易日的数据(为方便处理,N取偶数);
- 对于股票s,逐日计算平均单笔成交金额D(D=当日成交金额/当日成交笔数),将N个交易日按D值从大到小排序,前N/2个交易日称为高D组,后N/2个交易日称为低D组;
- 对于股票s,将高D组交易日的涨跌幅加总[1],得到因子M_high;将低D组交易日的涨跌幅加总,得到因子M_low;
- 对于所有股票,分别按照上述流程计算因子值。
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优化,都会有比较显著的收益。从结果看,这个因子似乎并没有研报里显示的那样长期效果。
改进建议:
- 可以结合其他因子使用: 反转因子的精细结构-结合其他因子使用
- N=20,可以修改为其他参数
- 预测更短或者更长的时间目标收益(比如20日或者2日?)
- 使用日内数据(分钟??)
- ..
你可以克隆策略,做更多尝试
策略案例
https://bigquant.com/experimentshare/54a95f0bc9dc4b86ad06b8dd2ba0438d
\