机器学习立功!一个模型告诉你新股能有几个涨停
A股一直有新股不败的神话。打新股几乎是稳赚不赔的生意。但是新股中签率一般只有万分之一到五之间。中国电信是最容易打中的新股之一,中签率也只有0.95%。既然新股如此难中,我们能否退而求其次,在二级市场上参与新股的投资?
实际上,作者提出这个问题,是受三峡能源的启示。三峡能源低价上市,上市第三天即打开涨停板,给了普通投资者一个非常好的参与的机会。如果当天上车,后面短短7个交易日,出现了几乎翻倍的行情。关键是,能否提前预测出新股的价格?如果不能,那么参与新股炒作,无疑只是一种赌博而已。
这篇文章探索了通过机器学习模型预测新股上市前几日表现的问题。我们通过模型预测新股上市前几日的收益率,分别就以下四种情况,做出了四个模型:
- 非注册制新股,预测有多少个涨停板,这样可以从第一天就参与进来。预测时间为上市前。
- 非注册制新股上市首日收盘后,预测还有多少个涨停板。有了真实交易数据,可以对前一个模型进行修正,预测结果可能更准确。
- 注册制新股,从上市之日起,不回调的情况下,最高涨幅是多少?预测时间为上市前。
- 同上,预测时间为上市首日收盘后。结合当日数据,进行修正。
在上市交易前进行预测的模型,我们称之为零日模型(zero),在上市后进行预测的模型,则称之为day one模型。
数据采集
新股数据可以从东方财富网上抓取。从网上抓取的数据中,我们主要关心的是以下几个字段:
- 发行总股数
- 网上发行总股数
- 顶格申购配市值
- 申购上限
- 发行价格
- 中签率
- 发行市盈率
- 行业市盈率
- 询价累计报价倍数和配售对象报价家数
上述字段为两种模型共用。
day one模型还需要的字段有:
- 上市首日开盘价
- 上市首日收盘价
- 上市首日涨幅
- 上市首日换手率
预测目标则分别是连续涨停的一字板数,以及最高涨幅(连续上涨至首次回调前)。这样我们大概能得到2700条左右的数据。这个数据量,也只能使用机器学习模型来进行训练了。
其中注册制新股的数据还要更少一点。所以在训练注册制新股预测模型时,我们将连续一字板涨停、及以后不回调情况下的上涨出现的最高点数据作为target,来进行训练,这样可以也能得到2000多条数据。
当然,涨停板有助涨助跌的效果,这样换算的数据,应该不是最佳的。
模型训练
首选的模型当然是xgboost。由于我们要预测的对象,无论是连续板个数,还是最高涨幅,都不具有类别属性,因此,这是一个回归问题,我们需要采用回归模型。
为了找出最佳超参数,我们直接使用了grid search的方法,并且在构造RandomizedSearchCV时,传入`refit=True`。这样一旦最佳超参数确立,RandomizedSearchCV还将使用最佳超参数训练出最佳模型。然后我们保存这个模型,即可用于此后的预测。
在sklearn的grid search方法中,带CV字样的,表明它使用了cross validation方法,这也是在样本量不足的情况下,常用的一种方法。
它的原理是,正常情况下,为了防止data leak,我们在训练前,将数据划分为train、validation和test三个子集。训练时只使用train和validation数据集,训练完成后,再用test来测试一下,该模型对从未见过的数据,其效果如何。
但这样做也会导致validation的数据无法用于训练,从而使得小样本数据量下,训练更是捉襟见肘。所以我们使用cross validation的方法,只将数据划分为train和test两个数据集,在train数据集中,再滚动划分train和validation子集。当一部分数据(n-1)/n用于训练时,另一部分数据(1/n)用以验证,然后再进行轮换。
上述代码中,使用了三分法(`cv=3`),即每次使用1/3的数据用以验证。在超参数指定的空间里,我们又将其划分为100个迭代进行参数搜寻。因此上面定义的`search`对象,实际上会进行300次训练。
如果有GPU可以用的话,在定义model时,可以加上这样的参数,以启用GPU:```model = XGBRegressor(tree_method='gpu_hist')```这样训练的速度要提升几倍(当然远不及深度学习那样提升得多)。
结果评估
我们先感性地认识一下预测与真实值之间的差异:
day-one模型预测结果
zero模型预测结果
可以看出,day-one模型由于有了真实交易数据,预测结果比较准确;zero模型也不算差。
不过,究竟这两个模型的误差有多大呢?我们还需要通过定量的方法来评估一下。
在训练时我们使用了RMSE(这是regressor默认的loss)。但在结果评估时,为了更直观地理解误差大小,我们使用了MAE(mean absolute error),即预测值与真实值之间的绝对值误差。
MAE
这个结果好得令人难以置信。特别是day-one模型,平均误差仅为0.48个板!当然,这个数据是在全体非注册制新股记录中获取的,它们有一部分已经参与了训练,可能发生data leak。但是,在训练结束后,通过计算在test数据集上的MAE,我们得到day-one模型的误差仅为0.45,确实是相当好的结果。
几点思考
股价预测是一件很难的事。为什么我们的模型可以很好地预测新股上市的涨停板个数?这很可能跟当前的发行制度有关。新股流通股的持有者主要是机构,机构关于定价,有自己的固有逻辑,因此,股价较为确定。这是股价可以预测的客观因素。只有当一件事有规律可寻,我们才能发现规律。如果股价真的是随机的,不确定的,那么无论用什么样的方法,都是无法预测的。
这件事的第二个意义就是,在股票市场上,一定存在着在某些条件下,证券有确定的定价的情况。因此,大力使用机器学习和深度学习的方法,完成可能找到这些场景下的套利机会。
第三点思考的则是一则坏消息。尽管涨停板的个数可以准确地预测,但对于散户来讲,新股即使是上市以后,仍然很难买到。这个模型的主要作用,一是对机构和有VIP通道的大户有用;二是对于中签的散户,可以提前知道大概应该何时下车。