量化百科

Quant工具箱:机器学习理念下的量化研究

由polll创建,最终由polll 被浏览 191 用户

回顾上一章的3篇文章,我们从量化回测、实盘交易、以及中台化运营三个方面,逐步介绍了量化开发所需要涉及的工具及技术,已经有能力做到快速上线策略进行实盘交易。(量化开发之量化交易中台化

现在我们的研究员小伙伴研究好了一个简单的MACD策略,他只需将研究好的策略代码提交到代码版本库,后续的任务就可以由我们的交易系统及中台完成。通过简易的报表式UI界面,看到策略的实盘效果,小伙伴应是兴奋又忐忑的。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='2874' height='1494'></svg>)

然而可以观察到,这样的策略其实并不稳定,实际上它并没有真正挖掘到市场所蕴藏的规律。我们上线的,当是稳定的策略,策略盈利是我们的最终目标。实现这个目标,有两个必要条件:

  1. 提高预测能力:需要构建更优秀的模型,深度挖掘市场规律
  2. 降低风险:设计风控规则,并严格执行止盈止损、仓位控制

风险控制这一块,和实盘交易高度相关,我们推到下一章中再展开。这一章,我们将专注于量化模型,并将从机器学习的角度展开一个新的量化投研框架。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='228' height='210'></svg>)


流程

我们曾经提过,所谓的量化交易策略,本质上就是一个机器学习模型,(量化开发之向量化回测框架)

y=f(X;λ)

这个模型通过历史数据 X,y,寻找历史规律 f,从而对未来的市场走势进行预测。既然同属于机器学习模型,那研究的流程也离不开这么几个步骤:

  1. 定义问题:分析需求,定好目标函数
  2. 整合数据:收集数据并进行探索性分析与预处理
  3. 特征工程:数据清洗、特征衍生、特征筛选
  4. 模型训练:算法选择、调参、融合
  5. 模型评估:多维度评估样本内外表现
  6. 项目交付:测试、模拟、生产

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1798' height='372'></svg>)

现在,就让我们尝试把这些概念套用到量化研究慢慢展开

定义问题:

确认需求

首先,是确定好我们的策略需求,而对量化交易而言,需求可概括为两类——择股 & 择时

  • 择股,一般是从市场众多资产中挑选优质组合并长期持有,偏向价值投资,属于低频交易策略。方法上,则是定期对股票进行评估打分,分高者进入组合,概念上与回归模型无二。
  • 择时对应的则更像分类模型,判断某个时刻是买、卖还是持仓不动,应用上偏中短线,如波段策略、配对交易、统计套利等。

明确目标

当确定好需求后,下一步就是量化对应的目标函数

  • 对于择股模型,可以选择股票未来_N_天的表现当做目标 y,从而让模型 f 来拟合出其与因子数据 X 之间的关系
  • 若更关注收益,可以纯用收益率作为目标
  • 平衡点的,可以使用夏普比率
  • 若风险十分重视,则可以把波动率或最大回撤作为惩罚项加入目标函数
  • 同样的,对于择时模型,则可以对未来 _N_天的收益率进行转化而形成 y
  • 下一阶段资产上涨,标记为1,代表建议买入
  • 下一阶段资产下跌,标记为-1,代表建议卖出
  • 下一阶段资产波动幅度较小标记为0,代表建议持仓不动,避免频繁交易带来的高手续费

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'></svg>)

数据整合

定义好 y 后,就该去寻找 X,即我们的核心数据集。这一阶段,主要有4个环节

数据收集

巧妇难为无米之炊,数据是模型的基础。一般来说有3种方式收集数据:

  • 专门的数据提供商的接口,如Wind、Bloomberg
  • 交易所API
  • 其他第三方渠道,如tushare、论坛、财经网站数据等

数据清洗

这里我们做最基础的两步预处理

  • 缺失值处理:大部分模型,如果有缺失值 nan 的话,都是无法运行起来的,缺失值处理是必要环节。这里研究员可以凭借经验,选择填充亦或是舍弃
  • 极值处理:如果说缺失值让模型无法运行,那么极值很可能让模型失效,除非是异常检测模型,否则,建议对数据中的极值进行一定的处理,避免极值对模型产生较大的扰动

探索性分析

这个步骤我们确认数据质量、了解其数据分布及特点,并初步检验数据因子的效果。检验方式:

  • 对于单资产的时间序列,可以使用WOE(评分卡模型),可以把连续型的特征分箱离散化,检验效果
  • 对于多资产的时间序列,则可以使用Alphalens(分组回测方式),和WOE的思想很相似,核心也是根据因子取值分组,检验各特征组与最终的目标之间的相关性

数据集分割

如我们在第二篇文章中提及的,模型研究过程中不可避免地要有 训练集、验证集、测试集。对于时间序列模型而言,经典的分割方式有两种

  • 三段式:训练集、验证集、测试集顺序地分割全数据集
  • 滚动式:将数据集滚动地按顺序分成多份,每份里都是一个三段式地切分

特征工程

一般来说,基础数据之中并不会直接显露出很多信息,要想让模型从中挖掘中这些深层的隐藏信息并不容易。直接训练的话,往往费时费力还无法收敛到一个理想的水平。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='224' height='203'></svg>)

特征工程的加入,可以很好的解决这个问题,因为它直接将人们多年的经验融入到模型之中,让模型可以站在“巨人的肩膀”上继续学习,加速其优化速度。同样的,特征工程也有4个重要的概念:

特征生成

这里我们对原始的单时序特征进行处理

  • 简单如移动平均(MA)、同比环比(DIFF),以及各类技术指标(BOLLING、RSI)
  • 统计型处理如核函数、频谱特征
  • 离散化、归一化、标准化

这块可以有几个很nice的库值得被推荐:talib、tsfresh、featuretools、categorical-encoding

特征组合

特征之间可能具有很高的相关性,例如GDP可能看不出和指数的相关性,M2单独看也没有,但是两者组合成 GDP-M2 可能就很不一样了。特征的组合方式也很多样:

  • 双特征式的加减乘除
  • 统计式地抽取新特征,如PCA前N个主成分

特征学习

很多时候,特征可能不仅是原始的数据,而是其他的模型数据,如Kaggle中最受欢迎的模型之一 GBDT+LR,就是讲GBDT的中间产物作为新的特征提供给LR模型进行训练

特征筛选

特征的衍生方式数以千计,但并不是说特征越多越好,过多的特征反而会带来一系列副作用。维数灾难让计算量骤增,甚至带来不必要的过拟合。剔除冗余特征才能抽丝剥茧,降低模型学习的难度。筛选的方法也很多,按西瓜书总结的三种:

  • 过滤式选择
  • 包裹式选择
  • 嵌入式选择

可以按照实际的需求选择使用

模型训练

终于到了挖矿环节了——模型训练

模型训练可以很简单,一个LR模型判断买卖,也可以很复杂,一个巨大的神经网络集成模型。复杂度从低到高,可以分为以下4块:

算法选择

用什么方式来挖矿呢,可以是铁锹,也可以是挖掘机

  • 传统CTA:前人的智慧很珍贵,我们完全可以将CTA视为一个简单的分类模型。CTA一般适用于中低频的价量数据
  • 机器学习模型:当模型涉及到了大量财务、经济数据,统计学习就该登场了,Lasso、LR、SVM、GBDT等都是优良的备选模型
  • 深度神经网络:而当特征数进一步扩展,还加入了大量的高频tick数据,这么大的数据量,这么高的复杂度,或许该请出AlphaGo,试试神经网络这个魔法黑盒吧

参数调优

这是老话题了,好的模型通常都依赖于好的参数选择,这也是不少人都自嘲自己是炼金术师的原因。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'></svg>)

但匠人应该熟悉模型,有经验的研究员能设置精准的参数空间,从而让模型快速收敛。

算法融合

一千个读者,一千个哈姆雷特。我们训练得到的模型,只是对历史规律的一个估计。是估计,就一定有误差(偏差+方差+噪声)。噪声不可避免,方差源于数据,而偏差则可以通过多模型组合进行处理,这便是集成学习的价值所在

  • 最简单的集成就是voting,多个模型投票,取其胜者
  • 然后是bagging、boosting
  • 还有笔者最喜欢的stacking,可以把一组模型输出的结果当做新的数据,喂给下一层的meta模型

结构学习

既然我们能把模型集成在一块,那么新的问题就来了,该选哪几个模型进行集成?meta模型选什么?要不要做多层的集成学习?换句话说组合方式也可以视为一种参数,要纳入到我们的优化范围中。其实到这一步,我们已经十分接近“AutoML”。

模型评估


任何模型都有输出,拿量化分类模型来说,的输出,则可以视为交易信号。模型的评价,本质上是对模型的预测输出和真实值得差异情况评估。对于量化模型而言,其输出一般意义上讲就是对下一阶段市场的判断,其评估的重点就在于判断的准确度高低。这里我们有3种方式以供选择

  1. 经典的 ∣_y_true_​−_y_predict_​∣,用预测值和真实值之间的“距离”衡量准确度(推荐直接使用sklearn.metrics)
  2. 量化模型属于经典的时序模型,为了保存其时序维度的信息,我们可以对模型产生的净值曲线进行分析,得到夏普、最大回撤等指标来衡量模型优劣(推荐使用empyrical)
  3. 当然,可以再深层次点,用多个绩效指标复合,甚至可以对不同时期给予不同的权重,例如重视风险的话,可以在股灾期间加大评分权重

项目交付

经过层层考验,我们终于获得了一个测试效果良好的模型,我们的研究员小伙伴当是兴奋又疲惫的。当然,感谢我们的量化中台,交付时,一切都变得很简单快捷,研究员只需将代码提交到版本库,我们的系统就能自动进行后续的工作,包括时间驱动回测、模拟交易、以及实盘交易使用

另外,回顾上一篇文章,我们将发现各个组件都发挥着不可或缺的功能。

  1. 感谢mlflow:模型训练一次不易,需要把训练结果、参数、报告及时持久化下来
  2. 感谢airflow:模型大了,难免涉及分布式,原始数据可能也来源于其他模型的输出,灵活的调度系统少不了
  3. 感谢jenkins:市场变化、知识迭代都快,模型也需要频繁更新,需要一个持续集成系统来整合并自动化所有的交付流程

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='300' height='300'></svg>)


实现

确定了以上步骤,我们对量化研究的轮廓就更清晰了一层。但看到这里,有小伙伴可能要后怕,这工作量也太大了,能整合的起来吗?

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1798' height='644'></svg>)

当然能。

感谢我们最初选择基于sklearn开发的量化回测框架,使我们能全面拥抱sklearn-family的生态,可直接复用大量优秀的框架。

框架可参考 awesome-machine-learning

故而按照sklearn的习惯,我们将以上各个步骤抽象,并按照其接口标准进行对象化

  1. 数据整合:Generator
  2. 特征工程:Transformer
  3. 模型训练:Estimator
  4. 模型评估:Scorer

每个对象都将是无状态式的,像管道一样(暂且称之为管道对象)。而将这些步骤串联起来的方式也颇为简洁,用一个Sequential对象即可(浓浓的Keras味道):

seq = Sequential()
seq.add_transformer([transformer1, transformer2])
seq.add_estimator([estimator1, estimator2])
seq.add_estimator(estimator3, meta=True)
seq.fit(train_generator)
seq.predict(test_generator)

如此,一个自动化的量化研究框架雏形就出来了。

用图表来表示的话,就像一个神经网络一样,每个管道对象对应的就是神经网络上的一个节点。我们只需要编写好脚本、确定要训练整合的对象及其参数空间,后续的网络结构、参数调优都将由系统自动为我们完成,概念上和NAS(Network Architecture Search)十分相似。

当然,这方面我们同样也不需要造轮子,TPOT、AutoSkleran、AutoKeras、MLens等都提供了很丰富的automl功能,非常值得在量化研究的业务之中复用。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='1766' height='1340'></svg>)

小结

至此,总结一下我们的规划。我们从基本的机器学习模型研究流程讲起,并将其映射到量化研究上,以管道化的方式设计并连接 数据整合、特征工程、模型训练、模型评估等模块,以AutoML的方式进行模型研究。这套模式虽有一定的复杂性,但也裨益颇多:

  1. 无需在基础设施的架构耗费时间,开源社区已提供了众多优秀框架
  2. 研究员可更关注于业务,只需根据模型需求,调用现成的管道对象;若有必要,再设计新的generator、transformer、estimator或scorer即可
  3. 新设计的这些管道对象也具有极高的复用性,可复用于其他模型、亦可分享到团队里
  4. 接口统一,便于团队内部的协作建模,可以你设计transformer,我负责estimator,并行工作,加速上线效率
  5. 流程高度自动化,调参、组合均由系统完成,避免了人肉调参的低效与主观性,提高模型研究的产出效率

当然,细节决定成败,目前还只是一套理念框架,其中的每个步骤都有不少细节需要打磨。如何根据需求设计新的管道对象,量化模型研究中过程有哪些坑要注意,我们就留待后续文章逐一剖析探讨吧。

{w:100}

![](data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='240' height='240'></svg>)

标签

机器学习量化研究量化回测实盘交易量化开发