AI大赛答辩之吴云:人工智能可辨别上市公司粉饰业绩

AI大赛答辩之吴云:人工智能可辨别上市公司粉饰业绩
2018年08月29日 11:14 新浪财经

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

  在营收预测赛题答辩中,复赛排名第一名的“Alassea Lome”战队表示,公司应收预测,应当把金融业与非金融行业区分对待。比如银行股,营收等财务数据较为稳定,不能与其他行业公司一起对比。此外,例如格力电器夏季营收显著高于冬季,所以建模中要特别注意。

  另外,上市公司披露的财务数据,可能存在“耍花样”的问题,投资者看到的是粉饰后的数据,需要二次筛查进行剔除,而团队的AI模型已经具备了识别这种行为的能力。

  据了解,“Alassea Lome”战队为吴云、万珊红、洪成晨、潘航、李帅5人组成的团队,现他们全部就读于武汉大学计算机学院,软件工程专业。

  以下是文字实录:

  Alassea Lome

  吴云:请允许我代表Alassea Lome团队进行PPT展示,我叫吴云。

  这个赛题就是用公司的历史数据去预测公司下一季的营收,我们看官方给我们哪些数据,首先是资产负债表,然后利润表,营业收入在利润表里面,然后是现金流量表。这个数据是季度一给,但是我们需要注意的是就是金融行业的报表跟非金融行业的报表非常不一样,所以我们要对它进行一些特殊的处理。我们列出来我们国家A股的上市公司银行是25家,证券是33家,保险是6家,这些我们是要经过特别处理的。我们最终用的数据就是官方给的三大财务报表,我们是用的这些数据的。官方给了宏观数据、行业数据、公司经营数据,这是月度一给,我们并没有采用。同时官方提供了公司角度的行情数据,数据级别是一季度一给,我们同样没有采用。

  我们看一下这次比赛的函数,大家看一下我标红的部分,ytig(音)除以y,y就是公司的实际营收,ytig是我们对于这个公司营收的预测值。我们官方实际上预测的是你要在比例上预测正确,而不是在数值上预测正确。后面的si是公司市值,最终的评分是单个公司的loss乘以它的权重就是最终的总得分。loss的最小权重值是3.7,最大值是14.3,我们可以得到一个结论,市值大的公司并不是那么重要,并是市值的公司预测错了,loss会变得很大,不是这个道理,所有公司几乎是同等重要的。我们先不急着看模型,我们看一下公司的营收,它这一项它的序列有平稳和非平稳,我们举了两个有代表性的公司,一个是银行,一个是房地产。大家可以看到,银行的营收非常平稳,所以这个时候无论是你用时序模型还是其他模型,你最终预测的结果都是很棒的,就是选手的结果不会差很多。问题在哪?比如房地产的公司,它的波动非常举动,甚至还有营收为负的情况,我们怎么让模型学到这个特征,这才是我们比赛中取得高分的关键。

  我们看一下对于平德序列,直接是时间序列,它的效果很好。波动剧烈的公司分成了三类,第一类就是季节性很强烈的公司,比如夏季,格力电器,夏季的营收就是为了卖空调,标明是不是夏季、秋季、冬季。同时我们加入行业数据,就是加强季节性跟反季节性的学习,反季节性指的就是比如卖羽绒服的公司夏季的营收当然差,它夏季怎么卖羽绒服呢?接下来是行业整体不景气,就是整个行业所有的公司收入都不好,一个代表就是2018年上半年我们知道证券公司的日子不太好过的,我们怎么让模型学习到这样的特征,我们加入申万1+3级行业指数,通过指数的下降,整个行业不景气表征出来,我们同时还有其他的行业特征。最后就是比较头疼的就是波动非常剧烈的特征,我们怎么去学习。三个代表性的行业,房地产、多元金融和传媒。这个就是如果这个模型最终能够成功预测的话,就是它必须是这个公司之前出现过类似的波动,如果有的话这个模型可以学到的。如果其他公司出现过类似的波动,也可以学到。如果这两种都没有,我们特征里面必须有反应这种的特征。

  我们加入行业特征之后,这是我们对于证券这个行业整体的预测,这就是它2018年二季度的实际营收。除了东北证券山西证券之外,我们的模型预测都是偏大。但是我们加入了行业数据之后,可以看到整个模型预测是很准的。但是有两个意外,像东北证券和山西证券地方性的证券,它在整个行业整体下行的情况下,它的营收仍然保持不错,我们在整体行业预测变好了,对于地方性的证券公司,我们可以加入表征地方性公司的特征。

  之前评委提到公司的财务造假的问题,实际上我们是在我们的模型当中予以关注的。我们来看一下,就是在官方给的三大财务报表里面包含了公司上市之前的财务数据,因为公司上市之前交易所强制它公布你上市之前的经营数据,但是这部分经营数据事务所会审核,但是因为年代很久远,这部分数据我们认为它的真实性要打折扣。同时因为公司只有年报被事务所审核,它的季报跟半年报都是不审核的,我们对这部分数据表示质疑。

  我们再来看一下营业收入同比增长率上的猫腻,我列举了一个公司三期的营收,大家可以看一下这个公司2018年3月份比2017年3月份的收入低一点,我们可不可以认为这个公司2018年6月份经营状况也是往下跌的?这个公司整体处于下行的状态。但是不是,这个公司逆势上扬。上市公司的财报有投资者非常关注的是营业收入同比增长率,一般公司粉饰这个增长率,会把营收给评估过去,大家会发现这里面有个规律,2018年6月份加2017年6月份等于2017年3月份加2018年6月份的营收的,这是公司常用的造假的伎俩。还有一家公司历史营收,三季的营收数值一模一样,这类数据我们是不考虑的。

  因为金融数据里面有非常多的噪声,下面我们开始讲一下我们是怎么清除这些噪声的。

  我们把官方提供的三大财务报表里面所有出现过的公司提取出来一共3551家,我们把其中B股、ST、*ST全部剔除掉。我们把营收数据少于4条的公司剔除掉,同时把近期停牌以及存在明显财务造假的公司剔除掉。这里我们把所有公司的数据删掉,另外一个维度,我们把一个公司一段时间的数据删掉。首先我们把2010年之前的所有数据删掉,过于久远的数据对于现在是没有影响的。同时把公司上市之前的数据全部删掉。如果公司某一阶段营业收入为负或者0,把异常时间段所有数据剔除掉。测试集上的公司某一时间ST、*ST的剔除。营业收入低于100万的时间段,剔除期间所有数据。

  下面我来讲一下我们的数据集的结构。

  首先我们把官方的三大财务报表里面的所有特征提取出来,需要注意的是资产负债表是点的概念,我们不需要做当季值处理。利润表和资产负债表要做当季值处理。绝对没影响的特征要删除掉。金融行业跟非金融行业财务报表非常不一样,我们会把金融行业跟非金融行业共有的特征提取出来放在最前面,分别加上金融行业的特征。这就是我们三大财务报表的一个基础财务数据。同时我们引入行业分类,主要引用申银万国,但是我们这里做了一个变化,我们并没有把申银万国一到三级的行业分类全部拿近期做类比特征,因为知道如果类比特征太多的话,数据的维度太高了,噪声就特别多,所以我们只是采用了一级行业的分类。这里面有一个技巧,申银万国一级分类里面没有包含保险、证券和多元金融,我们人为地把非银金融行业拆分为证券、保险和多元金融,所以申万的一级行业分类由28个变成30个,这是为了方便我们预测证券、保险、金融那三个行业的公司。

  同时我们加入指数日行情,所有指标进行特殊处理,我们认为这种指标解释性更强。同时我们还有行业估值信息,这都是为了表征行业的整体情况。

  同时我们在公司角度上加入了沪深股票日行情以及个股日资金流向。财务衍生数据实际上也是多音字数据的一种,这些数据加入的原因就是这种财务的因子可能比财务报表上提取的单一数据解释力更强,最终我们还加入了表征整体特征的宏观数据。这里值得一提的就是我们考虑过从行业的角度去训练公司,比方说我们把化工行业挑选出来,如果训练的话要加入行业独有的特征,比如银行业要加不良贷款拨付率,最终我们发现这样的训练效果没有我们在所有公司训练好,所以最终这个数据是弃用的。

  下面是我们做的比较有创造性的工作,就是我们加入了滑窗特征,我们的训练是滑窗训练。以2018年2季度营收为例,除了给公司2018年一季度的营收之外,我们还把它前四个季度的营收告诉给这个模型,告诉给模型的原因就是金融数据是一个时序性非常强的序列,我们告诉模型它的历史上的信息。然后同时我们还加入比率滑窗,就是上一季度除以再前一个季度的特征,也是给了四个季度。

  我们的训练方式是五年一滑,但是我们一共有三个验证集。比如在2018年3月份的验证集上,取它前五年的数据作为训练集。我们不仅仅是在2018年3月份做验证,我们营收的是夏季,但是2018年3月份是春季的营收,所以我们加入过去一年夏季的验证集,同时我们也引入2016年6月份。可能大家要问为什么加2016年6月份,2015年6月份加不加?我们是做了实验的,在这三个训练集上训练模型是最好的。

  我们在模型里面,我们有的模型是在三个验证集上训练然后求平均的效果,loss最低参数就是最优参数。但是我们也有模型它只在2018年3月份上做验证,我们愿意去冒险,去赌未来涨的时间跟这个一样。

  我们看一下我们各个模型它的得分,因为xgb是我们的主模型。在不同的模型选择上,它的得分在0.4到0.5之间波动。然后xg30(音)在0.45以上,stl是在0.45到0.5之间,DNN在整个数据集上由于它得分效果不好,所以最终没有用神经网络建设模型。

  得到这么多特征之后,怎么选哪些特征是重要的对我们是好的,我们创造一个我们认为比较合理的特征选择的方法,首先把训练集默认特征全开,多轮预跑后得到所有特征的重要性,机器自动挑选前一百或者前五十的特征,这样去看loss有没有降低,如果降低我们认为这些特征组合比较好的。如果等于1,一个特征的排序,这里面我们比较高兴地看到标红的几点,一个是递延所得税资产,一个是资产减值损失,这两个跑到前面了。如果你对财务报表比较熟悉,这两个特征是公司经常修改利润、隐藏利润的手段,我们很高兴模型学到了这种隐藏的特征,把上市公司的伎俩也学到了。最终在步骤3中,我们把之前提到的特征比较好的,挑选loss最低的特征个数,生成新的训练集,然后进行不推参数组的grid search,确定最优参数组。步骤3中,我们会把一些我们对金融市场的理解,比如申万一级行业分类,我们认为这个特征是一定要的,我们会默认开启排行统计财务报表里面重要特征。

  总结一下模型的训练步骤,首先在训练集的生成上,我们的数值滑窗特征不一定是四个季度,有可能是两个季度。我们的类别特征就是申万一级行业分类开不开启。时序模型无需训练,STL和Holt-Winters二者的简单平均loss在0.48左右。xgboost主模型,random forest作为辅助模型。划分三份验证集训练,还是分别仅划分一份训练集训练。特征选择上,我们多轮预跑,首先挑选最重要的特征。是否人工指定某些特征参与训练,在集成上搜索全行业的特征。模型导航上,最终我们部署了27个模型。模型融合上,真正我们之前谈到在某一个验证集上会验证的那些模型我们认为很冒险,所以我们加了个简单的信息分类进行融合。我们得到了27个模型,但是最终我们选,这是最终结果,提到哪个模型,我们最终是从行业的角度来看我们的模型。这是2018年3月份我们各个模型在不同行业上的表现,我们可以看到在化工这个行业上,它的模型4的效果是最好的,所以我们就用模型4去预测化工这个行业。机器设计上就用9,所有依此类推。

  总结一下我们的一些优势跟还没有做到的事情,我们的数据上进行了大量的数据处理,清理了噪声。我们加入了自己的数值滑窗特征还有比率滑窗特征,同时我们引入了行业的数据还有一些外部数据。训练方式上,我们用的是滑窗训练。同时我们在三个验证集上验证,增强了模型的能力。特征选择上,我们有一套可操作性强的机器自动选择特征的方法,模型选择上我们部署了多个模型,从行业的角度最终挑选模型。可扩展性,我们从这个比赛一开始我们就想把它写成一个主流的机器学习的流程框架,所以我们有了从数据预处理到最终模型保存的几乎的所有的模块,我们自定义了CV,实现了很多xgboost官方很多没有实现的功能,可扩展性极强。

  最终三点启示,假如最终还是预测财务相关数据,我们这个模型是可以直接迁移过去的没有问题。那我们还没有做的就是我们之前提到了按行业去训练,就实际上我们最终的特征个数最高也就600个特征,但实际上你要知道预测公司营收一般是各大券商的研究所他们优秀的研究员一个人盯一个行业的几家公司,他们去实地调研,他们可能对这个公司的了解、对这个行业的了解,如何把他们的知识纳入到我们的特征库里面,如果能够纳入进来,对我们的模型有质的飞跃。关于金融数据,首先是非结构化,噪声很多,我们的处理方式就是我们进行了大量的噪声处理,同时金融数据是一个时序高度相关的模型,所以我们加入了数值滑窗还有比例滑窗特征。金融数据未来的分布可能跟现在的分布不一样,我们在多个验证集上进行验证,进行模型的创新。

  谢谢大家!

  主持人:感谢我们的AL战队带来的分享,导师现在可以跟选手进行互动,有没有什么想要点评的地方都可以提出来。

  Vinod Chandrashekaran:(英)

  吴云:(英)

  薛伟:因为我们今天下午的第二道题目是信息抽取,这种信息抽取的技术对于非结构化的数据它是可以提取更多有价值的数据的,刚才你在未来的启示上有提到。你觉得具体怎么去做或者哪方面的数据,可能会对你这个题目有帮助?

  吴云:我本身是一个优矿的忠实用户,这个题目出来就是两个赛道我们都是想参加的,后来我做了一下取舍,因为时间上精力不够有限,我想把这个问题做好,所以我只参加了赛道一。这两个赛道结合到一起,赛道二提出来的结构化数据可以为赛道一服务的。首先我跟很多赛道二的选手进行了沟通,我刚刚并没有说赛道二是完全为赛道一服务,他们做的工作可以我们马上接着用。昨天跟赛道二的一些选手进行了沟通,实际上你会知道公司发布公告,很多公司他们发布的数据方式是很老的。举一些例子,比如老一辈的财务总监他们可能拍一张照片,把公司的财务报表传到网站上,大家去查数据下来。我们这个时候可以用CV的方式,把财务报表里面的表格定义出来,再把数据自定义到,同时把整个数据每个字段对应成什么样,这对于我们帮助很大的。假如交易所定义一个规范,就没有这些事情了,没有大家去查数据,可以在源头上做更高效率的事。本身对于结构化的努力是有必要的。

  薛伟:像这些财务数据或者是其他数据,其实都是市面上提供的比较多的一些已经结构化好的数据。那你觉得有哪些还没有结构化好的数据,你是可以利用起来的?

  吴云:这个比赛当中我们主要从国内量化平台下来的数据,实际上是比较干净的。比如说没有结构化好的就是在数据的本身我可以说一点,官方提供的财务数据上一个报表我们可以看到,因为上市公司会修饰之前公布的数据,2018年的公告会修饰2017年的数据,在公司的财务报表的信息里面我们会看到它有两条记录,有时候两条记录时间标志一样,选手没有办法判断,我应该选哪一条数据,除非加一个字段,这个爬虫是10点爬的还是11点爬的。这种数据如果能够结构化,节省很多事情。我没有办法给出一个标准答案哪些数据可以结构化,因为没有去想。

  刘硕凌:作为赛题一的现在比分上第一的选手,我想问你一个问题,像我们易方达有很多资深的投资人员和研究人员,我们日常的工作当中也会涉及到预测。刚刚你也提到,未来考虑把一些专家的经验融合到你的模型里面。我想问如果说我跟这些专家希望把你的能力融入到我们专家体系里面来,你觉得两种方式有什么区别吗?

  吴云:我们做这个比赛一开始,有一个朋友是农民木鱼(音)的排名很靠前的,我们咨询他的意见,他把他的库传给我,他们更新一万多指标,我们只有六百多个。他们出了一万多之外还去实地调研,他们知道这个公司这段时间之内,比如猪苗究竟怎么样,有没有疫情这种。这种数据你这边是拿不到数据的,因为我们的数据都是量化平台上公开的数据。他们的数据在研究所里面,首先是不会公开的。假如研究所愿意牵头,我们这个行业试一下机器学习,想把人力尝试替代一点,那我们就把这些比较好的研究员坐在办公室里,我们把我们认为哪个公司哪些特征是排名比如前五十、前一百、前五百的特征选出来,告诉我是什么,我们就把它写到我们的库里面,我觉得这样是可行的,我们的特征库不断健全,让我们的模型预测更准。即使这样做,有一点是研究员去公司实地考察是替代不了的,是机器干不了的。还有跟总裁、CEO对话人为的理解,也不是短期内解决的。把他们对于哪些特征重要对于行业预测,这个是没问题的。

责任编辑:常福强

热门推荐

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

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

7X24小时

Array
Array

股市直播

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