搜索
您的当前位置:首页正文

深度学习与金融市场——LSTM预测股价的正确方法

来源:二三娱乐

前面讨论过LSTM的预测模型,同学们百度也好,科学谷歌也好,能找到的LSTM的模型无非是在讨论模型本身,无非Seq2Seq、Seq2one等等各种,或者再加上Attention机制等等。总之,同学们把代码clone下来,发现不工作嘛!看起来拟合的很好的预测曲线,看起来很美好的回测数据,惨不忍睹的实盘结果。这是为什么呢? 前面我们就讨论过了,这里我们重新来回顾一下。

我们以30天的OHLCV数据作为输入来预测隔日的收盘价,我们用一个两层的LSTM模型,我们也加上Attention。示例代码如下:

model = Sequential()

model.add(LSTM(64, input_shape=(30, 5), return_sequences=True))

model.add(LSTM(64, return_sequences=True))

model.add(Dropout(0.2))

model.add(AttentionWithContext())

model.add(Dense(1))

那么这个模型的表现如何呢?不可否认,Attention机制的作用非常明显,更有利于模型去识别模式。但是我们前面讲过了,对于NLP任务,比如我们给出一个词语,”风和日“,用LSTM配合ATTENTION机制,很容易得出后面的字是”丽“。这种情况下准确率是很高的,再比如”皇帝“的”皇“字,后面可以是”皇帝“、”皇上“、”皇后“、”皇城“,再根据前后的上下文,很容易提高准确率。但是股价呢?”28.00“后面跟什么股价,有逻辑性吗?我们只知道可能在涨停价和跌停价之间,但是这之间有多少个可能值?我们以两位小数来说都有接近200个,首先即便我们说有pattern的存在可能性,那么预测值28.55和28.56的意义显然是不明显的。那么我们来提一种数据处理方法,这种方法我之所以说是正确的,是相对意义上的。大家可以做个实验来证明这种方法是否优于原先的方法,但是它仍然不能给你带来稳定的收益。没那么简单,就能找到,言归正传,我们需要对股票进行一些分析。

首先,我们需要了解股票的流通市值和股价之间的关系,或者有人会说了,还要考虑庄家的能力,当然,不同的资金大小自然是玩不同的股票。我们这里着重讨论的是股价如何去做归一化处理。如果只做一只股票,可以暂时不用考虑,但是如果是多只股票的股价做归一化,那么就要考虑了。比如同样是10块的股票,一个市值30亿,一个300亿,我们产生同样的涨幅所需要的资金是不一样的,我们在归一化股价的时候,需要有一个权重参数。

本文中我们暂且只讨论一只股票的情况,我们将我们的股票数据已经处理为30天X5个features。那么我们需要以这三十天来做归一化处理,我们这里的归一化,不同于一般意义上的归一化,我们类似于将数据处理为离散数据。事实股票的股价看起来虽然是离散的,但是事实上如果使用更小的时间周期,它就是连续的。连续的数据用LSTM去做预测显然是为难模型了。那么我们可以对股价进行分区,怎么来做呢,我们不要用股票的最低价和最高价来做归一化,为什么呢?对整体数据做归一化容易泄露信息给你的模型,没办法,模型确实是太擅长这个了!我们仅仅使用这只股票的流通市值,我们以1-1000作为股价基础x,从1开始将涨幅1%、2%、3%一直到10%这些节点作为分割节点,这些线段上的值我们以闭区间开头,开区间收尾。那么我们得到了10个区间,这10个区间我们归纳为10个离散数值,那么从1-1000,我们就有了固定数量的离散数值。然后我们将这只股票的股价对应到这个离散数值来,比如一只历史股价从5到28的股票,它的离散数值也是固定的。有同学就要问了,股价也不是一直就是涨的,这样做出来的离散值是有意义的吗?当然这种方法做出来的离散值是不靠谱的,尤其对于股价稍高的股票,但是并非这种思路不靠谱,而是我们需要一个调节参数,为什么?这就是我们提到流通市值的原因。如果我们单单用这种方法,后面的线段会越来越长。所以这样就会造成样本不足,预测精度太差,甚至超过涨停,也就是说你的模型给你的预测会是,可能涨停,也可能跌停,这不就废话一句了吗?回过头来说流通市值的事情,我们的股价涨起来之后,流通市值也随着涨起来了,那么我们在训练的时候需要去用search算法来确定一个系数,也就是说,当股价越高的时候,我们会对应的去乘以一个更低的系数,这样可以相对比较好的来抑制线段的长度。那么大家其实明白了,用这种方法其实是预测股票的涨跌幅,甚至有点像是涨跌幅分类,也就是说,每天的预测只有20种值,而之前的模型每天预测的可能性有200种左右。有同学要问了,那么1.9%和2.1%相差不大,却被预测成了不同值,但是这有什么关系呢?由于时间关系,后面的文章再继续来讨论实际如何去处理数据为这种模式,以及如何更好的生成离散数据,事实上,我们可以专门对A股所有的股价进行分析,如果你去做一下这个分析,你很快就有了思路。

微信公众号:QTechAI

Top