量化专题报告 “量价淘金”选股因子系列研究(十) 订单簿资金流因子簇的构建与生产加速 证券研究报告|金融工程 2025年02月11日 ——基于MemoryMap的分段读取性能优势 前言:本文为国盛金工《“量价淘金”选股因子系列研究》的第十篇报告,也是我们“因子生产加速”相关研究的再次探索,仍然围绕“数据存储与读写的技术”、“体系化的因子构建思路”这两个话题,在上一篇报告的基 础上展开进一步讨论。 MemoryMap在数据分段读取方面的性能优势:在某些因子的构建过程中,经常需要分段读取数据。传统的CSV、Parquet等存储形式,需要将全天数据加载到内存中,再截取其中一部分用于后续的因子计算;而 MemoryMap则可以直接在硬盘上截取数据,只将需要用到的数据映射到内存中,大幅减少内存开销,提升因子的计算效率。以读取宽表存储格式下、某一交易日所有股票的第一小时分钟收盘价数据为例,MemoryMap的读取速度约为Parquet的280倍、CSV的350倍。 因子的体系化构建与批量生产——订单簿资金流因子簇:将订单簿资金流因子的构建流程,拆分为“设计资金流指标”、“是否标准化”、“计算因子” 这3个步骤,分别展开详细讨论。借助MemoryMap分段读取数据的高性能优势,基于不同的经济学逻辑,最终构建了约10万个资金流因子,并 通过进一步筛选,保留其中效果最优且相关性较低的50个因子,得到“订单簿资金流因子簇”。 订单簿资金流综合因子:在因子簇中选取样本内信息比率最高的10个因子、等权合成,得到订单簿资金流综合因子。回测期2016/01/01-2024/12/31内,在全体A股中,该因子的月度RankIC均值为0.110,年 化RankICIR为4.24;10分组多空对冲的年化收益为41.37%,信息比率为3.29,月度胜率为87.85%,最大回撤为13.26%。在剔除了市场常用风格和行业的影响后,纯净因子仍然有效,年化RankICIR达到3.43,全市场10分组多空对冲的信息比率为3.52。 指数增强组合的表现:基于订单簿资金流综合因子,构建月频调仓的指数增强组合:(1)沪深300指数增强组合的超额年化收益为6.66%,跟踪误差为3.27%,信息比率为2.04,月度胜率为71.03%,最大回撤为3.65%; (2)中证500指数增强组合的超额年化收益为10.72%,跟踪误差为4.52%,信息比率为2.37,月度胜率为75.70%,最大回撤为3.58%;(3)中证1000指数增强组合的超额年化收益为15.97%,跟踪误差为5.59%,信息比率为2.86,月度胜率为78.50%,最大回撤为3.52%。 风险提示:以上结论均基于历史数据和统计模型的测算,如果未来市场环境发生明显改变,不排除模型失效的可能性。 作者 分析师沈芷琦 执业证书编号:S0680521120005邮箱:shenzhiqi@gszq.com 分析师刘富兵 执业证书编号:S0680518030007邮箱:liufubing@gszq.com 研究助理阮俊烨 执业证书编号:S0680124070019邮箱:ruanjunye@gszq.com 相关研究 1、《“量价淘金”选股因子系列研究(一):如何将隔夜涨跌变为有效的选股因子?——基于对知情交易者信息优势的刻画》2022-04-26 2、《“量价淘金”选股因子系列研究(二):不同交易者结构下的动量与反转》2022-10-24 3、《“量价淘金”选股因子系列研究(三):如何基于RSI 技术指标构建有效的选股因子》2023-03-06 4、《“量价淘金”选股因子系列研究(四):高/低位放量:从事件驱动到选股因子》2023-12-18 5、《“量价淘金”选股因子系列研究(🖂):基于趋势资金日内交易行为的选股因子》2024-05-28 6、《“量价淘金”选股因子系列研究(六):创新高股票中的Alpha》2024-06-26 7、《“量价淘金”选股因子系列研究(七):盲目追随趋势资金的极端交易行为分析——羊群效应的识别与因子构建》2024-08-06 8、《“量价淘金”选股因子系列研究(八):逐笔买卖差异中的选股信息——条件成交不平衡因子》2024-10-09 9、《“量价淘金”选股因子系列研究(九):MemoryMap在因子生产加速上的应用——以构建羊群效应因子簇为例》2024-11-20 请仔细阅读本报告末页声明 内容目录 一、前言3 二、MemoryMap的分段读取性能优势6 2.1概念简介及数据存储代码展示6 2.2分段读取数据的性能优势及代码示例7 2.3分段读取数据与因子计算速度对比8 三、订单簿资金流因子簇的构建10 3.1因子构建思路概览10 3.2设计资金流指标10 3.3是否标准化12 3.4计算因子13 3.5因子构建方法小结14 四、订单簿资金流因子簇的表现16 4.1因子的批量生产与筛选16 4.2订单簿资金流综合因子示例17 4.3指数增强组合的表现19 �、总结22 风险提示23 图表目录 图表1:因子生产过程中的重要环节与因素3 图表2:上一篇报告的主要内容4 图表3:本篇报告的主要内容5 图表4:宽表存储示例:以某日个股分钟收盘价为例6 图表5:MemoryMap数据存储结构:以某日个股分钟收盘价为例6 图表6:MemoryMap数据存储代码:以某日个股分钟收盘价为例7 图表7:MemoryMap分段读取代码:以某日个股分钟收盘价为例8 图表8:MemoryMap、Parquet和CSV存储文件系统的数据读取速度对比9 图表9:资金流因子簇的构建思路10 图表10:wind基于固定金额对大小单进行划分的标准11 图表11:平安银行(000001.SZ)20240830逐笔成交数据片段11 图表12:资金流指标的设计框架12 图表13:资金流指标的标准化处理13 图表14:以小时为单位的时间段划分13 图表15:将分钟资金流指标降频为日度因子值14 图表16:订单簿资金流因子簇的构建方法汇总15 图表17:订单簿资金流因子簇回测绩效示例16 图表18:订单簿资金流综合因子10分组及多空对冲净值17 图表19:订单簿资金流综合因子分年度表现18 图表20:订单簿资金流综合因子与Barra风格因子相关系数18 图表21:纯净订单簿资金流综合因子10分组及多空对冲净值19 图表22:纯净订单簿资金流综合因子分年度表现19 图表23:沪深300指数增强组合净值20 图表24:中证500指数增强组合净值20 图表25:中证1000指数增强组合净值21 一、前言 传统量化策略在当前市场环境下正面临一系列挑战,其中最显著的问题是边际效益递减。随着市场的发展与竞争的加剧,信息快速传播且投资者行为趋同,基于公开信息的策略越来越难以获得显著的Alpha,现有模型和因子的有效性在逐渐衰减;另一方面,靠人力挖掘Alpha新因子的难度也越来越大,提取增量信息的效率快速下降,需要持续投入大量资源对现有模型进行不断的升级和迭代,以维持未来获取超额收益的能力。 因此,如何系统性、快速、批量挖掘Alpha新因子,对传统模型进行迭代,就成为一项至关重要的技术。在此背景下,国盛金工推出“因子生产加速”相关研究,尝试在数据存储、因子计算、因子构建框架等各个层面做出努力,提升因子的生产效率。 图表1:因子生产过程中的重要环节与因素 资料来源:国盛证券研究所整理 上一篇报告《“量价淘金”选股因子系列研究(九):MemoryMap在因子生产加速上的应用——以构建羊群效应因子簇为例》,是我们“因子生产加速”系列研究的首次尝试,主要包含以下3点贡献: (1)聚焦数据存储端,重点介绍了MemoryMap这一数据存储技术,并展示了其相比于CSV、Parquet等传统数据存储形式的优势; (2)在因子构建思路上,将事件研究的想法融入到选股因子的构建中,具体以羊群效应因子为例,详细讨论了如何相对体系化地批量构建因子; (3)最终提出“因子簇”的概念,得到羊群效应话题相关的一簇有效因子。 图表2:上一篇报告的主要内容 资料来源:国盛证券研究所整理 本文为国盛金工《“量价淘金”选股因子系列研究》的第十篇报告,继续围绕“因子生产加速”展开研究,仍然以“数据存储与读写的技术”、“体系化的因子构建思路”这两个角度为切入点,进行更深入的讨论。那么本文与上一篇报告的异同在于: (1)数据存储与读写方面,上一篇报告重点讨论了如何利用MemoryMap存储数据,但只是粗略展示了它的读写性能;本篇报告将结合“分段读取数据”的具体应用场景,分析MemoryMap的读写性能优势,并与CSV、Parquet等传统数据存储形式的读取速度进行对比,属于对上一篇报告的延伸与具象化; (2)因子构建思路方面,上一篇报告给出的“事件识别-因子定义-数据频率”框架,并不能囊括所有的因子研究思路;本篇报告跳出上述框架,给出另一种体系化的思考方式,具体以“订单簿资金流因子”为例,展示在另一套研究框架下,如何系统性地批量构建因子;在这一方面,本篇报告与上一篇报告为并行关系,即基于不同底层逻辑、讨论了不同的因子研究思路; (3)最终的研究成果展示形式,本篇报告与上一篇报告一致,通过批量生产与筛选,保留一簇有效且相关性较低的因子,称之为“订单簿资金流因子簇”。 图表3:本篇报告的主要内容 资料来源:国盛证券研究所整理 二、MemoryMap的分段读取性能优势 2.1概念简介及数据存储代码展示 关于MemoryMap的概念及数据存储方法,我们在上一篇报告《“量价淘金”选股因子系列研究(九):MemoryMap在因子生产加速上的应用——以构建羊群效应因子簇为例》中已进行详细描述,此处做简单回顾。 MemoryMap(内存映射)技术是一种将文件或设备的内容直接映射到进程虚拟地址空间中的方法,通过这种方式,进程可以像访问内存一样访问文件或设备,而不需要显式地进行读写操作。相比于传统的CSV、Parquet等存储形式,MemoryMap减少了显式的文件I/O操作,由于数据直接映射到内存中,因此提高了访问速度。在需要频繁访问大文件的场景中,MemoryMap更能发挥其独特优势,如读取所有A股的高频量价数据。 在具体存储A股行情数据时,我们采用宽表形式。以分钟行情数据为例,将每个分钟特征设置为二维矩阵、并保存为单独的文件,比如对于某一交易日所有股票的分钟收盘价数据,我们将其存为大小为242*N(242为每日分钟数据的行数,N为当日股票数量)的矩阵文件。 图表4:宽表存储示例:以某日个股分钟收盘价为例 股票1 股票2 股票3 股票4 股票5 股票6 …… 股票N 分钟1分钟2分钟3 每个 格子里, 存放的 都是对应 股票对应分 钟的收 盘价数据 分钟4分钟5 …… 分钟242 资料来源:Wind,国盛证券研究所 在利用MemoryMap格式进行数据存储时,首先需要向系统申请一块连续的内存空间,包括基础信息(行索引个数、行索引最大长度、列索引个数、列索引最大长度)、行索引 (分钟时间戳)、列索引(股票代码)、数据值,具体的存储结构如图表5所示。 图表5:MemoryMap数据存储结构:以某日个股分钟收盘价为例 资料来源:Wind,国盛证券研究所 以2024/10/31所有股票的分钟收盘价数据对应的宽表文件close_20241031.mmap为例,图表6展示了具体的存储代码。对于DataFrame文件,我们首先计算出行索引、列索引的最大元素长度和元素数量(代码的第4-7行),然后定义内存空间的数据类型及写入的数据(代码的第10、11行),最后调用Numpy的memmap方法申请一块内存空间 (代码的第14行)并写入数据(代码的第15行)。 图表6:MemoryMap数据存储代码:以某日个股分钟收盘价为例 资料来源:Wind,国盛证券研究所 2.2分段读取数据的性能优势及代码示例 在某些因子的构建过程中,我