您的浏览器禁用了JavaScript(一种计算机语言,用以实现您与网页的交互),请解除该禁用,或者联系我们。[国盛证券]:“量价淘金”选股因子系列研究(十):基于Memory Map的分段读取性能优势-订单簿资金流因子簇的构建与生产加速 - 发现报告

“量价淘金”选股因子系列研究(十):基于Memory Map的分段读取性能优势-订单簿资金流因子簇的构建与生产加速

2025-02-11沈芷琦、刘富兵、阮俊烨国盛证券x***
AI智能总结
查看更多
“量价淘金”选股因子系列研究(十):基于Memory Map的分段读取性能优势-订单簿资金流因子簇的构建与生产加速

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