该项目包括:自 2000 年 1 月以来的股票价格数据。我们使用的是 Microsoft 股票。
将时间序列数据转换为分类问题。
- 使用 TensorFlow 的 LSTM 模型
- 由 MSE 衡量的预测准确性
可下载资源
GPU 设置(如果可用)
gpus = tf.config.experimental.li
RNN神经网络模型
循环神经网络(Rerrent Neural Network, RNN )出现于20世纪80年代,其雏形见于美国物理学家 J.J.Hopfield 于 1982 年提出的可用作联想存储器的互联网络一Hopfield 神经网络模型,循环神经网络对可变长度的序列数据有较强的处理能力。RNN对具有时间序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息。研究人员充分利用了RNN的这种能力,使深度学习模型在解决语音识别、语言模型、机器翻译以及时序分析等自然语言处理(NLP)领域的问题时有所突破。
循环神经网络层只有一个cell。这个cell 的权重是共享的,上页的图只是代表了一个 cell 在不同时序的状态,训练样本的每个sample只会通过一个 cell,然后不断更新它的权重。
这也是RNN模型也称为递归神经网路模型的原因。
说白了,就是一个神经元,如果是自然语言处理, 每个词就是一个时刻点,然后每个词或者说词向量被扔进RNN的神经元,每个时刻会产出一个 ,然后每个时刻都会遗留一些隐含信息到下一个时刻,下一个时刻不仅仅加工本时刻的数据,也会把前一个时刻的隐含信息拼接到自己前面,然后再乘以权重加上偏置,以这样的方式把整个句子的含义融合起来,机器也才能识别句子的含义。
读取数据集
有几种方法可以获取股市数据。以下数据集是使用 R BatchGetSymbols 生成的。
#加载数据集 # ref.date是数组的第一列 datang = read_csv('stopriceo.csv', header=0)
pd.pivot_table(datong)
我们的股票时间序列
我们为这个项目选择了微软(股票代码 MSFT)。
plt.rrms\['fgre.dpi'\] = 300 plt.plot(dfte\['MSFT'\])
时间序列显然不是平稳的,这是大多数预测模型所假设的属性。我们可以对时间序列应用变换,直到它达到平稳状态。Dickey-Fuller 检验使我们能够确定我们的时间序列是否具有季节性。
在这里,我们将应用对数转换来解决股票市场的指数行为。
其他有助于预测模型的转换:
- 移动平均线
- 差分化
df1 = datt\['MSFT'\] # 我们对数据集进行了对数转换 df1 = np.log(df1)
# 替代方案:我们可以对时间序列进行差分,从而去除季节性和平均值的变化。 # 创建一个差分序列 #dfdiff = diffe(df1,1)
预处理
在这里,我们对时间序列数据应用标准预处理。
在时间序列中,我们没有标签,但我们有时间序列的未来值,因此输出可以是 x(t),给定 x(t-1) 作为输入。这是将数据集构建为监督问题的一种实用(且直观)的方法。
scaer = ixSer(fatue_ange = (0,1)) scer.i_rrm(np.array(df1).rehape(-1,1))
随时关注您喜欢的主题
LSTM 模型
我们在这里实现了一个堆叠的 LSTM 模型。
LSTM 网络是一种递归神经网络,能够学习序列预测问题中的序列依赖性。LSTM 模型主要用于语音识别、自然语言处理的上下文中。最近,它们也被应用于时间序列数据的分析。
from tensorflow.keras.models import Sequential model.add(LSTM(50, retsueces = True #stacked LSTM model.add(Dropout(0.1))
history
plt.plot(history.history
表现
import math from sklearn.metrics import mean\_squared\_error
plt.rcParams\['figure.dpi'\] = 300 plt.rcParams\['savefig.dpi'\] = 300 #移位预测 lokback = ie_step trinPrectPot = numpy.empty_like(df1) traireditPlot\[:,:\] = np.nan in_y = scaler.nesetsfrm(df1) plt.plot
plt.plot(iv_y)
未来 30 天的预测
我们现在可以递归地应用该模型,通过估计第二天的 (t+1) 价格,然后再次将其作为输入来推断 t+2 天的价格,依此类推。这个预测当然会有更大的误差,因为每个预测的日子都会带来很大的不确定性。
然而,这个预测确实会告诉我们模型是否从过去的数据中学到了任何东西。
# 预测未来30天的情况 len(tesdata) # 1211 # 我认为在test_data中,最后一天是5月22日,例如 # 对于5月23日,我需要100个前一天的数据 x\_input = test\_data\[(len
while(i<ftue_teps): if(len(tep\_put)>ie\_sep): x_input = np.array(tepinut\[1:\]) x\_input = x\_input.reshap
plt.plot(dy\_ew, scaler.inverse\_transf
plt.plot(df3\[1000:\])
可下载资源
关于作者
Kaizong Ye是拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。
本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。
非常感谢您阅读本文,如需帮助请联系我们!