Skip to content

linxing58/Stock-Predict-RNN

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Stock-Predict-RNN

看代码中v4版本即可

测试关注的重点

  1. 输入:尝试过各种各样的输入,除了基本的close price, open price, lowest price, highest price, 还有每天的成交量,成交金额,各种股票因子(均线等), 但是从最后的实验结果看,以及为了模型对数据的依赖更简单(找完整的数据不容易,维护成本高),最后直接选择四个基本的价格指标也能达到比较好的 结果。另外一个我纠结了很久的问题是,一只股票使用一个模型还是沪市使用一个模型,然后深市使用一个模型,还是A股就使用一个模型。如果一个股票使用 一个模型,我的结果是训练误差可以很小,但是预测结果不好,也就是过拟合了呗,所以最后我的想法就是使用一个模型, 测试结果也是这样更好。
  2. 数据预处理:尝试过不做任何预测的数据输入,当然这时候预测的也就是价格的绝对值,意料之中,结果不尽人意。然后使用z-score进行了数据的归一化, 数据量较大的情况下,效果还是不错的。最后还尝试了每天相对昨天的变化率,这种预处理对于较小的数据集也能达到较好的结果,但是我理解这种处理 有一定的局限性,因为四种价格的关系会容易被破坏,z-score是可以保留的。所以我最后还是选择了z-score
  3. 目标函数:尝试了均方误差,直接预测价格,这种方式有点不太好,因为股票趋势更重要,而且训练出来的结果看上去总是学习到前一天的趋势,不能结合 前n天的趋势,导致预测的结果从图像看只是先前价格的平移。所以最后还是先尝试了分类的方法,直接预测涨跌,如果这个可以做好,预测价格绝对值应该 会变得相对容易,而且使用softmax做分类能将概率引入模型,还是很棒的。
  4. 模型:神经网络中对序列的建模大多使用RNN,我这里测试过LSTM和直接使用RNN,看上去差别不是很大,但是RNN比较容易产生梯度异常值,导致BP时常常产生NAN,所以就使用了LSTM
  5. 经验之谈:最后实验了这么多次,我觉得一个重要的认识,并不是每天都是可以预测的,因此不要期待训练误差可以非常小,而应该关注我们可以预测的那些天的误差达到 足够小,这点非常关键,如果可以完全预测,也就是完全可以用一个函数拟合,想想都不是很科学
  6. 一点点实现的细节:关于数据的shuffle,因为股票有些特殊性,每只股票都是相对独立的,把他们处理成模型要求的输入的格式, 我没有想到特别好的办法能shuffle整个数据集,完全打乱不同股票的数据,后又要不增加实现复杂性,所以我最后shuffle的处理只是对每一只股票的数据进行了 独立的shuffle,股票之间没有进行穿插shuffle.

训练

  1. 我的数据全是存在本地mongodb上的,每天去更新,大概1G的数据量。训练时全部加载到内存,虽然一次加载预处理数据的时间较长,但是毕竟只是一次的计算, 后面不再更改,所以能提高训练时的速度。
  2. 在i5处理器无gpu的情况下训练,迭代一次,一只股票大概需要30s,4000只股票的话,算起来是没法让人接受的,把所有股票迭代一次需要20个小时左右。测试 一把1个月就over了
  3. 配置:CPU: i7, GPU: GTX1080,大约2秒迭代3次, 比上边的数据快了一个量级,只需要上边1/40的时间即可。不过我发现好像还是没有把gpu的性能全部 利用上,在部分环节还需要优化,尽量利用gpu时间

结果

应该最关心结果到底怎么样
训练:置信度在95%概率以上时,正确率可以达到95%以上 测试:测试数据集的误差,基本和训练正确率接近,可以说是非常好了
股票实战:有点费时间,每天都只能测试一次,实话说,表现不是很出色,一方面是预测的涨跌错误,不过这个错误率可以接受,麻烦的是预测的涨,涨得有点 太少,利润过低。

待解决的问题

  1. 训练时的性能优化, 把代码使用numpy的部分用tensorflow的函数替换, 可以更好利用GPU
  2. 训练时的数据shuffle问题,和训练集与测试集如何划分更为合理
  3. 尝试多目标训练,我觉得分类目标较经验误差目标能让模型学习特征的能力更强一些,但是也是有局限的,我们期待的不光是趋势的正确,还有趋势的大小 所以,可以尝试对目标训练
  4. 预测时间的选取,目前是选择预测第二天的收盘价,是不是可以预测第二天,第三天等的价格,让模型纳入的信息更多
  5. 实操策略,股票市场必须是当天买了,第二天才能卖出,因此为了规避风险,最好是在当天收盘时预测第二天价格,然后在收盘时进行交易。但是买入后, 卖出时间点的选择需要更多尝试,是固定时间点卖出还是价格事件触发卖出。

About

predict stock price use neraul network

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages