股票市场具有高收益与高风险并存的特性,预测股票市场走势一直被普通股民和投资机构所关注。股票市场是一个复杂的动态系统,受多方面因素的影响,例如国家金额正常的调整、公司内部结构的调整、以及媒体舆论的渲染等。
之前尝试了例如决策树、贝叶斯网络、KNN、BP神经网络等算法,结合A股的市场特征,对股票市场的综合涨跌做预测分析,但是始终无法显式挖掘数据的深度特征,导致模型的正确率并不太高。
这里就采用一维CNN代替传统的BP人工神经网络进行建模,深度分析了数据的内在特征,对股票市场的预测效果做了探索,以便更好的预测股市的走势。
一、算法说明:
本次案例采用一维CNN算法做股票走势的预测。一般而言,CNN多用于图片或者语音数据处理,对于股票提供的数据信息,需要将数据转化成CNN的标准格式,这里使用了加窗采样的技术,每一个窗口代表一个样本,统计窗口内的涨跌次数作为此样本的标签,窗内涨多跌少,标记为1,反之则标记为0,因此股票走势问题转化为分类问题。
对于卷积神经网络通道的设计,这里采用相似指标作为不同通道,使用开盘价、最高价、最低价作为输入数据,对股票趋势建模分析,所以将open、high、low作为CNN的3个通道:
由于输入数据是一维数据,这里对卷积核以及池化操作的设计如下图所示。将股票不同属性作为不同通道来处理,并采用1*n的卷积核做卷积操作。另外在池化层,采用1*m的池化窗口,并保证每步处理后的结果仍然为一维数据。
二、数据说明和处理
爬取了2018年沪市A股的6500条数据作为本次分析的样本,具体数据如下:
本次分析数据包括开盘价(open)、最高价(high)、最低价(low)、收盘价以及成交量等股票历史数据,其中开盘价、最高价、最低价是股民最为关注的3大属性,将数据集中的这3个属性可视化,结果如下图:
为了保证建模的质量,需要对数据做预处理。首先是数据的归一化处理,这里采用的是最大/最小值归一是对原始数据的线性变换,使数据结果映射到[0,1]范围之内,使用的是sklearn库中的minmax_scale()函数。
接下来就是通过加窗处理,获得CNN模型的分析数据,这里采用了open、high、low这3个属性作为3个通道,窗口大小为90,即每90条数据进行一次加窗,如下图所示:
窗口大小设置为90,是因为通过几组实验比较得到较高正确率的区间大约在下图所示的两条竖线范围内,其中横坐标表示窗口大小,纵坐标表示样本分类的正确率:
三、模型训练
先建立一个3层的CNN进行训练,首先定义迭代次数、输入通道、隐藏层神经元数目等结构参数,其中隐藏层神经元数量为256,输入通道数为3,迭代次数为10000次,批次大小为5。
使用TensorFlow构建神经网络模型,卷积操作与池化操作分别使用了tensorflow.layers包中的convld()函数与max_poolingld()函数,具体的参数在这里就省略。
神经网络结构设计完成后,需要定义损失函数与优化器,这里使用交叉熵损失作为模型的损失函数,优化器选择Adam算法,这种算法可以更快收敛,并且把学习率设置为0.0001。
定义以上内容后,就可以开始模型训练了。
四、算法评估
这里采用混淆矩阵ROC/PR AUC作为模型效果的评估指标,最终PR正确率接近80%,达到了比较好的效果。结果如下:
网友评论