一个人工智能应用的实验:前一交易日内涨停数变化与第二日开盘涨跌的关系(上)

本文尝试了一个人工智能在交易策略研发中的应用。

理论:市场在短时间内是受情绪驱动的。在同一个交易日日内,宏观经济、法令政策、公司基本面都不会有变化(或者说可以忽略不计)。投资者做出日内买卖决策的依据大部分来自于对日内价量行情变化的反应。换句话说,日内行情的发展可能有固定模式可循?

提取交易日内不同时段的涨停家数作为特征,使用机器学习算法,在历史数据上训练,来预测第二日开盘的涨跌。举例:取交易日内的十个时间节点(例如每半小时一次,含开盘、收盘)的涨停家数特征值分别为 X = [3,4,5,6,4,5,6,8,10,15],对应的Y是第二天开盘的涨跌0或1。用1000个交易日的历史数据进行拟合X和Y的关系。

为什么取10个采样时点(每半小时)呢?假设人类是对行情变化的反应时间是半小时。在现实中,10:00、10:30、14:00、14:30可能是变盘的时间。如果再细致一点,我们可以每15分钟采样一次,一直到3秒采样一次。简便起见本文我们先设定为半点钟一次。

因为不清楚X和Y两者之间存在什么样的关系,是线性的还是高阶,或者其他的关系模式。我们分别使用线性回归模型及多层神经网络模型进行拟合(线性回归模型作为一个基本的模型,而多层神经网络能够较好得反映出数据之间的非线性关系),并通过简单的模拟交易来测试模型的表现。

一、数据处理:

对从2010年1月到2016年12月的每一个交易日,全市场范围,10个时间点进行涨停统计,一共为1200多个交易日,统计出1200 * 10个时间点涨停的数量。这10个时间点分别为9:32分、9:56分、10:31分、11:01分、11:29分、13:29分、14:01、14:31、14:51、14:59。下图为处理之后的部分数据表格,其中“明开-今收”代表明日大盘开盘点数减去今日大盘收盘点数,“明开-今收/今收“表示第二天开盘的涨跌幅度。”

图1 时间点及当时涨停的数目的数据片段

二、探寻关系:

数据处理好之后,我们开始探寻日内10个时间涨停数目和第二天大盘开盘涨跌的关系。分别用线性回归及神经网络来进行处理。其中的1000个交易日进行模型训练,余下的数据进行模型验证。

1、利用线性回归来探寻两者关系

假设数据之间的关系是线性的,那么平常的线性回归方法就可以很好地阐述输入和输出数据的关系,模型为y = a0+a1*x1+a2*x2….an*xn

表1-1 通过线性回归得出的每个时间点的对应参数

进行线性回归有一个关键的数据为R-squared,此参数如果为1,说明数据的拟合程度好,为线性关系;参数数值越小,说明拟合的效果越不理想。在我们的线性回归中,此参数为0.02,说明拟合的效果不理想。再通过其他的视角看看预测的效果。

表1-2 通过线性回归进行预测,截取随机的数据片段

从表1-2可以看出,不但预测的数值不够准确,连涨跌的预测方向也是时对时错,可见预测的结果不理想。

表1-3基本数据的统计表

从表1-3可以看出,实际数据和预测的数据无论从最大值、最小值、还是均值,都存在比较大的差异。

最后,我们统计了涨跌方向预测的成功率为46.6%,比扔硬币的概率还低。从上面一系列简单的对比可以看出,用线性回归的方法来阐释两者的关系是不合适的。

2、利用多层神经网络来探寻两者关系

图4 多层神经网络的示意图

我们训练的是2层Hidden Layers的MLP,neuron数量分别为6,3,最大循环次数为500000,足以使cost function降到平缓的最低区域。得出训练模型后,进行预测并验证。hidden layer的数目以及每层中neuron的数量是可以不断调试的,直到发现更好的配比。

表2-1 通过神经网络进行预测的结果,截取随机数据片段

表2-2基本数据的统计表

我们统计了涨跌方向预测的成功率为57.04%,成功率相比之前提高了一些。同时,从表2-1和表2-2可以看出,MLP模型不但提高了预测涨跌方向的正确性,而且提高了预测涨跌幅度的正确性。

三、简单的模拟交易

我们拟定一个简单的交易模式,如果MLP模型预测第二天开盘是涨,则当天尾盘买入沪深300ETF指数基金,第二天早盘开盘不管高开低开都立马卖掉;如果预测第二天开盘是跌,则不采取任何行动。模拟交易结果的总结,总交易次数为135次,赚取的指数点数一共为681点。

结果是令人失望的:

图3-2 模拟交易结果的时间走势图

黄线表示大盘的走势,蓝线表示策略的盈亏,可见虽然策略是盈利的,但是跑输大盘很多。

四、小结:

我们利用线性回归和多层神经网络模型探索了前一交易日涨停家数与第二日早盘开盘的关系,结论是线性回归不适合对此数据进行拟合;MLP模型相比线性回归,效果相对更好,但是预测的效果也不理想。

五、问题和改进空间

- 涨停数统计方式有问题:应该统计自然涨停数,去掉开盘涨停数;

- 应该加入跌停数的特征,10个时点取20个特征值;

- 由于市场挂牌数量是变化的,涨跌停数量应该统一去除这个因素;

- 提高采样频率,比如每10分钟采样一次,全天25个时点;

- 对输出值Y细化,而不是简单的输出涨和跌。可以同样把Y的值分成十个区间作为输出来训练。

- 对应Y值落在不同的区间,使用不同的仓位进行交易;

- 使用精确的分类器比如SVM等;

我们将在下篇做出进一步改进。

量化交易员君的个人微信号(quantcity01)。我们定期组织一线交易员分享会,也面向证券、期货行业提供量化系统解决方案,欢迎交易员勾搭~ (添加时请注明所在机构名称)