1. 说明
FDDC2018金融算法挑战赛01-A股上市公司季度营收预测,是天池最近的一个算法比赛,7月15是初赛提交的deadline,就最后两天了,也没法做得太细,看看怎么用最短的时间,抓住最关键的值,搭个简单的架子。
2. 数据分析
1) 预测目标
2018年二季度的营业收入。
2) 已知数据
题目提供的除了报表数据,提交格式以外,还有一些说明文档,这些文档都需要看一遍,很多对题目的疑问都可以从中找到答案。
3) 分析
营业收入REVENUE在利润表Income_Statement.xls中,先来看看这个文件,它把金融,保险,银行和一般工商业分成四个sheet分别存放。
下面分析一下其中占比最高的一般工商业(General Business)公司,数据约20万条左右。涉及3500多家公司。时间范围是2009年4月到2018年7月。
一般报表中的所有项目都是一起发布的,所以预测营收时,同期的其它数据也不知道。相对于用上期的其它数据预测本期的营收,还不如用历史的营收数据预测本期营收。
于是最简单的方法就是将其视为一个时间序列问题处理。用往期的营收,预测当期的营收,还可以参考:同比,环比作为对预测的验证。
4) 统计
画个直方图看看每支股票对应多少条数据,如下图所示,多一半的公司数据条数在80条左右,从2009-2017约十年时间,每年四季度出四个报表,再去掉约一半的修正数据,也就是说一半以上的公司包含十年以来的全部数据。
本来是想:将数据周期在5年以上的,使用周期趋势的预测方法,2-5年的,用同比预测(参考去年同期);2年以下的用环比预测(参考前一季度)。后来一看,需要预测的1500支股票,基本没有少于4年的,看来是多虑了。于是直接使用周期趋势的预测方法。
3. 处理缺失处理
数据有一些重复的情况,比如某支股票N在2017年一季报有两条,且数据不同,这是由于表中包含了起始发布的数据,和后来修改的数据,采取的方法是:最后发布的数据,还有一些重要,因为时间有限,暴力地使用了drop_duplicates。
另外,有一些月份数据缺失,按缺失数据的多少,参考同比、环比或者用均值填补,当然如果有时间,也可以在网上抓数据填充。主要是注意不要错位,导致周期混乱。我这次由于使用的是prophet模型,所以不存在这种问题,如果复赛平台不允许使用该库,就需要手工处理了。
4. 拟合时间序列曲线
先找一个比较有规律的,比如000009,方法是做log1后用Prophet模型回归。下图是对之后的三个季度做了预测。其中黑色点是实际值,蓝线是预测值,看起来还可以。
Q1是一季报,半年报S1包含了一二季,Q1包含了前三季,A是全年营收,一般来说,只把单个季度作为单位预测会更加准确一些,但本次我没做那么细。
模型使用的是Prophet,这个实在是特别简单。我觉得用其它方法真的很难在几个小时内完成一个比赛。预测1500个数据,我的机器大约训练半个小时左右。
5. 题外话
看到这个题好长时间了,但评测的次数太少,少了很多刷榜的的乐趣,所以直拖到了截止日期的最后两天才开始写,核心代码100多行,天太热,不想弄了,提交参与一下,顺便分享给大家,算是抛砖引玉吧。
虽然没花太多时间写代码,却也在这一个月里读了一些关于财报的科普书《手把手教你读财报》,《一本书读懂财报》,加上之前学过会计,对三张表有了些基本的了解。说实话,我觉得这两道股票相关的题出得也不是特别走心,像本题给出的数据,很容易从网上抓到。在其中主要以学习业务逻辑为主。除比赛以外,主要希望对之后的股票操作有一些帮助。
明天最后一天,各位加油哦!