上一篇文章中我们对高频因子的优势和类型做了简要介绍,从这篇文章开始,我们将对每一大类因子做介绍,并从中选取具体一例因子,实现从数据构建到测试评估的整个过程。
研究环境利用聚宽因子分析API,构建因子函数类;研究在日内高频分钟级数据中挖掘构建高频因子,并对该因子进行有效性检验。
一、动量反转因子
1.1 动量反转因子
第一类因子为动量反转因子。动量反转因子通常由过去一段时间的特定类型的涨跌幅构造,其因子收益一方面可能来源于非理性投资者的行为偏差造成的错误定价,另一方面也可能来源于承担特定风险获得的风险补偿。
动量反转因子可以分为三类:分段动量、量能动量、QRS 动量。分段动量指只取日内某一特定时间段的动量因子,量能动量是指只选取特点成交量下的收益率作为动量因子,QRS 因子为使用过去一段时间 K 线的最高价和最低价回归出的 beta 系数和 R 方的乘积。三类中均有表现优秀的因子。
- 分段动量因子包括 mmt_last30_std、mmt_between_M 和 mmt_pm_std 等因子。mmt_last30_std 因子在全市场范围周度多空收益率 47%,在中证 500 和中证 1000 中也有较强的收益预测能力,且单调性良好。在沪深 300 中,表现相对较好的 mmt_last30_z和 mmt_pm_m 周度超额年化收益仅约 10%,说明该类因子在大市值股票中效果减弱。
- 量能动量因子指的是与成交量特征相关的动量因子。mmt_top20VolumeRet_std 全市场因 子 IC 均值-9.52%,有效性显著;沪深 300 范围内可关注 mmt_top20VolumeRet_o 因 子,即前 20 成交量 k 线的收益率因子,周度频率下年化多空收益率可达 27%。
- QRS 动量因子为日内相对强弱指标,由日度 QRS 构造方法迁移到分钟线上可得。但该类 因子在内部相关性较高。mmt_qrs_o 因子在全市场、中证 500 和中证 1000 中收益预测能 力和单调性较好,但在沪深 300 中表现相对较弱。而其组成部分 mmt_ols_beta_mean_o 因子在所有选股域中均表现优良。全市场中,mmt_qrs_o 因子的 IC 均值为-8.07%,ICIR 为 1.00,mmt_ols_beta_mean_o 因子的 IC 均值为-7.34%,ICIR 为 1.09,周度多空收益 达 54%。
动量反转因子之间的相关性统计如下表:
全市场范围内,mmt_ols_beta_mean_o、mmt_pm_m 等因子多空和多头超额表现较好,因子 多头组合显著跑赢基准,空头组合显著跑输基准,且单调性较为良好。mmt_pm_m 因子周度 多空年化收益率 58%,mmt_ols_beta_mean_o 的年化多头超额达 23%。
二、因子复现
2.1 高频数据
下面我们选取一个具体因子来进行复现和评测,使用聚宽研究环境,先检查数据。上次我们提到,高频因子使用的数据有分钟k线、快照数据、逐笔数据。我们任意选取一只股票,看看分钟k线的数据:
2.2 因子函数
选取因子为mmt_ols_corr_mean_m,构建方式为50根分钟k线最高与最低价相关系数平均值,最后的后缀“_m”表式对调仓周期取当期算术平均。
使用因子分析API,在研究环境中调用以进行因子分析。API使用详情可参阅聚宽技术文档。
# 构建因子分析框架
from jqfactor import Factor,analyze_factor
from jqdata.apis import *
import datetime
import pandas as pd
from jqfactor import neutralize
from jqfactor import winsorize_med
from jqfactor import standardlize
# 构建动量反转高频因子计算函数
class mmt_ols_corr_mean_m(Factor):
# 设置因子名称
name = 'mmt_ols_corr_mean_m'
# 设置获取数据的时间窗口长度
max_window = 1
# 设置依赖的数据
dependencies = ['close'] #参考标的
# 计算因子的函数, 需要返回一个 pandas.Series, index 是股票代码,value 是因子值
def calc(self, data):
# 获取日期,股票池
date= data['close'].index[0] #获取(上一)交易日 实际上的逻辑是用上一交易日的数据在今天进行交易,时间戳是昨天的时间
security_list = data['close'].columns.tolist()
# 以下为获取更多数据
#获取分钟级数据,我们取前20日平均值作为当期的因子值
stock_bars = get_price(security_list,count =240 * 20,start_date=None, end_date=date,
frequency='1m', fields=['high','low','close'], skip_paused=False,
fq='none')
stock_high = stock_bars['high'].fillna(method='ffill')
stock_low = stock_bars['low'].fillna(method='ffill')
#以日为单位迭代计算当日因子值
stock_high['time'] = [i.time() for i in stock_high.index]
stock_high.index = [i.date() for i in stock_high.index]
stock_high['day'] = stock_high.index
stock_low['time'] = [i.time() for i in stock_low.index]
stock_low.index = [i.date() for i in stock_low.index]
stock_low['day'] = stock_low.index
GroupBy = stock_high.groupby(by='day')
anti_moment = pd.DataFrame()
anti_moment_temp = pd.DataFrame()
for day, group in GroupBy:
group1 = group.drop(['day','time'], axis=1)
group2 = stock_low.loc[stock_low['day']==day].drop(['day','time'], axis=1)
temp = self.cal_factor(group1,group2)
anti_moment[day] = temp['factor']
anti_moment_temp['factor'] = anti_moment.apply(np.mean, axis=1)
return anti_moment_temp['factor']
## 计算因子值
def cal_factor(self,stock_hbar,stock_lbar):
temp = stock_hbar[-50:].corrwith(stock_lbar[-50:])
i=-50
count=1
while(i-50 > -len(stock_hbar)):
temp += stock_hbar[i-50:i].corrwith(stock_lbar[i-50:i])
i-=50
count+=1
ols_corr = pd.DataFrame()
ols_corr['factor']=temp/count
return ols_corr
代码构建完成后先先检查一下计算结果是否合理。相关系数必须在0到1之间,我们用一个月数据计算打印结果。数据范围合理。
三、因子分析
3.1 引擎初始化
下面我们对上面构建的动量反转因子进行回测分析,从各个方面考察因子的有效性。为保持与研报的一致性,我们主要考察周度和月度调仓频率下的表现。
参数设置如下:
(1)测试时间:2024-01-01 至 2025-05-16;
(2)分位数:十分位数;
(3)调仓周期:5日、30日;
(4)仓位配置:等权配置;
(5)股票池:沪深300
start = datetime.datetime.today()
far = analyze_factor(
mmt_ols_corr_mean_m(), start_date='2024-01-01', end_date='2025-05-16', universe='000300.XSHG',
quantiles=10,
periods=(5,30),
industry='jq_l1',
weight_method='avg',
use_real_price=True,
skip_paused=False,
max_loss=0.2
)
end = datetime.datetime.today()
print('程序耗时:', end - start)
3.2 因子IC分析
首先我们直观的看下收益分层分布的情况。总的来看越靠前的收益越高,符合预期。
然后使用IC信息系数法对趋势强度因子进行检验。我们排除因子值大小的影响,使用RankIC来替代IC值进行分析。RankIC为当期因子值的排名与下一期因子值排名的相关性。
下面我们绘制因子5日、30日的RankIC时间序列图和月度均值图。
在 2024-01到2025-05这17个月中,5、30日IC均值分别为为-0.054、-0.093,说明因子值与下月收益率呈现一定的负相关性,即因子值越低,下月预期收益率越高。
我们考察5、30日因子的IR值,分别为0.258、0.245。可见,5日换仓和30日换仓因子稳定性相近,30日更好。
进一步的计算IC_IR值为:-0.209、-0.379。因此,在单位风险下,30日换仓因子具有最佳的有效性。
四、总结
根据上述内容,我们在本文中对高频动量反转因子做了深入介绍。并从其中选取了一例具体因子实现了代码构建,并进行单因子分析测试,从各个方面考察因子的有效性,为构建可实盘交易的多因子选股策略提供一定思路。
我们通过对所选取的动量反转因子的有效性分析以及分层回测检验,初步得到以下结论:在 2024-01到2025-05中,因子值与下月收益率呈现一定的负相关性,我们考察因子的IR值,30日换仓因子稳定性较好,且在单位风险下,30日换仓因子具有最佳的有效性。