LSTM介绍
LSTM是具有时间特性的神经网络,我们利用LSTM预测时间序列——股价。
从文本到股价,LSTM的输入特征和网络结构都有哪些变化呢?
我们先看一个简单的RNN结构。与普通的全连接层神经网络的权重更新沿着一层层隐藏层网络不同,RNN的权重更新有两个方向,一个是像传统神经网络沿着输入层隐藏层更新,即图中的U和V的权重矩阵,一个是沿着St-2,St-1,St,St+1...的状态层更新,即途中的W权重矩阵。
对于传统的神经网络,假如输入数据的格式是[100,5],即100个样本,特征是5,那么输入神经元的个数是[5]
对于RNN处理的时间序列,应该是什么样的呢?
首先我们知道RNN可以处理文本信息。例如,这句话。
我昨天上学迟到了
利用python的jieba分词
jieba.cut('我昨天上学迟到了')
得到这样的句式结构。
我 昨天 上学 迟到 了
那么实际上输入输出是这样的:
输入 | 标签 |
---|---|
s | 我 |
我 | 昨天 |
昨天 | 上学 |
上学 | 迟到 |
迟到 | 了 |
或者
input: [“Jack”, “and”, “Jill”, “went”], label: [“up”]
input: [“and”, “Jill”, “went”, “up”], label: [“the”]
input: [“Jill”, “went”, “up”, “the”], label: [“hill”]
input: [“went”, “up”, “the”, “hill”], label: [“.”]
做向量化和one-hot编码得到,这里的one-hot不是真正的编码,是我举例的,真正的维度要高得多,这里假设是10维
输入 | 标签 |
---|---|
0000000001 | 0000000010 |
0000000010 | 0000000100 |
0000000100 | 0000001000 |
0000001000 | 0000010000 |
0000010000 | 0000100000 |
输入数据的格式(100,20,10)
100是序列个数,一篇文章句子的个数。
20是时间步,就是句子最大能容纳的词数,词数少的句子补齐。
10是每个时间步的维度,就是词向量维度。
开始建模
数据:香港恒生指数
指标:'Closing Price', 'Open Price', 'High price', 'Low Price','Volume','MACD', 'CCI', 'ATR', 'BOLL_MID', 'EMA20','MA10','MTM6', 'MA5','MTM12', 'ROC', 'SMI', 'WVAD', 'US Dollar Index','HIBOR'
日期:2008-07-02' 至 '2016-09-30'
首先,定义一个求t-5,t-4,t-3,t-2,t-1时刻的特征指标的函数,也就是之前的19维特征,现在变成了19*(5+1)=114维的特征。+1是因为考虑t时刻本身的特征。
def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
#if n_in=2, t-2,t-1,t
n_vars = 1 if type(data) is list else data.shape[1] #return feature numbers
df = DataFrame(data)
cols, names = list(), list()
# input sequence (t-n_in, ... t-1)
for i in range(n_in, 0, -1):#print n_int to i in inverted order[n_in,n_in-1,...,1]
cols.append(df.shift(i))
names += [('var%d(t-%d)' % (j+1, i)) for j in range(n_vars)]
# forecast sequence (t, t+1, ... t+n)
for i in range(0, n_out):
cols.append(df.shift(-i