【国盛金工 量价选股】Memory Map在因子生产加速上的应用——以构建羊群效应因子簇为例

民生   财经   2024-11-20 15:30   上海  

研究摘要
前言:本文为国盛金工《“量价淘金”选股因子系列研究》的第九篇报告,也是“因子生产加速”相关研究的首次尝试,从数据存储技术、体系化的因子构建框架这两个角度出发,探索如何系统性、快速、批量挖掘Alpha因子。
Memory Map数据存储技术:相比于传统的CSV、Parquet等存储形式,Memory Map减少了显式的文件I/O操作,将数据直接映射到内存中,可大幅提升访问速度。以读取宽表存储形式下、某一交易日所有股票的分钟收盘价数据为例,Memory Map的读取耗时不到800μs,读取速度约为Parquet的260倍、CSV的330倍。
体系化的因子构建框架——羊群效应因子簇:我们将事件研究的想法,融入到选股因子的构建中。提炼因子构建流程中的3个关键因素,事件识别、因子定义、数据频率,分别展开详细讨论。在Memory Map数据存储技术的助力下,基于经济学逻辑,最终构建了约50万个羊群效应因子,并通过进一步筛选,保留其中效果最优且相关性较低的50个因子,称之为“羊群效应因子簇”。
羊群效应综合因子:在“羊群效应因子簇”中选取信息比率最高的10个因子、等权合成,得到羊群效应综合因子。回测期2016/01/01-2024/09/30内,在全体A股中,该因子的月度RankIC均值为0.116,年化RankICIR为4.23;10分组多空对冲的年化收益为43.21%,信息比率为3.79,月度胜率为84.62%,最大回撤为6.31%。在剔除了市场常用风格和行业的影响后,纯净因子仍然有效,年化RankICIR达到3.67,全市场10分组多空对冲的信息比率为3.81。
指数增强组合的表现:基于羊群效应综合因子,构建月频调仓的指数增强组合:(1)沪深300指数增强组合的超额年化收益为9.06%,跟踪误差为4.47%,信息比率为2.03,月度胜率为73.08%,最大回撤为4.42%;(2)中证500指数增强组合的超额年化收益为12.20%,跟踪误差为5.44%,信息比率为2.24,月度胜率为72.12%,最大回撤为4.36%;(3)中证1000指数增强组合的超额年化收益为17.78%,跟踪误差为6.57%,信息比率为2.71,月度胜率为82.69%,最大回撤为6.24%。
风险提示:以上结论均基于历史数据和统计模型的测算,如果未来市场环境发生明显改变,不排除模型失效的可能性。
报告原文下载链接:

https://pan.baidu.com/s/1D21xPKDbSLTrjK25SXhK1g? 

提取码: gpv6


1. 前言
传统量化策略在当前市场环境下正面临一系列挑战,其中最显著的问题是边际效益递减。随着市场的发展与竞争的加剧,信息快速传播且投资者行为趋同,基于公开信息的策略越来越难以获得显著的Alpha,现有模型和因子的有效性在逐渐衰减;另一方面,靠人力挖掘Alpha新因子的难度也越来越大,提取增量信息的效率快速下降,需要持续投入大量资源对现有模型进行不断的升级和迭代,以维持未来获取超额收益的能力。
因此,如何系统性、快速、批量挖掘Alpha新因子,对传统模型进行迭代,就成为一项至关重要的技术。在此背景下,国盛金工推出“因子生产加速”相关研究,尝试在数据存储、因子计算、因子构建框架等各个层面做出努力,提升因子的生产效率。
本文为国盛金工《“量价淘金”选股因子系列研究》的第九篇报告,也是我们“因子生产加速”系列研究的首次尝试,先聚焦数据存储端,重点介绍Memory Map这一数据存储技术将如何提升整个因子生产过程的效率,并具体以羊群效应因子的构建为例,详细介绍如何相对体系化地批量构建因子,最终提出“因子簇”的概念,得到羊群效应话题相关的一簇有效因子。

2. Memory Map数据存储技术
2.1 概念简介
Memory Map(内存映射)技术是一种将文件或设备的内容直接映射到进程虚拟地址空间中的方法。通过这种方式,进程可以像访问内存一样访问文件或设备,而不需要显式地进行读写操作。
Memory Map相比于传统的CSV、Parquet等存储形式,减少了显式的文件I/O操作,由于数据直接映射到内存中,因此提高了访问速度。该格式适用于需要频繁访问大文件的场景,如读取所有A股的高频量价数据。
2.2 数据存储实例
股票行情数据的存储通常可分为宽表存储和窄表存储这两种形式,以分钟行情数据为例:
(1)宽表存储,即将每个特征设置为二维矩阵、并保存为单独的文件,比如对于2024/09/30这一交易日的分钟收盘价数据,存为一个数据大小为242*N(242为每日分钟数据的总行数,N为当日股票数量)的矩阵文件;
2)而对于窄表存储,我们会将当日的分钟开盘价、最高价、最低价、收盘价、成交量都存放在一个文件中作为列索引,行索引设置为股票代码和时间戳的双重索引,数据文件大小即为(242*N)*5。
由于股票因子为截面数据,宽表更适合高效地进行向量化计算,因此我们选择宽表形式存储高频量价数据,避免了窄表数据中需要通过for循环来遍历股票代码的操作。
接下来,我们具体展示一个利用Memory Map格式进行数据存储的案例。比如2024/09/30这一交易日分钟收盘价的宽表文件20240930_close_1m.mmap,由行索引(分钟时间戳),列索引(股票代码)和数据值三部分构成。我们需要向系统申请一块连续的内存空间来存储这三部分数据,由于行索引和列索引为字符串格式,而数据值为浮点型,所以申请的内存空间数据格式也存在差异:

(1)对于列索引(股票代码),我们认为每个股票代码的最长长度为9个字节(比如“000001.SZ”),因此需要9*N(N为股票数量)的空间来存储列索引;
2)对于行索引(分钟时间戳),我们认为最长长度为17个字节(比如“20240930 09:30:00”),因此需要17*242的空间来存储行索引;
(3)对于数据值,需要242*N的字节空间来存储。

至目前为止,我们一共需要9*N+17*242+242*N的空间来存储整个宽表文件。但在读取数据时,我们并不知道这块连续的空间中哪一部分是索引或者数据值,因此还需要在一开始留出额外的4个字节来存放基础信息:行索引个数、行索引最大长度、列索引个数、列索引最大长度。最终,我们总共需要4+9*N+17*242+242*N的空间来存储宽表文件20240930_close_1m.mmap,具体的存储结构如图表4所示。
图表5展示了具体的存储代码。对于Data Frame文件,我们首先计算出行和列索引的最大元素长度和元素数量(代码的第4-7行),然后定义内存空间的数据类型及写入的数据(代码的第1011行),最后调用Numpymemmap方法申请一块内存空间(代码的第14行)并写入数据(代码的第15行)。
2.3 数据存储与因子计算速度对比
本节内容测试对比不同存储文件系统的性能差异以及因子的计算耗时。本文的测试系统环境为Ubuntu 22.04 LTS,硬件配置为:CPUAMD 7T83(64核,主频2.5GHz)显卡,NVIDIA RTX4090存储,三星PM9A3 15.36T NVME固态硬盘 raid0阵列(raid)
我们通过Python的timeit方法测试了Memory Map、Parquet和CSV存储文件系统的数据读取速度,读取的数据即为前文所述的宽表存储形式下、某一交易日所有股票的分钟收盘价数据。对比发现,Memory Map的读取性能显著优于另外两种存储文件系统。如图表6所示,Memory Map的读取耗时不到800μs,而Parquet、CSV的读取耗时分别为大约206ms、264ms,约为Memory Map的260倍、330倍。
在因子计算上,我们也通过一个具体的案例进行对比说明。测试案例为:在CPU多进程并行下,读取某只股票某日的一分钟收益率数据,计算分钟收益率的标准差,得到该股当日的高频波动率;计算全体A股2021/01/01-2024/09/30的上述日度指标。计算结果显示,若原始数据的存储格式为CSV,该过程大约需要36s;若为Parquet,大约需要22s;若为Memory Map,只需8s左右。

3. 羊群效应因子簇的构建
3.1 因子构建的体系化思路
我们将事件研究的想法,融入到选股因子的构建中。比如在《“量价淘金”选股因子系列研究(七):盲目追随趋势资金的极端交易行为分析——羊群效应的识别与因子构建》这篇报告中,我们曾构建“羊群效应”概念相关的因子,目标是关注市场中的理性资金(即报告中定义的“趋势资金”)行动之后、其追随者(大概率是一些跟风的非理性投资者)的极端交易行为。
基于上述目标,结合事件研究的框架,我们可以从这个角度入手:首先识别市场中的趋势资金,将“趋势资金有所行动”定义为一个事件;随后,关注这个事件发生之后的量价数据,从中提取有效信息、构建因子,衡量羊群效应的强弱程度。那么在因子的构建过程中,主要涉及以下3个关键因素:

(1)事件识别:如何识别趋势资金的行动。此处提到的“趋势资金”只是一个笼统的称谓,是想寻找当下对股价可能产生重要影响的交易群体,或许是机构投资者、也或许是个人投资者,可以很直观、也可以非常模糊,我们并不在乎其是否能明确落实到某一类特定的投资者身上。趋势资金可以存在多种代理变量,比如根据价格走势、成交量变化、成交量内部结构的变化,都可以对趋势资金是否行动进行判断。

(2)因子定义:如何刻画羊群效应的强弱。这一因素中,我们主要考察趋势资金行动的时间点后,紧跟着的一些量价特征,比如价格、成交量、价量相关性、大小单资金流、主买单、主卖单等等,这些指标既可以是其本身的数值,也可以是与趋势资金对应时间点相比的变化,也可以是与趋势资金这个事件发生之前相比的变化。如此一来,我们又可以赋予羊群效应因子多种不同的定义。

(3)数据频率:在何种数据频率上识别事件、定义因子。可用的数据集包括日频数据、分钟数据、逐笔数据、用逐笔数据合成的其他不同频率的数据集等等,不同频率提取到的信息可能存在较大差异,我们可以在不同数据维度上识别趋势资金的行动、考察跟随者的交易行为。
后文将逐一对上述3个关键因素进行详细描述,展示完整的因子构建流程。
3.2 事件识别:趋势资金是否行动
关于“趋势资金是否行动”,我们通过“量价数据是否发生异常”来进行判断。其中,“量价数据”可以是各种不同维度的成交量、价格涨跌幅、价格波动率、量价相关性;“发生异常”可以是成交量、价格波动率极端放大,价格涨跌幅、量价相关性极端放大或缩小。

接下来,我们根据不同的“量价数据”,详细展示如何识别趋势资金的行动。
3.2.1 各种不同维度的成交量
此概念中涉及的关键因素,可用一句话进行概括,即“何人、何方向的量突然放大了”,涉及的关键因素有4个:何人、何方向、量、放大。

首先,关于“量”,我们考察4个指标:成交量、成交金额、成交笔数、单笔成交金额(即成交金额除以成交笔数)。

其次,关于“何人的量”,我们通过“大小单”进行细分,既可以是不区分大小单的整体的量,也可以是大单、中单、小单的量。关于大单、中单、小单的定义,可以直接采用wind数据库基于固定金额进行划分的方式(如下图表8,其中超大单由于数据覆盖度较低,我们暂不考虑),也可以采用浮动金额进行划分,比如基于逐笔委托数据,对于每只股票,将当日的逐笔委托数据与过去20日的所有逐笔委托数据进行对比,处于过去20日数据90%-99%分位数的定义为当日的大单,处于70%-90%分位数的定义为中单,处于70%分位数以下的定义为小单。
接着,关于“何方向的量”,我们通过逐笔成交数据中的“主买”、“主卖”信息进行区分。“主买”、“主卖”方向是逐笔成交数据中的一项重要细节,如图表9展示了平安银行(000001.SZ)在2024年8月30日的逐笔成交数据片段,其中有一列“方向”数据,列明了每一笔成交的买卖方向,标签为“B”代表这一笔成交为主动买入单,即对应着在这一笔成交中,买单是主动吃单方,卖单是挂单方、等待成交;标签为“S”则代表该笔成交为主动卖出单,即买单是挂单方、等待成交,而卖单是主动吃单方。这一“主买”或“主卖”的方向差异,在一定程度上反应了交易双方的激进程度以及对市场未来走势的预期差异。

在讨论“何方向的量”时,我们既可以计算不区分主买、主卖方向的整体的量,也可以只计算主买或者主卖方向的量。
最后,关于“量的放大”,也可以有不同的定义方式。以1分钟数据为例,比如我们可以采取以下两种方式:(1)日内固定对比,每个交易日选取超过当日日内“均值+1.5标准差”的分钟数据,定义为放大;(2)日间滚动对比,以过去5个交易日的所有分钟数据为标准,将当日超过过去5日90%分位数的分钟数据定义为放大。
如图表10所示,4个因素中,“何人的量”有7种不同定义,“何方向的量”有3种区分方法,“量”可以考察4个指标,“量的放大”存在2种判断标准,它们互相搭配,一共可以产生168种识别趋势资金是否行动的方式。

另外,关于上文中涉及的参数,我们在此重点申明:所有参数都不会进行遍历测试与样本内优化,我们会先验地测试参数的敏感性,若某一参数非常敏感、则舍弃对应的定义方式,我们只在参数不敏感的前提下、选取一个较为合理的取值,进入上述框架中。即对于两种不同的定义方式,我们要求它们的区别必须来源于底层逻辑上稍有差异,而不是简单修改了同一逻辑下的参数取值。
3.2.2 价格涨跌幅
在“价格涨跌幅”维度下,我们主要考察收益率的极端变化情况,可以分为极端放大、极端缩小。

关于“极端”的定义,我们也可以采取日内固定对比、日间滚动对比两种方式,比如以1分钟数据为例:(1)日内固定对比,每个交易日选取大于当日日内“均值+1.5标准差”的分钟收益率数据、定义为收益极端放大,选取小于当日日内“均值-1.5标准差”的分钟收益率数据、定义为收益极端缩小;(2)日间滚动对比,以过去5个交易日的所有分钟收益率为标准,将当日大于过去5日90%分位数的分钟数据定义为收益极端放大,将当日小于过去5日10%分位数的分钟数据定义为收益极端缩小。

因此在“价格涨跌幅”维度下,我们一共可以得到4种不同的识别方式。
3.2.3 价格波动率
关于波动率,我们主要考察波动率极端放大的情况。

可以构造两个关于波动率的代理变量,以1分钟数据为例:(1)计算每分钟的振幅;(2)滚动计算过去5分钟收益率的标准差。

关于“极端放大”,类似于前文,我们也可以采取两种判断方法:(1)日内固定对比,每个交易日选取超过当日日内“均值+1.5标准差”的数据,定义为波动增大;(2)日间滚动对比,以过去5个交易日的所有数据为标准,将当日超过过去5日90%分位数的数据定义为波动增大。

如此一来,在“价格波动率”维度下,我们也可以得到4种不同的识别方式。
3.2.4 量价相关性
该维度考察量价相关性极端放大或极端缩小的情况,由于涉及到“量”与“价”的交互,识别方式种类繁多。

我们先讨论比较简单的“价格”数据,它既可以是原始的价格,也可以是价格的变化、即收益率。

再来关注“成交量”,这一部分与前文类似,可根据“何人、何方向的量”进行详细定义。“量”可以采用成交量、成交金额、成交笔数、单笔成交金额这4个指标;“何人的量”,既可以是不区分大小单的整体的量,也可以是基于固定金额或者浮动金额划分的大单、中单、小单的量;“何方向的量”,既可以计算不区分主买、主卖方向的整体的量,也可以只计算主买或者主卖方向的量。

接下来,在计算“量”与“价”的相关性时,根据两个序列的时间戳是否错位,又可以分为量价对齐、量先价行(即将量序列往前移动一单位时间)、价先量行(即将价格序列往前移动一单位时间)这3种情况。

最后,在判断量价相关性极端放大或极端缩小时,也可以采取两种判断方法:(1)日内固定对比,每个交易日选取大于当日日内“均值+1.5标准差”的数据、定义为极端放大,选取小于当日日内“均值-1.5标准差”的数据、定义为极端缩小;(2)日间滚动对比,以过去5个交易日的所有数据为标准,将当日大于过去5日90%分位数的数据定义为极端放大,将当日小于过去5日10%分位数的数据定义为极端缩小。
如图表11所示,在“量价相关性”维度下,我们一共可以得到超过2000种识别趋势资金是否行动的方式。同样地,我们再次申明:这些定义方式的差异来源,是底层逻辑上的细微差异,而不是简单地修改参数;我们只在参数不敏感的先验前提下,选取一个较为合理的取值,进行事件的识别。
3.2.5 小结
至此,关于“趋势资金是否行动”这一事件的识别,已经讨论完毕。我们通过观测各种不同维度的成交量、价格涨跌幅、价格波动率、量价相关性是否发生异常,得到了上千种不同的识别方式。
实际上,我们能想到的方法还有更多,比如在“量价相关性”维度,还可以考虑成交量序列、价格序列的自相关性,但由于算力有限、且考虑到最终因子的相关性可能较高,本文不再做更多讨论。本节内容的主要目的,在于展示上述体系化的思维与框架,各位读者可根据实际情况,在框架中修改、删减或增加具体的识别方式
3.3 因子定义:羊群效应如何衡量
关于“羊群效应的强弱程度”,我们借助“趋势资金行动之后的量价特征”来进行衡量。与上节内容类似,用到的“量价数据”包括各种不同维度的成交量、价格涨跌幅、价格波动率、量价相关性;“量价特征”的构建,可以是上述量价数据本身的数值,也可以是与趋势资金对应时间点量价数据的相互关系,也可以是与趋势资金这个事件发生之前量价数据的相互关系。

后文根据不同的“量价数据”,详细展示如何定义羊群效应因子
3.3.1 各种不同维度的成交量
关于量的数据,与前文完全一致,根据“何人、何方向的量”进行详细定义,共可得到84种代理变量:“量”可以采用成交量、成交金额、成交笔数、单笔成交金额;“何人的量”,既可以是不区分大小单的整体的量,也可以是基于固定金额或者浮动金额划分的大单、中单、小单的量;“何方向的量”,既可以计算不区分主买、主卖方向的整体的量,也可以只计算主买或者主卖方向的量。
接下来,关于如何构建具体的量价特征,我们以“在1分钟数据集上、衡量趋势资金行动之后未来5分钟的羊群效应”为例,提供几种思路。特别地,量的数据以最简单的“成交量”为例。

第一步,我们需要先定义每日的“极端跟随成交量”:比如每个交易日,对于判定为趋势资金行动的每一分钟,都取随后5分钟里成交量最大的这一分钟,将其视为跟随趋势资金的极端行为,记录这一分钟的成交量,得到本次的极端跟随成交量。

第二步,我们用极端跟随成交量的大小,作为羊群效应强弱的代理变量,构建因子。这一步可以涉及多种构建逻辑,比如:

(1)本身数值:每个交易日,求日内所有极端跟随成交量的平均值,得到当日因子值;

(2)与趋势资金的相关性:每个交易日,将趋势资金的成交量与对应的极端跟随成交量对齐,求这两个序列的相关系数,得到当日因子值;

(3)与趋势资金的相对比值:将每一次的极端跟随成交量,除以对应趋势资金的成交量,得到该次跟随行为的比值;每个交易日,对当日所有比值求均值,得到当日因子值;

(4)与趋势资金事件发生之前的相关性:每个交易日,将趋势资金前5分钟成交量之和与对应的极端跟随成交量对齐,求这两个序列的相关系数,得到当日因子值;

(5)与趋势资金事件发生之前的相对比值:将每一次的极端跟随成交量,除以对应趋势资金的前5分钟成交量之和,得到该次跟随行为的比值;每个交易日,对当日所有比值求均值,得到当日因子值。

当然,上述关于“极端跟随成交量”的定义方式、每日因子的计算方法,在细节上还存在许多拓展空间,我们不再详细展开,读者可根据类似思路进行拓展。

在上述案例中,关于量的数据、我们找到84种代理变量,关于因子的构建逻辑、我们提供了5种思路,因此共可得到420种不同的因子定义方式
3.3.2 价格涨跌幅
该维度主要关注收益率的情况,比如取趋势资金行动后5分钟里的最大分钟收益率,定义为极端跟随收益率,考察其本身数值、与趋势资金行动时点收益率的相关性或者相对比值、与趋势资金行动之前收益率的相关性或者相对比值,共可得到5种不同的因子定义方式。
3.3.3 价格波动率
若我们用振幅或者收益率的标准差衡量波动率,同样也考察其本身数值、与趋势资金的相关性或相对比值、与趋势资金之前的相关性或相对比值,则可以得到10种不同的因子定义方式。
3.3.4 量价相关性
该维度下因子的定义方式种类较多。与前文类似,因子定义方式的多样性来源于以下四个方面:
(1)“价格”数据有2种情况,既可以是原始的价格,也可以是价格的变化、即收益率;

(2)“成交量”数据,仍然根据“何人、何方向的量”进行详细定义,共有84种变量;

(3)计算“量”与“价”相关性,根据两个序列是否错位,可分为量价对齐、量先价行、价先量行这3种情况;

(4)最终构建因子时,可考虑量价相关性指标的本身数值、与趋势资金对应指标的相关性或相对比值、与趋势资金行动之前对应指标的相关性或相对比值,共有5种计算方法。

因此如图表13所示,在“量价相关性”维度下,我们一共可以得到超过2500种对羊群效应因子进行定义的方法。同样地,在同一种定义方式下,我们不做任何参数的遍历与优化,只选取一个较为合理的参数取值
3.3.5 小结
至此,关于“羊群效应因子”的定义方法,已经讨论完毕。在“趋势资金有所行动”这一事件发生之后,我们通过计算成交量、价格涨跌幅、价格波动率、量价相关性这些量价数据的本身数值、与趋势资金对应时点量价数据的相互关系、与趋势资金这个事件发生之前量价数据的相互关系,得到了上千种不同的因子构造方式。

实际上,上述框架还存在很大的拓展空间,比如在“波动率”维度,除了价格的波动率,我们还可以考虑各种成交量指标的波动率,又可衍生出至少几百种不同的定义方式。本文不再做过多讨论,各位读者可自行在上述框架中修改、删减或增加具体的构建方法。
3.4 数据频率:不同数据集的构建
本小节内容较为简单,主要涉及我们究竟在何种数据频率上识别事件、定义因子。可用的数据集包括日频数据、分钟数据、逐笔数据、用逐笔数据合成的其他不同频率的数据集等等,各位读者可以根据实际需求,构建不同的数据集,然后在不同数据维度上识别趋势资金的行动、考察跟随者的交易行为。
本文构建的因子,以“1分钟数据集(包括用逐笔数据合成的1分钟量价特征)”为主。
3.5 因子的生产、筛选与表现
3.5.1 因子的批量生产与筛选:羊群效应因子簇
考虑到算力与时间因素,我们对前文提到的事件识别方法、因子定义方法做了精简,各选取了几百种方法,目前一共构建了约50万个羊群效应因子。通过进一步分时段筛选,留下有效因子,得到“羊群效应因子簇”:
(1)在时间段2016/01/01-2020/12/31内,综合考虑因子的IC、ICIR、10分组多头超额收益、10分组多头超额收益的信息比率以及因子互相之间的相关性,挑选效果最优且相关性较低的因子,大约有200个;

(2)对于挑选出的约200个因子,再考虑它们从2021年开始至今的IC、ICIR、10分组多头超额收益、10分组多头超额收益的信息比率以及因子互相之间的相关性,进一步挑选其中效果最优且相关性较低的因子,最终剩下50个,称之为羊群效应概念所对应的因子簇。

回测结果显示,在2016/01/01-2024/09/30期间,全体A股中,50个因子的年化ICIR绝对值都能达到2以上。图表14罗列了其中20个因子的回测绩效,为了方便展示,因子名称以序号的方式做了简化。特别地,这些因子都是未经行业、市值中性化操作的原始因子,大部分因子中性化后的效果可进一步提升。
以图表14中的最后一个因子为例,我们详细介绍该因子是如何构建的:

(1)根据逐笔成交数据,计算股票每分钟的主动买入成交单数,将“主买单数大于当日均值+1.5倍标准差”的分钟,视为趋势资金有所行动的分钟;

(2)对于趋势资金的每一分钟,计算未来5分钟的“(主买成交单数-主卖成交单数)/ (主买成交单数+主卖成交单数)”,得到此次跟随行为的强度;

(3)每个交易日,以对应的趋势资金主买单数为权重,对当日所有跟随行为强度求加权平均值,得到当日的跟随行为强弱程度;

(4)滚动回看过去20个交易日,求20日跟随行为强弱程度的算术平均值,即为羊群效应因子。

以上述因子为例,对比不同原始数据存储格式下的因子计算速度。回测期2016/01/01-2024/09/30内,在CPU单进程下,从读取个股分钟数据开始至计算得到所有A股的日度因子值,若原始数据的存储格式为CSV,该过程大约需要45min;若为Parquet,大约需要25min;若为Memory Map,只需要10min左右(服务器配置为:CPU,AMD 7T83(64核,主频2.5GHz);显卡,NVIDIA RTX4090;存储,三星PM9A3 15.36T NVME固态硬盘raid0阵列(软raid))。可见Memory Map技术确实大幅提升了因子的计算速度。
3.5.2 羊群效应综合因子示例
以选取图表14中信息比率最高的10个因子等权合成为例,展示羊群效应综合因子的表现。回测时间段2016/01/01-2024/09/30内,以全体A股为研究样本,羊群效应综合因子的月度IC均值为0.088,年化ICIR3.45,月度RankIC均值为0.116,年化RankICIR4.2310分组多空对冲的年化收益为43.21%,年化波动为11.41%,信息比率为3.79,月度胜率为84.62%,最大回撤为6.31%
图表15展示了羊群效应综合因子的10分组及多空对冲净值走势,图表16则汇报了其各年度表现情况。
得到了选股效果不错的综合因子后,我们考察其与市场常用风格因子的相关性。图表17展示了羊群效应综合因子与10个Barra风格因子的相关系数,可以看到,综合因子与波动率、流动性因子的相关性相对较高,相关系数绝对值在0.40左右,与其他因子的相关性较低。
为了剔除市场常用风格和行业的干扰,我们每月月底将羊群效应综合因子对Barra风格因子和中信一级行业虚拟变量进行回归,取残差作为纯净因子,检验其选股效果。图表18展示了纯净因子在全体A股中的10分组及多空对冲净值走势,图表19则汇报了其分年度的表现情况。
剔除常用风格与行业的影响后,因子仍然有效。纯净羊群效应综合因子的月度IC均值为0.051,年化ICIR为3.74,月度RankIC均值为0.054,年化RankICIR为3.67;10分组多空对冲的年化收益为24.76%,年化波动为6.50%,信息比率为3.81,月度胜率为83.65%,最大回撤为2.07%。
3.5.3 指数增强组合的表现
本小节内容基于羊群效应综合因子,以最大化预期收益为优化目标,构建沪深300、中证500、中证1000指数增强组合,组合的调仓频率为月度。

沪深300指数增强组合的约束条件为:(1)指数成分股权重不低于85%;(2)中信一级行业权重偏离不超过2%;(3)个股权重偏离不超过0.3%。

2016/01/01-2024/09/30,沪深300指数增强组合的年化收益为12.74%,相对沪深300指数的超额年化收益为9.06%,跟踪误差为4.47%,信息比率为2.03,月度胜率为73.08%,最大回撤为4.42%
中证500指数增强组合的约束条件为:(1)指数成分股权重不低于85%;(2)中信一级行业权重偏离不超过1%;(3)个股权重偏离不超过0.5%。

2016/01/01-2024/09/30,中证500指数增强组合的年化收益为12.61%,相对中证500指数的超额年化收益为12.20%,跟踪误差为5.44%,信息比率为2.24,月度胜率为72.12%,最大回撤为4.36%。
中证1000指数增强组合的约束条件为:(1)指数成分股权重不低于85%;(2)中信一级行业权重偏离不超过1%;(3)个股权重偏离不超过0.5%。
2016/01/01-2024/09/30,中证1000指数增强组合的年化收益为14.82%,相对中证1000指数的超额年化收益为17.78%,跟踪误差为6.57%,信息比率为2.71,月度胜率为82.69%,最大回撤为6.24%。

4. 国盛金工量价因子库简介
我们将构建的量价因子入库、定期维护。数据库中目前的量价因子,都是基于一定的经济学逻辑进行构建的,根据因子所属大类,分为动量/反转、波动率、流动性、量价相关性、技术分析指标等类别,每个因子都有对应的历史外发报告。本文构建的羊群效应因子簇,已在因子库中定期更新,本系列研究后续报告中的因子,也将陆续纳入因子库中,敬请读者关注。

5. 总结
本文为国盛金工《“量价淘金”选股因子系列研究》的第九篇报告,也是我们“因子生产加速”相关研究的首次尝试,聚焦数据存储技术、体系化的因子构建框架,详细讨论如何系统性、快速、批量挖掘Alpha因子。
在数据存储端,本文重点介绍了Memory Map这一数据存储技术,其相比于传统的CSV、Parquet等存储形式,减少了显式的文件I/O操作,将数据直接映射到内存中,可大幅提升访问速度。在展示了具体的Memory Map数据存储案例、以及对应的存储代码后,我们也测试对比了不同存储文件系统的数据读取速度。以读取宽表存储形式下、某一交易日所有股票的分钟收盘价数据为例,Memory Map的读取速度约为Parquet的260倍、CSV的330倍。

在因子构建框架层面,我们将事件研究的想法,融入到选股因子的构建中,并以羊群效应因子为例,展示了一套相对体系化的因子构建思路。具体地,我们提炼因子构建流程中的3个关键因素,分别展开了详细讨论:

(1)事件识别:如何识别趋势资金的行动。我们通过观测成交量、价格涨跌幅、价格波动率、量价相关性是否发生异常,得到了上千种不同的识别方式。

(2)因子定义:如何刻画羊群效应的强弱。在“趋势资金有所行动”这一事件发生之后,我们通过计算成交量、价格涨跌幅、价格波动率、量价相关性这些量价数据的本身数值、与趋势资金对应时点量价数据的相互关系、与趋势资金事件发生之前量价数据的相互关系,得到了上千种不同的因子构造方式。

(3)数据频率:在何种数据频率上识别事件、定义因子。可用的数据集包括日频数据、分钟数据、逐笔数据、用逐笔数据合成的其他不同频率的数据集等等,我们可以在不同数据维度上识别趋势资金的行动、考察跟随者的交易行为。

考虑到实际因素,我们对事件识别、因子定义方法做了精简,在Memory Map数据存储技术的助力下,利用1分钟数据集构建了约50万个羊群效应因子,并通过进一步筛选,保留其中效果最优且相关性较低的50个因子,称之为“羊群效应因子簇”。回测结果显示,50个羊群效应因子的年化ICIR绝对值都能达到2以上。

为了展示综合因子的表现,我们在“羊群效应因子簇”中选取信息比率最高的10个因子、等权合成,得到羊群效应综合因子。回测期2016/01/01-2024/09/30内,在全体A股中,羊群效应综合因子的月度IC均值为0.088,年化ICIR为3.45,月度RankIC均值为0.116,年化RankICIR为4.23;10分组多空对冲的年化收益为43.21%,年化波动为11.41%,信息比率为3.79,月度胜率为84.62%,最大回撤为6.31%。在剔除了市场常用风格和行业的影响后,纯净因子仍然有效,年化ICIR达到3.74,全市场10分组多空对冲的信息比率为3.81。

更进一步,我们基于羊群效应综合因子,构建月频调仓的指数增强组合:

(1)沪深300指数增强组合的超额年化收益为9.06%,跟踪误差为4.47%,信息比率为2.03,月度胜率为73.08%,最大回撤为4.42%;

(2)中证500指数增强组合的超额年化收益为12.20%,跟踪误差为5.44%,信息比率为2.24,月度胜率为72.12%,最大回撤为4.36%;

(3)中证1000指数增强组合的超额年化收益为17.78%,跟踪误差为6.57%,信息比率为2.71,月度胜率为82.69%,最大回撤为6.24%。

风险提示
以上结论均基于历史数据和统计模型的测算,如果未来市场环境发生明显改变,不排除模型失效的可能性。

具体分析详见国盛证券研究所2024年11月20日发布的报告《“量价淘金”选股因子系列研究(九):Memory Map在因子生产加速上的应用——以构建羊群效应因子簇为例》。
沈芷琦  S0680521120005  shenzhiqi@gszq.com
刘富兵  S0680518030007  liufubing@gszq.com

阮俊烨  S0680124070019  ruanjunye@gszq.com


特别声明:《证券期货投资者适当性管理办法》于2017年7月1日起正式实施。通过微信形式制作的本资料仅面向国盛证券客户中的专业投资者。请勿对本资料进行任何形式的转发。若您非国盛证券客户中的专业投资者,为保证服务质量、控制投资风险,请取消关注,请勿订阅、接受或使用本资料中的任何信息。因本订阅号难以设置访问权限,若给您造成不便,烦请谅解!感谢您给予的理解和配合。

重要声明:本订阅号是国盛证券金融工程团队设立的。本订阅号不是国盛金融工程团队研究报告的发布平台。本订阅号所载的信息仅面向专业投资机构,仅供在新媒体背景下研究观点的及时交流。本订阅号所载的信息均摘编自国盛证券研究所已经发布的研究报告或者系对已发布报告的后续解读,若因对报告的摘编而产生歧义,应以报告发布当日的完整内容为准。本资料仅代表报告发布当日的判断,相关的分析意见及推测可在不发出通知的情形下做出更改,读者参考时还须及时跟踪后续最新的研究进展。

本资料不构成对具体证券在具体价位、具体时点、具体市场表现的判断或投资建议,不能够等同于指导具体投资的操作性意见,普通的个人投资者若使用本资料,有可能会因缺乏解读服务而对报告中的关键假设、评级、目标价等内容产生理解上的歧义,进而造成投资损失。因此个人投资者还须寻求专业投资顾问的指导。本资料仅供参考之用,接收人不应单纯依靠本资料的信息而取代自身的独立判断,应自主作出投资决策并自行承担投资风险。

版权所有,未经许可禁止转载或传播。












留富兵法
从量化的视角去看市场,用金融工程的思维去解决问题
 最新文章