【量化学堂】换手率因子实例分析


*本篇文章主要参考了华泰证券的深度报告————《华泰单因子测试之换手率类因子》

换手率因子是一类很重要的情绪类因子,反映了一支股票在一段时间内的流动性强弱,和持有者平均持有时间的长短。一般来说换手率因子的大小和股票的收益为负向关系,即换手率越高的股票预期收益越低,换手率越低的股票预期收益越高。在本文中,将首先构建换手率类的因子,并分析这些因子。再者根据因子的排序构建分组组合策略,展示策略结果。最后分析不同因子的表现,综合识别有效因子。本文中涉及的因子都是与股票的日均换手率相关,共分为4个类别:

--turn_Nm:个股最近N个月的日均换手率,表现了个股N个月内的流动性水平。N=1,3,6

--bias_turn_Nm:个股最近N个月的日均换手率除以个股两年内日均换手率再减去1,代表了个股N个月内流动性的乖离率。N=1,3,6

--std_turn_Nm:个股最近N个月的日换手率的标准差,表现了个股N个月内流动性水平的波动幅度。N=1,3,6

--bias_std_turn_Nm:个股最近N个月的日换手率的标准差除以个股两年内日换手率的标准差再减去1,代表了个股N个月内流动性的波动幅度的乖离率。N=1,3,6

《华泰单因子测试之换手率类因子》一文中提到以上几类换手率因子之间也存在比较强的正相关性,尤其是不同时间长度的同类因子。参考《华泰单因子测试之换手率类因子》一文,我们只选取了时间长度最短的4个因子作为每类因子的代表。此外,如果需要通过组合使用换手率类的因子进行回归分析,要小心可能存在的多重共线性问题。

另外,《华泰单因子测试之换手率类因子》一文中还提到换手率类因子与市值类因子存在一定程度的负相关性,我们对换手率因子首先进行市值中性化处理,从而消除了大市值对于换手率因子表现的影响。我们将选取部分因子分别进行和不进行市值中性化处理,对比处理前后的效果。

本文中,对于每一个因子,我们都使用了分组回测的方法对单因子进行策略回测,并展示回测结果和策略的回测指标等。具体来说按照因子大小将所有股票分为五档,分别构建五个投资组合。我们将以此分析每个因子的区分度、单调性、稳定性,综合识别有效因子。

通过对每一个因子进行回测,综合来说,进行市值中性化处理之后,因子表现有明显提高。在本文的回测方法下,turn_1m和std_turn_1m因子表现较好。

一、换手率因子以及数据获取

换手率因子是一类很重要的情绪类因子,反映了一支股票在一段时间内的流动性强弱,和持有者平均持有时间的长短。如果一支股票在过去一段时间内的换手率明显高于同类型股票的平均水平,则说明这支股票的资金追逐度高,比较热门,但同时风险也会相对较高。在本报告中,我们主要考虑了与股票的日换手率相关的一些因子。股票的日换手率地定义为:

日换手率 = 当日成交量 / 该股发行总股数 x 100%

在本文中,我们用到的与日换手率相关的因子有如下12个:

值得注意的是,在这里我们对于回溯时间长度和缺失值的处理是:对某一个交易日,求一个月内日均换手率则考虑包括该天在内的前20个交易日的平均值, 三个月则取前60天, 六个月则取前120天。同样,计算标准差的时候也取相同的回溯期。对于例如股票当天停牌而造成的当日日换手率为0的数据,我们将在计算平均值和标准差的时候将这个值忽略。若在回溯期内股票一支处于停牌状态,那所有的值都会被忽略,则该天的平均相关的因子值为空,若该回溯期内没有停牌的日期不足两天,则该天的标准差相关的因子值为空。

通过优矿API,我们可以获取股票每天的日换手率数据,下面的代码根据每天每支股票的日换手率计算所有的12个因子,并将每个因子作为一列,存入到DataFrame中。最后我们将整个DataFrame写入csv方便后期的调用读取。

在得到这些因子值之后,我们将建立分组模型进行回测,仔细观察因子区分度,单调性等规律,并根据以上结果进行分析对比,探讨各因子的特点和优劣。

二、分组回测模型

分组回测模型即根据因子值对股票进行打分,并以此构建投资组合,能够比较直观地衡量一个股票指标的优劣,尤其是可以确定因子的单调性。具体回测方法如下:

--股票池为全部A股,并且剔除当日停牌的股票以及ST,PT股票;

--回测区间为2013年1月1日到2017年12月31日;

--调仓期为每个自然月第一个交易日,并计算前一天即上月最后一个交易日的因子暴露度,并且按照调仓期当天的收盘价进行换仓;

--数据处理主要是采用了市值中性的处理方法。考虑到一般来说换手率与市值有比较强的相关性,这里利用回归并取残差的方法进行市值中性化处理,把处理后的因子值作为新的因子值来进行组合构建;

--组合构建方法是按照新的因子值得大小对股票由大到小进行分组,因子值为空的股票不参与分组。注意这里由于换手率小的股票收益率一般较高,所以我们对所有数据都取了负号再进行从大到小的分层。也就是说第1组是因子值相对最小的股票,第5组是因子值相对最大的股票。每月调仓时根据每月最后一个交易日的因子值来构建下一个月的组合,并于下一个月的第一个交易日按照当天收盘价来进行调仓;

--评价方法包括年化收益率,夏普比率,信息比率,最大回撤等。

本文中的回测代码使用了优矿quartz3的回测框架,并且为了提高回测效率使用了quick_backtest()函数。

--首先设定回测所需要的参数,包括开始日期、结束日期、参考标准、证券池、起始资金、行情的频率(日行情或者分钟行情)、调仓时间、股票账户。这里还需要指定因子名称;

--读入因子文件,并且取出所需要的列,包括证券编码SecID,交易日期tradeDate,和因子名称。并将交易日作为索引,储存数据中所有的交易日;

--将回测参数封装到SimulationParameters中,并传入quartz.get_backtest_data()函数,获取回测行情数据;

--对于1~5分位构建5组,分别进行回测,并将结果储存在results中。具体策略逻辑的细节见5;

--策略逻辑————对于每一个调仓日,获取前一天的因子值,并且根据该天股票的总市值数据进行回归,将回归残差作为新的因子值。按照因子值的大小取相应的分位数的股票列表。对于账户现有的持仓,将不在目标持仓中的股票卖出,并等权买入目标持仓重的股票。


三、回测结果展示与分析

由于对于同类因子,例如日均换手率因子中时间长度分别取1,3,6月的三个因子,彼此间存在较强的相关性。再根据《华泰单因子测试之换手率类因子》一文中的结论,同类因子的表现比较相近,且时间区间越短的因子表现越是突出。从而,我们本文选取了四类因子中最具代表性的4个因子进行分组回测,分别是:一个月内日均换手率因子——turn_1m,一个月内日均换手率乖离率因子——bias_turn_1m,一个月内日换手率的标准差因子——std_turn_1m,一个月内日换手率标准差的乖离率——bias_std_turn_1m。

此外,在《华泰单因子测试之换手率类因子》一文中,也提到换手率类的因子在单调性上表现得并不好,而衍生的乖离率类因子有较好的单调性表现。通过分析,本文认为这个问题出现的原因是换手率小的股票有一部份是大市值的股票,而往往这类股票在收益率上的表现并不好。考虑到换手率与市值因子有一定的负相关性,所以我们这里对换手率因子作了一个市值中性化处理————利用对换手率因子和市值因子做回归取残差的市值中性化处理,从而消除了换手率类的因子中市值因子的相关部分。

以下是不同因子的回测结果,部分因子分别进行以及没有进行市值中性化处理,用于结果的对比,我们将结果汇总到下表中:

通过结果我们看到,在未作市值中性化处理之前,换手率因子的表现并不好,没有明显的单调性(最优组为第二组),且收益率相比做了市值中性化处理的结果比较低。且换手率衍生的乖离率类因子bias_turn_1m的表现要好于换手率类因子turn_1m,而且通过下面的图表我们也可以看到,bias_turn_1m的单调性表现要好于turn_1m。这一点的结论是与原文相近的。

为了解决这个问题,我们尝试做了市值中性化处理,效果非常显著。在做了市值中性化处理之后,收益率、Alpha、IR、Sharpe Ratio都得到了显著的提高。我们认为市值中性化处理可以消除大市值对于换手率类因子的影响,并且显著提高换手率类因子的表现。而且通过进行市值中性化处理之后,turn_1m、std_turn_1m两个换手率类的因子表现较好,要好于衍生的两个乖离率类因子。所以我们得到的结论是,在未做市值中性化处理前,结论与《华泰单因子测试之换手率类因子》文中一致,表现最好的因子为bias_turn_1m和bias_std_turn_1m,而在进行了市值中性化处理之后,因子表现得到了提高,且表现最好的两个因子为turn_1m和std_turn_1m。

3.1 一个月内日均换手率因子 turn_1m (未进行市值中性处理)

通过结果可以看出,在未做市值中性化处理前,turn_1m因子前三组的表现非常接近,且表现最好的为第二组,没有展现出非常好的因子单调性。

3.2 一个月内日均换手率因子 turn_1m (市值中性处理后)

通过结果可以看出,在进行市值中性化处理之后,因子表现得到了明显改善。因子展现出了很好的单调性,此时表现最好的为第一组,且Alpha、年化收益率、IR和Sharpe Ratio明显高于其他组别。


3.3 一个月内日均换手率乖离率因子 bias_turn_1m (未进行市值中性处理)

通过结果可以看出,在未做市值中性处理之前,因子没有展现出很明显的单调性,这是由于第一第二组的表现十分接近。此外,第一第二组的表现相比另外三组有明显区分度,总的来说,未市值中性化的bias_turn_1m的表现略高于未市值中性化的turn_1m,但是明显低于作了市值中性化处理的turn_1m。

3.4 一个月内日均换手率乖离率因子 bias_turn_1m (市值中性处理后)

通过结果可以看出,在进行了市值中性化处理之后,bias_turn_1m的表现得到了明显的改善,单调性也表现得十分明显,表现最好的是第1组。但是相比同样做了市值中性化处理的turn_1m因子,bias_turn_1m因子的表现略低于turn_1m因子。

3.5 一个月内日换手率的标准差因子 std_turn_1m (市值中性处理后)

通过结果可以看出,做了市值中性化处理的std_turn_1m因子展现出了很好的单调性,而且第一组的表现相比其他组更为突出。这一点与作了市值中性化处理的turn_1m十分相似。此外,这两个因子表现最优组的表现十分接近,要优于bias_turn_1m的表现。

3.6 一个月内日换手率标准差的乖离率 bias_std_turn_1m (市值中性处理后)

通过结果我们可以看出,在进行了市值中性化处理之后,因子表现出了很好的单调性,且五组的表现相对平均,这与因子bias_turn_1m十分相似。且bias_std_turn_1m的表现略优于bias_turn_1m的表现但是没有turn_1m和std_turn_1m的表现那么好。

作者:LiX2   原文:【量化学堂】换手率因子实例分析

@今日话题 

雪球转发:2回复:1喜欢:7

全部评论

luguoa2018-05-23 20:47

记号