LSTM在股票市场预测的应用

不那么简单的股票市场 (THE NOT-SO-SIMPLE STOCK MARKET)

我们在精确的逐点基础上预测了几百个正弦波的步长。因此,我们现在可以在股市时间序列中做同样的事情并立即获利,对吗?不幸的是,在现实世界中,这并不是那么简单。

与正弦波不同,股票市场时间序列不是可以映射的任何特定静态函数。描述股票市场时间序列运动的最佳属性是随机游走。作为随机过程,真正的随机游走没有可预测的模式,因此尝试对其进行建模将毫无意义。幸运的是,许多方面都在持续争论说股票市场不是一个纯粹的随机过程,这使我们可以理解时间序列可能有某种隐藏模式。正是这些隐藏的模式,LSTM深度网络是预测的主要候选者。

此示例将使用的数据是数据文件夹中的sp500.csv文件。此文件包含2000年1月至2018年9月的标准普尔500股票指数的开盘价,最高价,最低价,收盘价以及每日交易量。

在第一个例子中,我们将仅使用Close price创建单维模型。调整config.json文件以反映新数据,我们将保持大部分参数相同。然而,需要做出的一个改变是,与只有-1到+1之间的数值范围的正弦波不同,收盘价是股票市场不断变化的绝对价格。这意味着如果我们试图在不对其进行标准化的情况下训练模型,它就永远不会收敛。

为了解决这个问题,我们将采用每个n大小的训练/测试数据窗口并对每个窗口进行标准化以反映从该窗口开始的百分比变化(因此点i = 0处的数据将始终为0)。我们将使用以下等式进行归一化,然后在预测过程结束时进行去标准化,以获得预测中的真实世界数:

n =价格变化的标准化列表[窗口]
p =调整后的每日回报价格的原始清单[窗口]

正常化:

反规范化:

我们已将normalise_windows()函数添加到DataLoader类以执行此转换,并且配置文件中包含布尔规范化标志,表示这些窗口的规范化。

随着窗口的标准化,我们现在可以运行模型,就像我们针对正弦波数据运行模型一样。 但是,我们在运行这些数据时做了一个重要的改变; 而不是使用我们框架的model.train()方法,而是使用我们创建的model.train_generator()方法。 我们这样做是因为我们发现在尝试训练大型数据集时很容易耗尽内存,因为model.train()函数将完整数据集加载到内存中,然后将规范化应用于内存中的每个窗口, 容易导致内存溢出。 因此,我们使用了Keras的fit_generator()函数,允许使用python生成器动态训练数据集来绘制数据,这意味着内存利用率将大大降低。 下面的代码详细说明了用于运行三种类型预测的新运行线程(逐点,完整序列和多序列)。

如上所述,在单个逐点预测上运行数据可以非常接近地匹配返回的内容。但这有点欺骗性。经过仔细检查,预测线由奇异的预测点组成,这些预测点在它们后面具有整个先前的真实历史窗口。因此,网络不需要了解时间序列本身,除了每个下一个点很可能不会离最后一点太远。因此,即使它得到错误点的预测,下一个预测也将考虑真实的历史并忽略不正确的预测,然后再次允许产生错误。

虽然这对于下一个价格点的精确预测而言最初听起来并不乐观,但它确实有一些重要的用途。虽然它不知道确切的下一个价格是多少,但它确实能够准确地表示下一个价格的范围。

此信息可用于波动率预测等应用(能够预测市场中高或低波动的时段对特定交易策略非常有利),或远离交易这也可用作良好指标用于异常检测。可以通过预测下一个点,然后将其与真实数据进行比较来实现异常检测,并且如果真实数据值与预测点显着不同,则可以针对该数据点提出异常标记。

S&P500 point-by-point prediction

继续进行完整的序列预测,似乎这被证明是对这种类型的时间序列最不有用的预测(至少使用这些超参数训练这个模型)。 我们可以看到预测开始时的轻微碰撞,其中模型遵循某种类型的动量,但是很快我们可以看到模型确定最佳模式是收敛到时间序列的某个均衡。 在这个阶段,这可能看起来并没有提供太多价值,但是平均回归交易者可能会在那里宣称该模型只是找到价格序列在波动率被消除时将恢复的平均值。

S&P500 full sequence prediction

最后,我们对该模型进行了第三种预测,我将其称为多序列预测。 这是完整序列预测的混合,因为它仍然使用测试数据初始化测试窗口,预测下一个点,然后使用下一个点创建一个新窗口。 但是,一旦它到达输入窗口完全由过去预测组成的点,它就会停止,向前移动一个完整的窗口长度,用真实的测试数据重置窗口,然后再次启动该过程。 实质上,这为测试数据提供了多个趋势线预测,以便能够分析模型能够获得未来动量趋势的程度。

S&P500 multi-sequence prediction

我们可以从多序列预测中看出,网络似乎正确地预测了绝大多数时间序列的趋势(和趋势幅度)。 虽然不完美,但它确实表明了LSTM深度神经网络在顺序和时间序列问题中的有用性。 通过仔细的超参数调整,肯定可以实现更高的准确性。

多维LSTM预测

到目前为止,我们的模型仅采用单维输入(在我们的S&P500数据集的情况下为“收盘价”)。 但是对于更复杂的数据集,序列自然存在许多不同的维度,可用于增强数据集,从而提高模型的准确性。

对于我们的S&P500数据集,我们可以看到我们有五个可能的维度,包括开盘价格,高,低,收盘价格和交易量。 我们开发的框架允许使用多维输入数据集,因此我们需要做的就是编辑列和lstm第一层input_dim值以适当运行我们的模型。 在这种情况下,我将使用两个维度运行模型; “收盘价格”和“交易量”。

S&P500 multi-dimensional multi-sequence prediction using "Close" & "Volume"

我们可以看到第二个 “收盘价格”维度和“交易量”一起添加,输出预测变得更加细化。 预测趋势线似乎更准确地预测即将到来的小幅下跌,不仅是从一开始的主流趋势,趋势线的准确性在这种特殊情况下似乎也有所改善。

总结

虽然本文的目的是在实践中给出LSTM深度神经网络的一个工作实例,但它只是触及了它们在顺序和时间问题中的潜力和应用的表面。

在撰写本文时,LSTM已成功应用于众多现实问题,从此处所述的经典时间序列问题到文本自动纠正,异常检测和欺诈检测,以及正在开发的自动驾驶汽车技术的核心。

目前使用上述vanilla LSTM存在一些局限性,特别是在使用金融时间序列时,该系列本身具有很难建模的非平稳特性(尽管使用贝叶斯深度神经网络方法已经在解决时间序列的非平稳性问题取得了进展)。同样对于一些应用,还发现基于注意力的神经网络机制的新进展已经超过LSTM(并且LSTM与这些基于注意力的机制相结合也优于其自身)。

然而,截至目前,LSTM在更经典的统计时间序列方法上提供了显着的进步,能够建模非线性的关系并且能够以非线性方式处理具有多个维度的数据。

我们开发的框架的完整源代码可以在以下GitHub页面上的MIT许可证下找到(我们要求信用证明显示为“Jakob Aungiers,Altum Intelligence ltd”,无论此代码在何处重复使用):https: //github.com/jaungiers/LSTM-Neural-Network-for-Time-Series-Prediction

参考资料

[1] 英文原文地址

你可能感兴趣的:(LSTM在股票市场预测的应用)