当前位置: 华文星空 > 财经

机器学习在金融应用实践上的一些体会

2021-05-30财经

在工程上,任何一个步骤都需要仔细再仔细,数据校验,流程测试需要贯穿在每个步骤上,任何的疏忽和不小心都会导致错误的出现。

引言

自新年尹始,笔者就忙于领导给笔者提出的一个新课题,新课题需要使用机器学习进行实践,很多细节之前笔者都没有趟过,导致中间 过程磕磕碰碰。还好有其他同事的建议与指导,已经先前一版比较成熟的实践方案珠玉在前,笔者为此也少走了很多弯路。即便如此, 中间的一些坎坷与经验,还是挺有记录与分享意义的。

正好之前在行业交流群内看到有朋友在问机器学习如何实践,而在类似知乎等平台上也有挺多爱好者的各种尝试,但是似乎挺多细节并 没有做到比较好的思考与体验,笔者这里按照自己的实践步骤,给出一些经验与建议。

基于场景的步骤划分

笔者所做课题属于算法交易的一块,领导给出了一个远期需要达成的目标,剩下的就需要笔者去规划研究路径,实现途径等内容。在算法 交易这一块经验的缺失,着实困扰了比这儿一段时间,很多想当然的内容后来也统统被证伪了。现在回头来看,其实做类似课题的时候, 千万不能被学术的一些思维禁锢住, 基于场景 的规划与实践可能才是更有意义的。

明确目标

所谓 基于场景 , 其实最重要的是,一开始就需要把问题描述清楚,明确自己需要达成的目标是什么?然后去思考目标的逻辑性与 可行性。举例而言,笔者这前遇到过有位老师,他虽然说要做金融 AI,但是并不知道自己到底需要达成的什么目标。因为他最开始的 想让笔者实现多项式拟合股价,然后去预测股价!!!姑且不论这中间的 「过拟合」 「欠拟合」 等问题,这个课题从逻辑上就有悖论之 处,简单想一下,股价的形成是市场的合力,这个合力包括了保险资管,公募资金,散户,私募资金等多方合力,没有任何理由可以认 为这些分开的个体能将股价维持成某个函数形式。逻辑上有问题的目标,我们何必去费那力气。

这个问题引申开来,笔者认为,任何试图对未来股价进行预测在场景描述上都是有问题的,因此,有些对股价预测的分享和尝试,其实 在实践上都应该会面临这样那样的问题。之前看知乎上有量化爱好者用这样那样的方案去进行股价预测,本质上,笔者认为和多项式 拟合股价没有什么区别。

但是,如果换一个角度思考股价预测的问题,为什么我们要去预测股价?其实是为了获取价差之间的收益,这个收益有多有少,反应在 股价上,就是时序上两个股价之差,这个差具体多大也许挺难预测,但是 T+1 时刻股价相比 T 时刻股价涨还是跌,涨多高的幅度,跌 多少的幅度,其实有个概率上的判断就足够了,于是,问题也就变得简单了,不是去预测股价的回归问题,而是去评估股价在指定时间 内涨,跌的概率,涨多少,跌多少的概率的分类问题。于是 基于场景 的问题就可以很明确了,即在指定时间内,股价的变动范围 会落到哪个区间的分类问题。

目标确定下的步骤划分

资料搜索与储备

其实这一块笔者一直都是采用的偷懒的做法,首先中文搜索引擎,类似知乎等内容聚合平台上去搜寻类似问题有没有人有做过,他们的 经验教训是怎样的;如果还是觉得不够,英文搜索引擎, QUORA 等国外内容聚合平台;然后是 google 学术等按照之前他们读过的觉 的好的文章找到,sci-hub 去搞到文章内容。此外,笔者的个人经验,其实很多券商的金工研报还是相当有借鉴意义的,不过直接套用 往往会碰到这样那样的问题,不过研报有些思考其实是可以沿袭的,譬如之前看到某研报说是做的高频因子研究,但是最终却还是日线 级别的收益分析,可能有些人会觉得这样的研报在日内高频研究上用不上,但是如何换个思路,将研报中对高频因子的定义的思想搞 清楚了,完全可以形成自己的高频因子。

路径规划

它山之石可以攻玉。相当多的问题在网络上都可以找到前辈的经验,按照自己明确的需要达到的目标,对自己需要做的事情有个大体的 把握。在这一块可以尽可能的发散,但是需要注意的是,每个发散与调研的环节,也需要明确截止时间,不然太发散了,很容易就偏离 主线了。来自笔者同事的建议确实很有道理,尽快聚焦主线,当一路环节都趟平了,其他之前自己觉得做的不好的环节,完全可以到时 后回来改善。

  1. 资料搜集与挑选 按照笔者的经验,一般一到两周的资料搜集与挑选,对挑选出值得精读的文献进行一周的仔细阅读,然后用一到两周对文献中重要 的内容进行实现,基本上够用,当然某些文献内容比较艰深,复现起来难度也足够大,这时候就需要读者自行进行取舍了。
  2. 内容复现与大体判断 在大体调研与实现后,需要对自己选定的内容有效和可靠性进行大体判断。以笔者做的高频研究举例,首先是自己选定的高频因子 逻辑上是否符合条件,然后是高频因子是否在时序上有自回归的特性,接着判断高频因子与短期股价的收益率是否能够保持在比较 长时间 IC 或 IR 为正的情况,笔者这里直接偷懒,用因子与收益率做一个累计线性相关性判断,一般平稳向上的就认为该因子可 以纳入候选。下图来自海通证券的冯佳睿 【高频因子的现实与幻想】,读者们感兴趣完全可以去用冯首席他们对高频因子的评价手段,
  1. 工程预实现 这块内容比较复杂而且耗时持久,笔者这里特意写了 "预实现", 是因为这块内容下半部分,即由客户采用,并被上规模的资金验证 尚未达到。这块内容再下个章节中进行阐述。

工程预实现

这一块内容,笔者大体分了几大部分进行实现。

数据清洗与处理

这一块是重中之重,数据的好坏往往能决定研究结论的对错。笔者现在某 TOP 券商任职,来自公司层面的数据支持还不错,因此笔者 有幸拿到了交易所原始数据进行研究。但是,即便是交易所的数据,一样埋藏了各种暗坑,使用时也得小心再小心。

  1. 数据重复问题:量价数据在表现形式上其实是一张表格,如下图,是来自 QUANTAXIS 已经处理好的分钟数据表,QUANTAXIS 已经 设置好了索引和列名,但是很多时候,原始数据会面临重复数据问题,此时,可以参照 QA 的做法,设置好索引,然后 DROP 掉 重复数据
  1. 非交易时段数据过滤: 有点坑的是,来自交易所数据会有非交易时段的数据,不注意可能在非交易时间去模拟交易了,这里如果读者 使用 pandas 进行数据分析时,对时间过滤有个小技巧,对于多个日期跨度下,进行小时和分钟的时间戳的过滤,可以使用 between_time, 对于 pd.MultiIndex, 则可以先 unstack(level=-1) 然后在进行 between_time 的时间筛选
  1. 降采样的问题: 来自交易所的数据并没有分钟数据,一个方案是对交易所数据进行降采样,但是,当你降采样之后,你会发现,不同 的数据源的分钟数据都不相同,来自行业内的交流,甚至快照数据,不同数据源都不一样,很多机构只能自己采集 Level2 数据后 自行进行降采样处理。注意, 降采样还有一个不注意就很容易引入未来数据的大坑 , 使用 pandas 的降采样默认是左对齐 的,于是,同样的 9:30 ~ 9:31 分降采样的分钟数据,其时间戳对应的是 9:30 分,从理解上,可能设置为 9:31 分才更合理, 多个数据源对此貌似都没有加以说明,直接就用的 9:30 作为这个分钟的分钟 bar 了,这一块,得表扬下掘金量化的数据,他们 的分钟数据是包括了 'bob' (BAR 数据的起始时间) 和 'eob' (BAR 数据结束时间)。对降采样,其实只要特征与标签设置一致即可, 笔者这里是用 9:25 ~ 11:30, 13:00 ~ 15:00 的逐笔数据进行分钟降采样后,丢弃 NaN 值,然后再进行 Resample, 最后 统一 shift(1), 这样,既考略了集合竞价的数据,有将非交易时间的数据丢弃,同时还保证了数据是以分钟结束的时间戳作为 这个分钟 bar 的时间戳。

因子合成

高频因子这里,笔者觉得挺多人也有误区,觉得只要我有数据了,随便乱造,乱七八糟组合起来就可以上高大上模型了,就可以有很好的 效果。其实,从笔者的经验来说,很多简单的价量数据拼接,已经没有什么价值了,从逻辑上我们也判断出来,这么多家大型机构,又是 遗传规划, 又是超算等硬件加入,如果有简单的因子,机构间同类竞争已经把汤都吃干抹净了,对于其他量化研究而言,在高频因子构成 上,寻找一些更有逻辑价值和意义的方式,也许才更有意义。不然那么多大机构招聘各类手工挖因子的人意义何在呢?对吧。

高频因子的合成其实在技术上也会有个困难。随着时间频率降到快照,逐笔的时候,数据量会达到几十上百 GB, 如果还用 pandas 去进行 数据分析很容易碰到性能瓶颈。但是 pandas 有着这么多优秀的接口,直接放弃还是挺可惜的,这里笔者推荐读者们试试 dask 进行 多进程的数据处理分析,至少在价量数据这一块,单机还足够。这里介绍一个小技巧,其实可以按股票进行分别设置 delayed task, 最后将这些 delayed task 拼接成 dask.dataframe 进行处理,速度还可以。

之前在行业群里有人问过一个问题,他想拿过去 100 根 bar 的数据合成各种乱七八糟的技术指标,不太懂如何去匹配到机器学习模型上, 其实,想明白了也挺简单的,假设当前时刻为 2021-05-28 10:00:00, 前 10 分钟的数据拼接成的不管什么因子,在表现形式上是一行, 这一行的时间戳就应该是 '2021-05-28 10:00:00', 然后这些因子对应的未来的价格涨跌幅,其实时间戳也应该是 "2021-05-28 10:00:00", 这样,输入的 features 与 labels 形式上就统一了,可以随便套用到不管是 scikit-learn 还是 pytorch 等各类机器学习库上了。

标签生成

标签生成第一个容易让人困惑的点是在时序场景下,未来价格涨跌对应的标签怎么对应到当前时刻上,笔者在因子合成中也分享了自己的 经验。

这里笔者想特意着重强调在 pandas 中踩到的一个坑,即浮点类型的比较问题。读者朋友们如果想要针对 pandas 中某个数据进行 比较的时候,如果对应列的数据类型是 float, 千万千万不要直接使用等于进行比较。特别感谢来自同事黄钰的提醒,没有他的仔细 核查,笔者也不会观察到这么细节的坑。所以啊,做事千万千万也认真仔细,不然一个小坑会把自己坑的特别惨。

模型选择

学术上现在有着各种各样的高大上模型,但是在实践上,有些高大上模型其实落地会遇到这样那样的困难。尤其在某些特别注重安全的 场景下,神经网络一套,最后来个黑箱模型,有没有过拟合,如何对有效性进行评价,有效原因是什么无法解释,如果碰到极端行情 的时候,但是模型又没有很好地应对方式,很容易出问题。

这里感谢同事的非常有经验地提醒,先专注一个简单模型,做精做透了,然后再去思考模型的缺点与可改进的方式,不要一开始就想着 各种复杂模型,自己都没搞清楚模型细节,最后花了好多时间,却没有得到好的效果,时间就白费了。之前看到知乎有同学分享用 GDBT 然后加上 LR 进行模型构建,逻辑清楚明白。但是等笔者做完 LR 后,回过头来加上 GDBT 后,却并没有达到提升绩效的效果, 当然也可能是笔者用法不太对。

此外,笔者还想分享的一点是,工程上,上模型并不要求把对应模型论文看了,源码看了,大处着手,了解模型原理,知道每个参数 意思,其实可以节省很多时间。最开始笔者直接套用 LR 的模型参数设置,也没注意模型参数的意思,自己哼哧哼哧半天做了个样本 均衡处理,最后发现原来模型自己就已经有样本均衡的参数设置了,白费了不少功夫。

绩效评价

绩效评价不同的机构有不同的观察维度,这里笔者想分享的是,对绩效评价,需要根据应用场景去找对应的指标。举个例子,医院检查 的时候,更应该关注的是召回率 (Recall), 因为一旦某个疾病没有被查出来,面临的困境可比查错了再复查更艰难。而在股票买卖 上,更多时候是宁错过,勿做错,因为买错了面临损失与不买没有损失可是两码事,也因此,在金融场景下,很多时候,查准率 (Precision) 会更重要。在之后的模型优化上,也可以根据自己关注的指标,进行有针对性地阈值 cut.

样本选择

其实这一块在笔者面临的场景下,倒还好,毕竟高频数据还比较足够,可能更多的问题在于大量数据的处理耗时上。有一点需要注意的是, 在简单评价模型时,可以用同一批数据来做,但是最终评价,最好还是在时序上做一个循环验证。譬如,拿一周数据训练,一周数据验证, 然后在几个月或者一年时间范围内,按照一周一个时间窗口对训练集,验证集进行分割,得到时序上,样本上的稳定可靠的结果,对同事 和领导才有说服力。

结语

笔者的一些浅薄经验,可能很多读者都已经趟过这些浑水了,如果有任何的建议和评价,欢迎留言,正好笔者还在紧张地开发改进项目中, 可以白嫖大家的经验,想必是非常好的。