思路
经过一段时间对LSTM的学习,大概了解了LSTM的运作规律。因此尝试运用LSTM预测股市走势。
这篇文章是对于该方法的一种初步尝试,然而问题显而易见。
- 该算法将指数数据未经任何处理就丢到了LSTM里面,这是“不可能”学习出任何知识的。由于神经网络类机器学习算法是基于线性组合以及非线性函数,因此能够学习出“较大”,“正”,“上升”这一类描述,但无法学习出“区间最大值”,“日线高点出现”,“指数线交叉”。所以我们需要做的应该是将这类信息人工处理后丢入LSTM!
尝试1:上证指数K线4值
直接输入上证K线的open,close,high,low,预测1/5/10日收盘价涨跌.
正确率最后能够到达65%左右。
奇怪的是用GRU和LSTM效果没有显著的差别,感觉远期的信息并没有被学习进去……
全部都学成跌了,当然没有差别咯……算了一下,MCC相关系数仅有0.02,等于随机预测.
由于之前使用的是涨跌幅的log的平方和作为loss函数,可能确实在精度上也会有问题。
是不是将label设为涨跌幅log平方的符号函数会更好一些呢?
最后,模型准确率平均在51%左右,且在训练过程中有时候会跳到49%,相关性也会在有些时候呈现负相关,具体来说就是没有训练处结果。
尝试2:加入更多数据
测试数据
随机选择股票
000416 000996 600096 600291 600695 000416 000996 600096 600291 600695 000951 300143 600155 600354 600785
收集2010-2017的日线数据进行分为训练集与测试集。
指标选择
由最初的四个数据拓展到更多的指标
- open 开盘价
- close 收盘价
- high 最高价
- low 最低价
- volume 成交量
- sh 上证指数
- sz 深证成指
- hs300 沪深300
- cyb 创业板指数
- ma_5 5日均线
- ma_10 10日均线
- ma_20 20日均线
- ma_60 60日均线
- macd_dif macd短线
- macd_ema macd长线
- macd_macd macd柱状线
- rsi rsi指数
- adx adx指数
- cci cci指数
将指数分组进行归一化,例如将ochl和均线值统一进行归一化,指数独自归一化。
分类函数
之前是将误差平方和作为loss函数,后来发现这在二分类问题中非常的不优美。
对于典型的二分类问题
loss =- (X * log(X’) + (1-X)*log(1-X’))
作为误差函数会更加容易收敛。
分组训练
之前的分组训练是直接取相邻区间,仔细想想确实bug非常严重,本身分batch就是为了防止出现边界数据,导致将梯度影响错误的方向。这里我们改成使用随机batch_size个数据使得训练表现好了一些
优化指标
之前指标发现实际上大盘数据对于一只股票并没有太大的用处,因为我不知道这个股票的类型,因此考虑增加:
- is_sh 是否为沪市
- is_sz 是否为深市
- is_cyz 是否为创业板
至此,已经可以将模型准确率提高至53%
修改分类函数
将之前的二分类改为三分类,其中表示随机波动的分类0产生的所有结果不计入loss函数。准确率提高至55%,不过这个55%的含义与之前不同,这里计算的只是非零分类的准确率。