金融科技(Fintech)和数据挖掘研究(三)——量化因子的批量生产与集中管理

金融科技(Fintech)和数据挖掘研究(三)——量化因子的批量生产与集中管理
2019年06月18日 08:34 新浪财经-自媒体综合

来源:海通量化团队


 
     量化因子的本质是股票的某种数量化特征,其过程也可以拆解为“从量化指标出发,输入量化计算,得到新量化指标”。因此,计算机函数构成的基本逻辑——递归过程非常适用于因子计算架构。

本文主要对量化因子递归计算方法框架,自动因子生成器,以及高频因子构建方法进行了简要描述,同时也提出了一种自动的因子生成,管理的系统架构。

     量化因子是构建多因子组合的基本要素。随着越来越多不同种类的有效因子被发现,如何快速高效地计算因子,向前更新因子值,自动存储历史数据与新数据,方便快捷地访问因子值,对于量化组合管理来说,正变得越来越重要。本文希望从计算机的角度,构建一个完整的从计算到更新,再到管理的量化因子维护框架。

计算机视角下的量化因子计算过程

量化因子的本质是股票的某种数量化特征,一般需要通过对股票某些数量信息进行计算得到。转换成计算机语言为“以股票有关数据为输入,通过量化计算函数计算得到新的量化指标作为输出”。这一过程可以简单地通过下图来表达。

与计算机函数“从函数输入出发,输入函数计算,得到函数输出”相类似,量化计算过程也可以拆解为“从量化指标出发,输入量化计算,得到新量化指标”。由此可见,计算机函数构成的基本逻辑——递归过程也同样适用于因子计算架构。

上图展示了因子计算的一般递归过程,其中所有实体都被定义为量化指标计算过程。这是以一个量化指标计算过程为输入,获得新量化指标计算过程的实体。量化指标计算过程的递归步骤如下表所示。

从上述过程中,我们可以得到计算量化指标最重要的4个要素。

量化指标计算过程:一个递归的计算实体,其输入与输出也均为量化指标计算过程。运算过程包括数据读取,参数读取,指标计算器,输出计算过程四步。

计算参数:一种常数量化指标计算过程。即,不需要任何参数或数据作为输入,便可输出返回一个固定的常数。

初始量化指标计算过程:仅以计算参数为输入,直接依据参数从数据源读取数据的过程。一般为从外部数据源获取股票成交价等量化数据的过程。

量化指标计算算子:一种指标计算器,仅包含初等基本函数计算或者简单一阶谓词逻辑计算的过程。由于常用的股票量化数据以时间序列数据或面板数据居多,因此这些基本函数计算一般为面板数据在截面上的计算函数或基础统计函数,或时间序列数据的一些基本运算。

量化因子计算过程的实现

由上文量化指标计算过程的逻辑框架定义可以看出,实现该计算过程需要以下几个步骤:

构建初始量化指标计算过程,也就是提取计算量化指标的原始数据。该过程是整个因子计算的起点。

构建量化指标计算算子,即实现各种不同的基本函数计算或者一阶谓词逻辑的简单组合。

采用某种递归逻辑表达方式,如程序语言,递归结构配置文件等,编写量化指标计算过程的递归过程。

解析编写好的量化指标计算过程,运行并获取结果。

由上述过程可知,在构建量化指标计算过程时,如何获取初始量化指标计算过程,定义哪些量化计算算子,用什么方式编写、记录量化计算过程的递归逻辑,是最重要的三个问题。后文我们将从这三点出发,介绍不同类型的量化因子是如何构建的。

基于日频数据的量化因子构建日频初始量化指标计算过程

从数据频率上看,日频数据是构建量化因子最常用的数据类型。以交易日为单位,市场每天会产生大量公开的价量及其衍生数据。此外,财报相关的低频率基本面数据,也可以较为方便地加工成基于交易日的日频数据,用于因子计算。

上表列举了较为常用的几种不同周期的日频基础数据。一般情况下,日频因子的初始量化指标计算过程便是通过设置不同参数提取上述指标的过程。

量化因子计算的常见操作过程为,处理以交易日为时间序列、不同标的为截面维度的数据类型。上表中不同周期类型的数据,除交易日类型的价量数据、价格衍生数据外,其他基本面数据,如财报数据、不定期公告数据,均可以利用最近数值填充法,将其处理为以交易日为时间序列的面板数据。

日频量化指标计算算子

作为处理量化指标的原子运算单元,量化指标的面板数据结构决定了算子主要由时间序列算子与截面数据算子两种形式构成。常用的算子如下表所示。

算子的输入和输出都必须为面板数据。上述算子包含了处理面板数据时,用到的绝大多数计算方法。通过上述算子的递归迭代,基本可以满足目前主要因子计算所需的因子计算过程。

利用计算机语言表达量化计算过程的递归逻辑

量化计算过程即为一种递归过程。通过某种可以描述递归逻辑的表达范式,可以编写范式脚本,描述预先定义好的递归逻辑过程,并通过专用程序解析范式脚本,进行数据计算。

计算机程序语言天然被设计用以描述这样的逻辑范式。由于λ算子与图灵机、递归函数等价,因此无论是基于λ算子的函数式编程语言,还是基于图灵机的过程、命令范式语言,都可以用来构建量化计算过程。

选择计算机语言作为量化计算过程的逻辑描述工具有两种方案可供选择,一是完全借鉴现有的R、Matlab等传统量化研究中比较常用的语言,构建其语法的解释器,并实现上述算子与初始量化指标计算过程。二是完全构建一套新的计算机语言,专门用于量化计算过程的逻辑范式描述,最大程度地保证对该语言的控制力。

出于快速实现的考虑,本文采用第二种方式,即构建了一套自己的语言,通过构建量化计算过程的方式,在服务器中计算并维护BARRA风格因子。

BARRA风格因子计算方式如上表所示。其中,除市值、市盈率等可以直接从初始量化指标计算过程中获得,其他指标均需要经过数次量化指标计算算子的递归迭代得到。其定义方式的迭代逻辑相对复杂,但逻辑过程固定,且需要计算的中间指标与最终指标的数量均有限。对于这种固定且数量较少,但相对需要多层次复杂迭代的递归逻辑,直接将逻辑转换为程序语言是一种较高效的方式。

上图是利用我们自定义的量化指标计算语言,计算BARRA风格因子的部分示意。其中,以Value = Function(Value…, Param…)的形式定义量化指标计算过程。Value即为量化指标计算过程的输入或返回,Param为过程参数。Function可以代表不同类型的计算过程,既可以是预先定义的基本算子,也可以是在上下文中以function = Function(Value…, Param…)…end function形式定义的量化指标计算过程计算器。从语法结构看,该语言是一种典型的基于图灵机的命令范式语言。

上表罗列了我们计算的BARRA因子的截面表现。除市值,流动性外,绝大部分因子的收益预测能力已严重下降。因此,它们主要作为风险因子,被用来控制组合风险暴露。而寻找有效的ALPHA因子,则可以通过自动因子生成器的方式进行探索。上表罗列了我们计算的BARRA因子的截面表现。除市值,流动性外,绝大部分因子的收益预测能力已严重下降。因此,它们主要作为风险因子,被用来控制组合风险暴露。而寻找有效的ALPHA因子,则可以通过自动因子生成器的方式进行探索。

利用量化计算过程构建自动因子生成器

将因子的计算数据与逻辑单元原子化后,便可以利用这些原子单元的自动递归迭代,批量生产新的因子。具体过程如下图所示。

由单一的收益率这一初始量化计算过程,叠加不同周期的均值(MEAN)算子,便可以构成N个短周期均值因子和M个长周期均值因子。利用标准差(SD)算子,构建M个和长周期均值因子一一对应的标准差因子。最后,将N个短周期均值或最新值与不同的M个长周期均值做差,再除以对应的标准差,便可以构建N*M个突破因子。

假设使用的初始量化过程为P个,则突破因子可以有P*N*M个。突破因子同时又可以通过别的算子与其他量化计算过程迭代,每多一个初始量化过程数据,每多一种周期,每多一个算子,均可以让生产的因子成倍增加。

由于初始量化计算过程、量化计算因子以及可计算周期为有穷,则通过这些元素生成的因子也将是有穷的。理论上,遍历所有递归情况可以穷举所有因子,但目前并不推荐这种做法,原因主要有三。

首先,某些数据之间进行初等函数计算是没有意义的。如,成交量加减成交价格。

其次,某些算子多层次叠加并不会增加蕴含的信息量。如,计算数据截面分位数与将数据求三次方后再计算其截面分位数。

最后,穷尽所有可能性对运算资源的消耗非常严重。而且穷举得到的最终结果往往包含大量噪音,降噪过程也会极大地占用计算资源,使得因子构建得不偿失。

自动因子生成器仅通过遍历周期与算子对量化计算过程进行迭代计算,其逻辑路径判断比较简单。因此,除通过计算机语言构建递归逻辑外,还可以通过XML文本对递归过程进行描述。

XML是计算机领域一种主流的标记计算机可理解信息的语言。以XML节点为单元,每一个节点又递归地包含N个子节点。我们以BaseData节点表示初始量化计算过程,以包含FuncStr属性的PeerNode节点表示包含初等函数算子的量化计算过程,以包含Operators与Periods节点的PeerNode节点,表示X个时间序列计算算子的量化计算过程。其中,X等于时间序列算子数N乘以周期数M。

我们以日收益率、换手率、自由流通换手率、PB、PE等为初始量化计算过程,通过叠加均值,标准差算子,构建了226个依据以上基础数据的不同短周期相对不同长周期的突破因子。当因子IC或RIC均值的绝对值大于0.02,且IR大于1.5时,我们认定其有效。下表给出了这一标准下,全部有效因子的平均表现。

2010年1月到2019年4月,我们构建的226个因子中,约有20%到30%的因子在截面上长期有效。考虑到这些因子均是由构建传统因子的基础数据经初等基本函数计算得出,我们将其与传统九因子正交,剥离后的效果如下表所示。

由上表可见,由于计算所用的原始数据高度重合,剥离传统因子后,因子IC稳定性得到了提升,但有效性也显著下降。

我们利用两种因子筛选标准,以一年为滚动窗口构建两个因子和个股加权方式均为等权的组合。组合一选取过去一年IC均值大于0.02,且IC-IR大于1.5的因子;组合二选取过去一年IC均值分位数大于90%,且IC-IR大于1.5的因子。

由下图可见,将筛选条件从一变为二后,多空组合的业绩表现有了明显的提高。年化收益率从7.04%上升到8.65%,最大回撤从3.39%下降到2.42%。

由此可见,通过改变筛选因子的条件,可以有效提升组合的收益表现。但由于上述计算过程与九因子同源,正交后单因子的有效性较弱,故如何将这类由暴力生成方法得到的因子与传统因子结合使用,是发挥因子效应的关键。

以上分析表明,利用量化计算过程构建的自动因子生成器可以得到有效的因子簇,提供传统因子未包含的信息。目前为止,我们只是简单尝试了均值突破这一最直接的因子构建逻辑,就得到了令人兴奋的结果。可以期待,扩展更复杂的因子构建逻辑、增加更多有效初始量化计算过程与量化计算因子,或许会对现有组合带来更多有益的补充。

此外,由于通过这种方式构建的因子的数目相较于以往会有几何级的增长,因此优化因子筛选机制也会使组合的表现获得显著的提升。当因子维度成千上万时,简单的基于OLS的因子处理方法将会失效。所以,如何处理高维度的因子数据,高效地从中提炼有效的因子信息,也是利用好自动因子生成器面临的重要课题。

基于高频数据的量化因子构建

随着传统量化选股方式的广泛应用,经典日频因子的效果逐渐降低,并逐渐转化为风险因子。因此,除利用自动因子生成方式,尽可能挖掘传统基础数据的有效信息外,引入新的量化因子数据源是提供组合ALPHA的重要方式。自2010年交易所推出LEVEL2行情源以来,透过描述市场成交细节的日内高频行情信息,分析、寻找价格形成的细节脉络成为构建新的ALPHA因子的重要方式。

相较于日频数据,高频数据虽然拥有更高的数据密度与不同的数据结构,但就单个标的来看,依然可以将其定义为一种时间序列数据进行处理。因此,对应的因子计算过程的大体思路依然可以沿用上一节所述的量化因子计算过程这一框架。

高频初始量化指标计算过程

下表列示了交易所的LEVEL2行情产品,基于此可以构建不同种类的高频初始量化指标计算过程。

高频与日频数据间的最大差异在于不同的时间周期与数据结构。与传统的日频数据相比,除单日数据量大增外,时间单位的不整齐也是高频数据的另一重要特征。除分钟数据严格的在每个交易日的240分钟均有数据外,Tick数据、逐笔数据均会因标的成交热度不同而有较大差异,其时间序列有明显的时间间隔不均匀特性。

高频量化计算算子

从算子类型角度看,与日频数据相同,高频数据算子依然由初等函数、一阶谓词逻辑以及基本的时间序列函数和截面统计函数构成。由于高频数据具有数据规模大、时间间隔不均匀的特性,在处理过程中有以下几点需要注意。

分段的数据处理过程。由于高频数据规模很大,因此单次数据处理往往需要按标的或者按时间窗口对数据规模进行划分。一次性计算所有指标对应的所有时段数据,很有可能因为计算资源有限而无法实现。

高频数据的低频化。间隔不均匀的时间序列数据往往需要先变为均匀时间间隔的数据后,才能进一步处理。将数据处理为最小时间间隔单位可以保证不损失信息,然而却会因为空值填充给本来就需要降噪的高频数据增加更多噪音。因此,将高频数据利用统计或者抽样方式处理为低频数据是更常用的方式。

计算的时间窗口应当避免跨交易日。日内数据包含当天的市场交易观点和信息,很多时候依赖随机过程模型进行统计抽样。集合竞价的交易制度与隔夜信息会扭曲数据随机过程的特性,对于抽样后的再处理会有一定程度的干扰。因此在降低数据频率,选择计算的时间窗口时应尽可能规避跨交易日。而且,对集合竞价数据也需特别处理。

基于高频初始计算过程的高频成交因子

高频数据从一个新的维度揭示了市场的交易信息,利用前述量化计算因子,我们尝试利用逐笔成交数据构建大额买单成交金额占比因子。

首先,我们定义大单如下:

当订单i的成交量减去当日所有订单成交量均值的差大于l倍成交量标准差时,将该订单定义为大单。其中,l一般取1、2、3。

其次,定义如下的大额买单成交金额指标。

假如订单i全天有T笔成交,将每笔成交价乘以对应成交量得到单笔成交额。把该订单所有单笔成交额加总,并乘以该订单买卖标志,即可得到该买单的总成交金额。

第三,将所有大额买单的成交额加总,即可得到大额买单成交金额。

最后,将上式以当日总成交额,得到大额买单成交金额占比。在使用该因子选股时,我们进一步将每天的因子值按月求平均,考察其截面表现(见下表)。

由上表可见,原始因子表现良好。与常用9因子正交后的结果如下表所示。

因子正交后,IC有所下滑,但稳定性显著提升。这对我们用历史的IC预测未来,更有价值。

上表展示了大额买单成交金额占比因子在常见因子外,所能贡献的收益。总的来看,三个因子均存在稳定、显著的正向截面溢价。

根据该因子构建等权组合(见上图),2015年8月至今,年化收益20.1%,最大回撤1.31%。相对全市场等权组合的年化超额收益为10.53%,最大回撤0.78%,表现十分出色。

高频因子的计算复杂度非常高,而且需要对于存录的高频数据进行清洗、整理等操作,是一种工作量较大的因子计算方式。因此,在现有的基础设施条件下,我们尚未采取自动挖掘的方式对高频数据构建因子。

此外,由于数据整理进度的限制,基于逐笔数据的高频因子仅向前回溯至2015年8月。因此,目前只能对最近3年多的效果进行回测,因子稳定性有待进一步考察和检验。

高频数据中所隐藏的有效信息非常丰富,且与传统日频因子相关性较低。所以,无论是分钟、Tick盘口还是逐笔成交数据,都可以让我们从中获取大量有用的信息。有关高频领域因子的深入探索,我们会在未来选股因子系列研究专题中进行更新与跟踪。

因子自动管理系统框架

上文详细介绍了如何从基础数据出发,最终计算出量化因子的全部过程,在实际应用中,保证因子的“开发、计算、验证、维护、使用”这一流程,能够在一个高效的自动化系统中完成,是因子计算过程落地实践,并最终帮助我们构建组合的重要课题。

如上图所示,因子管理框架由服务器层与用户层两部分构成。用户层即分析师定义因子,编写量化指标计算过程的开发终端。服务器层主要包括因子计算服务器、因子数据库与因子查询显示服务器三类。

因子自动计算维护的过程有以下几点需要注意。

因子须有固定数据结构。通常来讲,一个带有code,dateTime字段的数据序列即可以标识某标的在某一时点的一组因子值。关系数据库目前依然是存储因子值最常用的方法,因而保证因子关系数据库结构的稳定是服务器层可以进行自动管理的核心要素。

存储因子计算过程而不只存储因子值。利用计算机语言或者XML进行因子计算过程的逻辑定义既保证了因子计算过程可以用文本的形式进行存储,又实现了计算机的自动解析运行。存储因子计算过程可以有效保证因子计算的一致性,避免分析师在使用、分析、修改现有因子值时,产生歧义。

因子计算服务器需要有自构建SQL,并进行因子数据库管理的能力。增删查改是关系数据库基本的操作类型,无论哪种功能都是以SQL语句为媒介进行的。下图展示了建表的SQL语句示例。

SQL语句是一种逻辑高度一致化的语言,可由程序根据需要自动构建和运行。目前,已有非常多的工具可以依据用户定义,自动构建SQL语句进行数据库管理。出于功能的可扩展性,自己编写代码实现SQL语句生成器也是一种可选的解决方案。

因子计算服务器在识别出预计算因子结构后,可以直接将所计算因子的数据结构与因子数据库中现有的数据进行对比,检查是否为新的数据或数据结构已发生更改。由于关系数据库建表与删表的速度远高于数据表修改,因此当发现结构不匹配时,删除老数据表,与新数据一样重新构建数据表是一种更为高效的做法。

总结

作为构建量化多因子组合的重要工具,因子可以通过计算机进行全自动的生产与管理,从而让因子的使用者摆脱管理、更新因子数据的繁重工作,将时间与精力投入到有效因子的挖掘与构建中。

因子计算只是构建多因子组合的第一步。在获得因子值后,后续还有如因子有效性评价,因子的过滤和筛选,因子权重配比,组合权重配比等大量工作。以量化的方法处理其中任何一步,都会有大量的数据计算过程。而这些过程的绝大多数,都可以用一阶谓词逻辑与初等函数计算的递归过程进行定义。即,可以将上述步骤中的绝大部分工作拆解为计算机可识别、可处理的模块进行自动化的计算与管理。如何利用计算机工具,进一步在量化研究和投资过程中提升自动化水平,将是本系列未来所关注的重点方向。

风险提示

数据挖掘是从历史先验数据获取经验模型的方法,存在模型失效可能。

联系人:余浩淼,021-23219883

免责声明:自媒体综合提供的内容均源自自媒体,版权归原作者所有,转载请联系原作者并获许可。文章观点仅代表作者本人,不代表新浪立场。若内容涉及投资建议,仅供参考勿作为投资依据。投资有风险,入市需谨慎。

金融科技

热门推荐

收起
新浪财经公众号
新浪财经公众号

24小时滚动播报最新的财经资讯和视频,更多粉丝福利扫描二维码关注(sinafinance)

7X24小时

  • 06-25 大胜达 603687 --
  • 06-25 中信出版 300788 --
  • 06-25 丸美股份 603983 --
  • 06-24 红塔证券 601236 3.46
  • 06-18 中国卫通 601698 2.72
  • 股市直播

    • 图文直播间
    • 视频直播间