AI大赛答辩之林汉轩:AI可找出股市中“有雷”的公司

AI大赛答辩之林汉轩:AI可找出股市中“有雷”的公司
2018年08月29日 10:50 新浪财经

  新浪财经讯 8月29日,由中国证券投资基金业协会金融科技专业委员会联合易方达基金、华夏基金、阿里云、通联数据等举办,新浪财经独家媒体支持的“FDDC2018全球金融数据探索与发现大赛答辩会”在北京金融街威斯汀大酒举行。本次大赛有两大赛题,分别为“A股上市公司营业收入预测”与“A股上市公司公告信息抽取”。

  在营收预测赛题答辩中,复赛排名第二名的“Quant_duet”战队表示,团队的最终作品,是由多因子模型和神经网络模型线性叠加而成。其中,多因子类似于量化投资中的多因子;而神经网络模型要求,对公司所处行业的分类很重要。根据团队对行业板块的二次分类,从单一的统一模型,转化为分类模型。

  “Quant_duet”战队称,对于A股市场上存在丑闻、造假的公司,例如长生生物、金亚科技等股票,通过公司财务数据以及模型的构建分析后,可以看到这些公司的数据与正常公司存在明显差异,以此类推,据此可以及早发现“有雷”的公司。

  据了解,“Quant_duet”战队为林汉轩、邱爽2人组成的团队,其中,林汉轩,现就读于复旦大学,物理学专业;邱爽,毕业于上海交通大学,软件工程学专业,现从事证券投资相关工作。

  以下是文字实录:

  Quant duet

  林汉轩:我很荣幸能够参加今天的答辩活动,我是来自Quant duet的队长林汉轩,我现在是复旦大学物理系的一名博士生,这个工作主要是在暑期时期证券量化研究中心过程去完成的。另外的队员邱爽也是我的同事。

  今天我把整个答辩起了个题目,叫做“用机器预测财务指标”。下面有一个英文名字,这里面的关键词restricting(音),我之后会做深入的分析。

  首先,用一句话来讲参加比赛的初衷,我们希望通过量化的方式来进行基本面数据的处理和分析。我们知道在金融量化领域里面,技术分析已经是比较成熟,而且大家都在用的一种方式。在基本面领域里,一般是研究员根据自己对行业的研究来逐步的得出结论,之后跟Darua(音)结合在一起,是我们最终的目标。比赛是很好的出发点,所以我们愿意做这样的尝试。

  今天讲的内容主要分三个部分。第一:数据的处理。第二:模型的使用。第三:模型应用上的特征。

  第一,数据的处理。使用的数据全部来自于大赛提供的官方数据,而且使用了其中两个,一个是财务数据,一个是市场数据,也就是我今天第一次会提到restricting(音)这个词,我们所用的数据并不是有很多的类型。

  说到财务数据,我这边稍微讲一讲。报表大家都在用,其中对于利润表和现金流量表是过程链,也就如果说我是得到了季度一Q1的营业收入,那我知道半年报的营业收入,那我想知道Q2的营业收入怎么做的,需要做插分的处理。这两个表会有插分的处理,一般大家都是预测季度二,因为季度一是已知的值。

  对于市场数据,因为提供的是热度数据,所以我们采用季度平均的方式。这样两个合起来就是最后模型的主要数据。

  这里值得提到的一点,因为大家之前好像都没有提到这次的评价指标,评价指标其实是一个加权的相对误差。也就是说,它最差值大概是4点多,一般大家都是这个值。它对应的相对误差大概是80%,我们根据赛制的规则最差就差80%。最后针对季度二单个季度,可以看最后回测的数据都是1左右,也就是说对应的相对误差大概是19%。对于最后提交的成绩,我们可以看到是季度一和季度二的相加,所以等效相当于把相对误差再减少一半,所以一除以二就是最后等于0.5值,我们的成绩很符合我们的预期,也是最后得到的成绩。

  第二,算法解析。最开始使用的是时序模型(音),时序模型是金融领域里面常用的模型,我们采用简单的移动平均的方式,其实就可以把刚才讲的指标从4.2提到1.9。当然我们还用了其他的模型,在初赛的时候提到的模型,所以今天不会细致的去谈。

  今天主要讲的是多因子模型,决策数的XG估值和深度学习的神经网络模型。这里值得提到的是下面的输入,我们使用的输入对多一的模型,在因子中使用到的主要是财报中的数据。我这里必须要Highlight(音)一点,因为这个地方PPT有点转换,营业收入是Highlight(音)。我这里特地去除了营业收入因子,把这个因子放到了深度模型学习中,深度模型中的主要因子或者是输入就是营业收入。最后,这两个模型会进行结合,至于为什么要这样做,之后在模型结合会跟大家进行讲解。

  对于多因子模型,我会先介绍算法和模型的基本信息,包括使用了哪些因子和最终的结果。使用的多因子模型是进行单季度的训练,这些数据是有一定的季度性,从参考文献中也可以看出来营业收入有一定的季度性,所以每个季度训练一个模型。每个模型中是包含了所有的公司,在多因子模型中并不分类别。

  因子的选取,最开始的基准就是刚才讲的财务。刚才大家也都讲了财务数据中准确值的处理,因为如果总的因子三个财报合起来大概有300多个,其中很多的都是一些空值。如果这些空值的占比超过的80%的因子全部剔除掉,最后剩下的这些因子大概就是有一百多个,我们就进行了这样的简单剔除。剔除以后,我们就可以把它放到XGBoost中,然后得到了这边的这根蓝线。这边的纵轴就是我们的评价指标,横轴是一些时间的节点,因为不同的季度。

  接下来,我们又放入了一些财务的指数,也就是像周转率这些比较常见的大概是有十几个。放进去完以后可以从蓝线降低一些到黄线,再接下来放入了市场数据,包括市值、成交量、成交金额等等,也就是简单的放进去,然后就可以得到一根绿线。

  最后,比较有趣的是行业的分类。这是一个隐藏的数据源在整个数据中,在市场数据中有一个行业的分类比整体所谓的四类行业要更细一些。里面大概有三十个类,我们进行了行业上的编码,编码之后把它放到输入中就可以得到红线,这个提高是蛮多的。

  最后,我要提到的一点,我刚才讲并没有把营业收入因子放进去,如果放进去可以得到这根姿线,显然是更好的对于XGBoost。但是我们最后为了模型融合的效果并没有这么做,最后选择是红线的这条因子,最后还是会在融合的时候再跟大家讲。

  最终的结果,一个单季度得到1.143这样的成绩,使用的参数是1000颗数,数的深度最高是6。其实更深的数效果会更好一点,但是我们为了避免数太深会有一些问题,所以选择的学习率低。

  讲完了第一个模型。

  第二个模型是深度学习模型,也会讲到它的一些基本的信息,然后我们会比较一下循环神经网络和全连接的神经网络,接下来是一些因子的筛选。值得注意的是这里所谓的统一模型和分立模型,这里所谓的统一模型也就是类似于刚才的数模型,我把所有的行业都放在一个模型中。分立模型就是刚才讲的有一些行业的分类,刚才有同位也谈到分开来讯息会怎么样,我就做了这样的事情。最后是我们最终的结果。

  基本信息,在这个模型中是所有的季度一起训练,并没有分季度性。下面我们刚才讲的训练级,每个模型是包括所有的公司,这里所谓的所有的公司,当然如果是统一模型就是所有,如果是某一个类别就是那个类别中的所有公司。比较有趣的是,我们第一个想到的应该是循环神经网络,因为我刚才讲我们的输入是营业收入,营业收入显然是一个时序,这个时序放到循环神经网络中是非常理所应当的,所以我们时序长度也不长,我们只选择4,最开始的一个尝试。每一个时间节点输入那个时间节点的营业收入,还有下面的是一个季度的编码,也就是说如果是季度一就是1:0,季度二就是01:0这样依次类推。最后通过全连接网络,我需要把数据进行简单的降维,最后得到的结果是这边展示的第三个表格,大家可以看到大概在1.2左右。

  之后,我们想是不是可以不要这样的循环神经网络?因为长度并不长,我如果直接把四个维的数据变成二次维的数据放到一个全连接网络中,它是不是会有一个更好的效果?确实,我们也得到了一个更好的效果。如果直接只使用一个全连接网络就可以得到下面这张表格在1.15左右。为什么?因为我们刚才讲的时序不长,一共只有4,我们持续的尝试8或者是12那就是一年、两年、三年的差别。但是由于时序不长,所以对循环神经网络可能它只是额外的增加了参数并没有更多的优势,所以还不如使用全连接网络。

  这里值得提到的,也是刚才很多队伍都提到的,对数正则化的问题。营业收入的分布并不是正态分布,如果我们不去进行正则化,我的这个模型是会收敛,因为分布差太多。但如果我们进行了取状的做法,它就会变成比较好的正态分布,这样的话模型就很稳定,收敛是一定收敛,成绩也是可以看到的。这边我没有列好几个,每一种参数都是做了三次,这是大概的平均值,所以还是比较稳定的。

  接下来讲因子调整,刚才讲的四期的营业收入再加上季度的编码,这是我们的一个基础点。如果刚才讲了用8期、12期,效果也是一样的,差不太多,是得到1.15左右。接下来故伎重演推算把资产数据加进去,加入了市场市值、成交量、成交金额,同时对同一个模型使用了行业的类型,把它跟刚才XGBoost一样把它放进去。在这种情况下,我们就可以得到1.62的成绩。大家知道对于神经网络一般会采用集成,叫所谓的Bating(音)或者Insaibo(音),最后就可以得到1.156这样的成绩。

  接下来比较有趣的就是统一模型和分立模型。我们知道行业是很多的,应该是有33个爆发性的数据,有些其实是可以合并的,比如说建材,有的时候是可以分到一起的,最后我们得到的是24个分类。每个分类进行了分立的模型训练,希望能捕捉到每个行业自己的信息,确实我们也成功了,我们发现分立模型的单个模型,所谓的单个模型是24个,得到的结果是1.086,比刚才1.12要提高不少。如果我再进行集合就可以得到1.06,这就是我们最终提交模型的结果。

  大家可能会疑问,你这不就是在不断的Baike(音)吗?每个模型Baike(音)一下,然后你可能Baike(音)更多次,但实际不是这样的。如果我把统一的模型Baike三十次和Baike十次,最后的结果是差不太多的,它是不会小于1.1的,但是我对于分立模型就可以达到。原因就是我刚才讲的,虽然每个模型的数据量小了,但是可以捕捉到它各自的特征。最后我们的成绩就是1.106。

  最后,我们要把刚才讲的两个模型融合在一起,我们使用的是线性的叠加。我们把多因子模型和神经模型相互叠加,得到的共同模型就是最后提交的成绩。这里要提到刚才为什么不把营业收入二次进行共享,如果放到了多因子模型中,确实多因子模型的成绩提高了,但是再做线性叠加的时候,得到的叠加程度就会比神经网络1.06还要低。我觉得这里面涉及到模型之间的独立性,因为你如果共享同样输入的话,可能它的独立性就会差一些,独立的模型相互叠加会得到比较好的结果。然后又对我们的算法进行了一些分析,其实也列出了时序模型,后面两个是多因子模型,因为有神经网络。可以看到有一些数据量复杂度,多音字模型和人工神经网络都是差别不大的,比较有趣的是多因子模型是可以解释的,因为它有数模型在做这样的一件事情。

  我们发现排名第一的因子是总营业收入,接下来是销售商品提供劳务收到的现金,接下来是总成本或者成本,最后一个是市值,当然后面还有一些,这是排名前5的。我们也查了一些文献想研究,由于时间的原因就讲总营业收入和总成本两个事情,为什么总营业收入这么重要?很简单,其实我们知道对神经网络模型直接使用营业收入就可以来进行预测,说明营业收入本身就有很强的信息在里头,总营业收入只是更大的范围。对于大多数公司来讲营业收入就是主营业务,很多情况下跟主营业务是差不太多的。对于总成本,大家也应该可以想象到,一个公司的营业收入上去,必然总成本也会上去,不可能成本老是很低,营业收入一直往上走,所以这两个是比较重要的因子,也是可以理解的。

  为了从数据角度来证明这件事情,我们进行了这样的划题。横轴是单期的营业收入,也就是我们要预测的东西,在回测的时候是已经知道这个值了。纵轴是往期,前一期的总营业成本或者是总营业收入,得到蓝色的点和黄色点,大家可以看到比较好的线性效果,甚至是线性的相关性。

  最后,模型的特点和它的应用分析,我想这也是大家比较感兴趣的地方。首先我们的模型是数据驱动,刚才一路讲下来,大家可以发现我们并没有很多人为的进行干预设计不足的因子,都是让它自己进行相互的交流。第二是比较重要的模型灵活性,这又要讲到刚才讲的持restricting(音),也就是我们使用的数据量如此的少,以至于我们如果只有营业收入和一些市场就可以进行预测,而且得到的结果1.06并不比最后提交的1.04要差很多。

  第二,我们实际上训练的模型跟刚才的线性模型没办法比,毕竟我们的网络比较复杂,但是它的单模型训练时间比较金贵,正常情况下都是3分钟左右可以完成。这样就会给我们更多的时间来进行模型的融合,所谓的Baiding(音)或者Insaibo(音),所以我们这次提交的代码会跑得时间很长。是因为在这个时间中一共有240个模型,最后进行Baiding(音)得到了比较高精确度的训练。当然所谓的灵活性就是它可以满足不同的需求,如果我们需要效率优先可以在10分钟之内完成预测,得到的结果是1.12也并不会差很多,但是二次接入可以花30分钟来进行这件事情。考虑到今天做的事情是季度性预测,而不是分钟级、秒级,所以这样的数据是完全可以接受的。值得提到的是,这里的时间都是算它的训练时间,如果只使用预测时间的话,我估计不可能到10分钟,5分钟就结束了,即使是用最准确的模型来评价的话。模型的扩展性很容易改成其他指标,我们只要把营业收入改成成本就可以马上进行预测,接下来它可以融合其他的特征。刚才讲的数据驱动并没有使用人为的一些因子,但如果我们想加进去加就好了。

  实用性,最初步的想利用季度的营收来设计交易的策略,我们做了这样的尝试,做了非常简单的模型。因为太初期了,没好意思在这个地方给大家深入的展示,我们也做了一些,也达到了不错的效果。

  公司应用角度,我们有了这样的营业收入预测值,对公司来讲可以规避市场风险,合理的规划自己的资产。从大的角度,公司知道这样的预期可以比较好的安排财政的预算,最基础的是交易策略的研究,也是我们最近正在做的事情。

  最后是使用到的参考文献,如果大家有什么问题可以再进行交流。谢谢大家!

  主持人:感谢Quant duet的分享,评委对于刚才选手的陈述有没有什么需要点评的?

  薛伟:您好!刚才提到总共的模型数量是240个,全部都是像神经网络分行业去组合的吗?

  林汉轩:我刚才讲到分立模型有24个,因为有24个类型,每个类型进行Baiding(音),每次Baiding十次,就是我指的240个多一点。大家知道神经网络的初始值会有一些随机性,所以它们的差别就是在于这儿,不知道是不是回答您的问题。对于数模型没有进行Baiding(音),因为它比较的稳定,所以没有花时间去进行Baiding(音),它其实就一个模型,直接对2018年Q2进行预测。

  尤海峰:非常精彩!从刚才几组的分享可以看到,营收预测来说,营收相对来说是比较稳定的,就像你们刚发现只用过去的营收就已经得到了很好的效果。但利润表里边有其他很多,像可能要比营收不稳定很多,比如说投资收益。如果换一个话题来预测比较不稳定的项目,你们的算法和你们的模型构建会有怎样的改进和调整模型?

  林汉轩:刚才分析的因子重要性没有展示全,展示全发现前面的大概十几二十都是来自利润表,资产负债表稍微弱一些。如果从一个现实的角度来讲,会使用目前的模型,是从实际应用上。您刚才讲不稳定性,我们最开始还是会采取多因子去试,看一看有没有比较重要的因子,在这种情况下如果真的找到了重要的因子,再把它放到神经网络里面来进行比较细致的训练。其实竖模型是筛因子的好东西,刚才看到主营收遥遥领先,大概占了很多很多。您刚才讲可能会有其他的因子排名差不多,我们就可能从那些因子再开始尝试。我因为是物理系,财务经验不是很足,但如果是财务经验比较足,它们之间有内在联系的话,我们也会选择那些人物,这也是刚才很复杂性重要的,如果有新的因子很快的放进去有更多的改进。

  王继忠:扩展一下你的思想,看你怎么讲。大概根据一组数据,100个上市公司,全中国A股加港股里边所有造假丑闻性的公司,根据过去10年的财务数据,你会怎么处理?

  林汉轩:预测它?

  王继忠:不用预测,一组一百个丑闻性的事,像长生这样的公司,也不给你任何的场景假设,就告诉有什么样的思维来处理。

  林汉轩:造假这部分在查文献当中已经发现了,它有几个特点。

  第一,在数学里面有对数据的分布,之前它是捕捉log,如果有造假数据分布是会有差距的。我们在预测的时候最初有设计因子放进去,但是估计这几个公司表现都比较好,涉及造假的比较炉火纯青,这个因子的重要性就不是很明显,我这是从数据角度讲。

  第二,在文献中查到造假发现他有比较明显性,如果市值比较小承载性公司会在四季度为了符合营收预期来进行造假,这件事情在模型当中已经发现。我们对四季度预测和一季度预测总是比二季度和三季度差,我今天没讲但是觉得第四季度的分析跟这有关系。

  您的问题是一个会考虑因子把它加进去,其他的方式只能说是尝试预测。当然您说没有其他的数据我就不知道怎么办,如果有其他的数据比较一下这一圈怎么样的,有特别明显的把它挑出来。可能只能回答这么多,不知道有没有达到您的要求。

  主持人:我们点评环节到此结束,让我们再次用热烈的掌声谢谢Quant duet带来的精彩分享。谢谢!

  现在进入到今天上午场最后一支战队,复赛排名第一的战队,Alassea Lome为我们带来赛题陈述,有请!

责任编辑:常福强

热门推荐

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

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

7X24小时

Array
Array

股市直播

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