WorldQuant 101 Alpha因子构建及因子测试
背景介绍
根据WorldQuant发表的论文《101 Formulaic Alphas 》 ,其中公式化地给出了101个alpha因子。与传统方法不一样的是,他们根据数据挖掘的方法构建了101个alpha,据说里面80%的因子仍然还行之有效并被运用在实盘项目中。
在BigQuant策略研究平台上,可通过表达式快速进行因子构建和数据标注,再也不需要自己手动编写冗长代码。
表达式简介
因为在机器学习和深度学习中,因子是一个很重要的概念,也被称为特征,开发AI算法的关键在于特征选择。如果是简单的基础因子,比如近5日收益率: c l o s e 5 / c l o s e 0 − 1 close\\_5/close\\_0-1 close5/close0−1,因子构建比较简单,但是如果想构建近5日每日收益率和成交量的相关性这个因子就比较棘手,需要编写大量的代码来计算该因子。因此,我们设计了bigexpr表达式引擎。
bigexpr是BigQuant开发的表达式计算引擎,通过编写简单的表达式,就可以对数据做任何运算,而无需编写代码。
bigexpr在平台上被广泛使用,M.advanced_auto_labeler 和 M.derived_feature_extractor 都已经由bigexpr驱动,您可以用表达式就可以定义标注目标和完成后特征抽取。
正如刚刚提到的近5日每日收益率和成交量的相关性因子可以这样定义:
c
o
r
r
e
l
a
t
i
o
n
(
c
l
o
s
e
0
/
s
h
i
f
t
(
c
l
o
s
e
0
,
1
)
−
1
,
v
o
l
u
m
e
0
,
5
)
correlation(close\\_0/shift(close\\_0,1)-1,volume\\_0,5)
correlation(close0/shift(close0,1)−1,volume0,5)
其中,
c
o
r
r
e
l
a
t
i
o
n
correlation
correlation表示求相关系数,
c
l
o
s
e
0
close\\_0
close0表示当天收盘价,
s
h
i
f
t
(
c
l
o
s
e
0
,
1
)
shift(close\\_0,1)
shift(close0,1)表示前一日收盘价,
v
o
l
u
m
e
0
volume\\_0
volume0表示当天成交量。因此,可以看出,并不需要编写大量代码计算该因子,通过表达式即可快速构建。
函数说明
表达式引擎中有不少简单函数,对其中的部分函数进行解释:
- 可分为横截面函数和时间序列函数两大类,其中时间序列函数名多为以KaTeX parse error: Expected group after '_' at position 5: ts\\_̲开头
- 大部分函数命名方式较为直观
- a b s ( x ) abs(x) abs(x) 、 l o g ( x ) log(x) log(x)分别表示 x x x的绝对值和 x x x的自然对数
- r a n k ( x ) rank(x) rank(x)表示某股票 x x x值在横截面上的升序排名序号,并将排名归一到[0,1]的闭区间
- d e l a y ( x , d ) delay(x,d) delay(x,d)表示 x x x值在 d d d天前的值
- d e l t a ( x , d ) delta(x,d) delta(x,d)表示 x x x值的最新值减去 x x x值在 d d d天前的值
- c o r r e l a t i o n ( x , y , d ) correlation(x,y,d) correlation(x,y,d)、 c o v a r i a n c e ( x , y , d ) covariance(x,y,d) covariance(x,y,d)分别表示 x x x和 y y y在长度为 d d d的时间窗口上的皮尔逊相关系数和协方差
- t s m i n ( x , d ) ts\\_min(x,d) tsmin(x,d)、 t s m a x ( x , d ) ts\\_max(x,d) tsmax(x,d)、 t s a r g m a x ( x , d ) ts\\_argmax(x,d) tsargmax(x,d)、 t s a r g m i n ( x , d ) ts\\_argmin(x,d) tsargmin(x,d)、 t s r a n k ( x ) ts\\_rank(x) tsrank(x)、 s u m ( x , d ) sum(x,d) sum(x,d)、 s t d d e v ( x , d ) stddev(x,d) stddev(x,d)等均可以通过函数名称了解其作用
因子说明
BigQuant平台上系统因子超过2000个,包括了基本信息因子、量价因子、估值因子、财报因子、技术指标因子等。本文简单举若干因子进行介绍。
基本信息因子
- list_days # 上市天数
- list_board_0 # 上市板
- company_found_date_0 # 公司成立天数
- industry_sw_level1_0 # 申万一级行业类别
- st_status_0 # ST状态
- in_sse50_0 # 是否属于上证50指数成分
- in_csi300_0 # 是否属于沪深300指数成分
量价因子
- open_0 # 当日开盘价
- open_1 # 前一日开盘价
- close_0 # 当日收盘价
- high_0 # 当日最高价
- low_0 # 当日最低价
- volume_0 # 当日成交量
- amount_0 # 当日成交额
- adjust_factor_0 # 复权因子
估值因子
- market_cap_0 # 总市值
- rank_market_cap_0 # 总市值排序
- pe_ttm_0 # 市盈率(TTM)
- rank_pe_ttm_0 # 市盈率(TTM)升序百分比排名
- pe_lyr_0 # 市盈率(LYR)
- pb_lf_0 # 市净率(LF)
- ps_ttm_0 # 市销率(TTM)
财报因子
- fs_net_profit_0 # 归属母公司股东的净利润
- fs_net_profit_yoy_0 # 归属母公司股东的净利润同比增长率
- fs_net_profit_qoq_0 # 归属母公司股东的净利润环比增长率
- fs_roe_0 # 净资产收益率
- fs_roa_0 # 总资产收益率
- fs_gross_profit_margin_0 # 销售毛利率
- fs_net_profit_margin_0 # 销售净利率
- fs_eps_0 # 每股收益
- fs_bps_0 # 每股净资产
- fs_cash_ratio_0 # 现金比率
数据标注
和因子构建一样,数据标注也是机器学习算法中非常重要的一部分,更详细的文档为:自定义标注。
以前,数据标注主要通过fast_auto_label实现,有了表达式后,数据标注可以通过advanced_auto_label实现。数据标注的整体思想和内容主要体现在标注表达式上,可以通过 M.instruments模块获取证券代码列表,然后通过 M.advanced_auto_labeler模块实现标注表达式的编写,如下代码所示:
- label_expr为一个list,列表里四个元素决定了标注的具体操作,详细见:表达式引擎
- 计算未来一段时间的相对收益作为标注的原始依据,这里可以使用bigexpr表达式,快速完成数据标注
- 使用clip和all_quantile函数做极值处理
- 将原始数据离散化,这里可以采取等宽离散化或者等频离散化,两者各有优劣
- 通过where函数过滤掉一字涨停的样本数据
101 Alphas列表
为了方便查看,这里选取了WorldQuant公开的101个alpha及其表达式(因版面受限,可至社区查看全部)。可以参考下面的单因子测试的代码做实验,对各因子进行测试,希望大家都能开发出可以稳定盈利的策略,发掘出新的alpha。
单因子测试
这里我们以 shift(close_0,15) / close_0 因子为例,介绍如何进行单因子测试,开发基于单因子的AI策略(克隆请至社区)。