技术 | 如何使用机器学习预测股票价格

今天给大家带来的文章是关于如何使用机器学习预测股票价格。

推荐理由:

(1)详细讲解因变量的去噪和自变量的特征提取

(2)构建长短期记忆循环神经网络模型预测价格

(3)详细介绍神经网络训练的优化器和正则化处理

目录

1.获取股票价格数据

2.小波变换去噪

3.使用自动编码器提取特征

4.构建并训练LSTM网络模型

5.模型结果与讨论

 

对这一项目感兴趣的,可点击GitHub链接了解详情: https://github.com/VivekPa/AIAlpha

1.获取股票价格数据


通过yahoo finance的API,我们能够很轻松地获取股票价格数据。因此,只需调用pandas_datareader包的以下命令即可完成:

 

 

2.小波变换去噪

 

由于股票市场波动的复杂性,股票价格数据往往充满噪声,这可能会影响机器学习算法对价格趋势和市场结构的学习。因此,我们希望在保留数据趋势和结构的同时,消除一些随机性较强的噪声。相较于更加侧重生成基于频域的输出的傅立叶变换,我们选择小波变换作为价格去噪的工具,目的是更好地保存价格数据在时域上的特征。

小波变换与傅立叶变换关系密切,只是用来变换的函数不同,变换的方式也略有不同。具体公式如下:

小波变换具体流程如下:

1)数据采用小波变换

2)去除了超过一个标准偏差的系数

3)对新系数进行反变换,得到去噪后的数据

下面是小波变换如何对时间序列数据进行去噪的示例:


 

 

如上图所示,通过小波变换的去噪操作,我们提出了初始信号中存在的随机噪声。对于股票价格数据,我们同样希望进行类似的处理。借助Python的pywt包,我们可以通过如下代码轻松地实现小波变换去噪:


 

 


 

3.使用自动编码器提取特征

在传统的机器学习任务中,提取特性需要特定领域的专业知识。对于不熟悉股票交易技术指标的人来说,手动提取特征较为困难。我们也许可以尝试使用某些的技术指标,如移动平均值、异同移动平均线或动量等。但是,在缺乏技术交易经验的背景下,我觉得盲目使用技术指标不是一个好的策略。

然而,我们可以通过使用堆叠的自动编码器或其他机器学习算法(如受限玻尔兹曼机)来实现自动特征提取。我之所以选择使用堆叠式自动编码器,是因为与受限玻尔兹曼机的概率相比,自动编码器具有可解释性。

实际上,堆叠式自动编码器在压缩数据和重新生成数据方面非常擅长。我们感兴趣的是压缩数据的部分,因为它将重新生成数据所需的信息以某种方式编码为压缩形式。这表明这些压缩数据在某种程度上能够反映数据中重要的基本特征。下图是堆叠式自动编码器的网络结构:
 

 

原始输入数据的维度被压缩成编码层指定的神经元的个数,堆叠式自动编码器再根据编码层的输出重新生成原始数据。这迫使模型提取数据中的关键信息,也就是我们想要提取的特征。值得注意的是,由于没有输入-输出对,这个模型实际上是无监督学习模型,可以理解为输入和输出都是相同的。

利用Python的keras包可以很轻松的实现堆叠式自动编码器,具体代码如下:

 


基于2000年到2008年的去噪股票价格数据,我训练了提取特征堆叠式自动编码器。经过1000 epoch的训练后,RMSE降至0.9左右。然后,我使用该模型提取股票价格序列的特征。

4.构建并训练LSTM网络模型

 

LSTM模型在时间序列预测中最常见的模型之一,因此无需过多介绍。它从神经元内部输入门、遗忘门和输出门的结构获得了卓越的预测能力,使其能够理解和学习数据中的长期趋势。这对我们的股票价格预测尤其重要。我将在下面讨论一些我认为重要的细节。

 

优化器:

训练模型的优化器类型会极大地影响算法收敛到最小值的速度。此外,为了避免陷入局部最小值,在优化器中引入一些随机性有助于达到全局最小值。本文选择使用Adam优化器,因为Adam优化器结合了adagrad和rmsprop两个优化器的优点。

Adagrad优化器本质上对每个参数和每个时间步骤使用不同的学习速率。Adagrad的核心思想是,不经常出现的参数必须具有较大的学习速率,而经常出现的参数必须具有较小的学习速率。换句话说,Adagrad的随机梯度下降更新变成

其中

Adam是另一种通过考虑过去平方梯度的指数衰减平均值和过去梯度的指数衰减平均值来计算每个参数的自适应学习速率的方法。这可以表示为:

v和m可以分别作为梯度一阶矩和二阶矩的估计量,因此得到了名称自适应矩估计。研究人员观察到v和m的数值有向0逼近的趋势,因此通过如下公式抵消这种偏差:

最终,Adam优化器对参数的更新为

总结Adam优化器的优势如下

1)每个参数和每个迭代的学习速率都是不同的

2)学习率不会像Adagrad那样减少。

3)梯度更新使用加权的动量,进行统计意义更优的梯度下降。

 

正则化器:

训练模型的另一个重要方面是确保权重不会变得太大,避免过度拟合。因此,我们应该对大权重进行惩罚(大的定义将取决于使用的正则化器的类型)。我选择使用Tikhonov正则化,可以认为是以下最小化问题:

目标函数处于重构希尔伯特核空间中,确保了范数的概念的存在。这允许我们将范数的概念引入正则化器中,并通过对范数进行惩罚来避免较大权重。


 

随机失活:

一种新的防止过度拟合的方法是随机令神经网络中的部分神经元失活,这种方法迫使模型不要过度依赖于部分神经元。随机失活可以使神经网络更加稳健,有助于在样本外预测时取得更好的效果。以下是引入随机失活的效果,可以发现随机失活能降低模型预测的错误率:

上述所有分析都可以通过Python的keras包轻松地实现。这是模型的代码

 

5.模型结果与讨论

 

模型预测的结果如下所示,可以发现LSTM模型取得了较好的预测效果:

神经网络非常善于预测时间序列数据,虽然LSTM模型的结果较好,但我仍在寻找改善它的方法。在后续的研究计划中,我将考虑将价格数据与反映市场情绪的数据相结合,例如对推特或者新闻的文本进行情感分析,以期真正建立一个实用的模型,并可能从中开发出一个完整的交易策略。