Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >预测金融时间序列——Keras 中的 MLP 模型

预测金融时间序列——Keras 中的 MLP 模型

作者头像
磐创AI
发布于 2021-11-11 02:06:30
发布于 2021-11-11 02:06:30
5.5K10
代码可运行
举报
运行总次数:0
代码可运行

作者 | shivani46

编译 | Flin

介绍

本文的目的是展示使用时间序列从数据处理到构建神经网络和验证结果的过程。作为一个例子,金融系列被选择为完全随机的,一般来说,如果传统的神经网络架构能够捕获必要的模式来预测金融工具的行为,那就很有趣了。

本文中描述的管道可以轻松应用于任何其他数据和其他分类算法。

金融时间序列预测的数据准备

例如,以像苹果这样的普通公司2005年至今的股价为例。可以从Yahoo Finance以.csv格式下载(https://finance.yahoo.com/quote/AAPL/history?period1=1104534000&period2=1491775200&interval=1d&filter=history&frequency=1d)。

让我们加载这些数据,看看是什么样子。

首先,让我们导入我们需要下载的库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pylab as plt
import numpy as np
import pandas as pd

现在,只需读取数据即可绘制图形,不要忘记使用 [:: – 1] 翻转数据,因为 CSV 的数据是倒序的,即从 2017 年到 2005 年:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data = pd.read_csv('./data/AAPL.csv')[::-1]
close_price = data.ix[:, 'Adj Close'].tolist()
plt.plot(close_price)
plt.show()

它看起来几乎像一个典型的随机过程,但我们将尝试解决提前一天或更长时间预测的问题。“预测”的问题必须首先更接近机器学习的问题来描述。

我们可以简单地预测市场中股票价格的变动——或多或少——这将是一个二元分类问题。

另一方面,我们可以仅预测第二天(或几天后)的价格值或与前一天相比第二天的价格变化,或这种差异的对数——即,我们要预测一个数字,这是一个问题回归。但是在解决回归问题时,你将不得不面对数据归一化的问题,我们现在将考虑这个问题。

无论是在分类的情况下,还是在回归的情况下,我们都会以某种时间序列窗口(例如,30 天)作为入口,尝试预测第二天的价格走势(分类),或者变化(回归)的价值。

金融时间序列的主要问题是它们根本不是平稳的。

期望值、方差、平均最大值和最小值在窗口中随着时间的推移而变化。

图 1

并且以友好的方式,我们不能根据我们的窗口使用这些值的极大极小或z分数归一化,因为如果在 30 天内有一些特征,它们也可以在第二天改变或在我们窗口的中间改变。

但是如果你仔细观察分类问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Dat = [(np.array(x) - np.mean(x)) / np.std(x) for x in Dat]

对于回归问题,这是行不通的,因为如果我们还减去平均值并除以偏差,我们将不得不为第二天的价格值恢复这个值,而这些参数可能完全不同。

因此,我们将尝试两种选择:

对原始数据进行训练,并尝试通过带走不那么感兴趣的第二天的预期或方差来欺骗系统。我们只对向上或向下移动感兴趣。因此,我们将冒险并使用 z 分数标准化我们的 30 天窗口,但仅限于它们,不会影响“未来”的任何内容:

第二天价格的百分比变化——pandas将帮助我们解决这个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
close_price_diffs = close.price.pct_change()

看起来像这样,正如我们所看到的,这些数据在没有任何具有统计特征的操作的情况下获得,已经处于 -0.5 到 0.5 的限制范围内:

将训练样本进行划分,我们取前85%的时间窗口用于训练,后15%用于检查神经网络的运行情况。

因此,为了训练我们的神经网络,我们将收到以下 X、Y对:

30 天收盘价和 [1, 0] 或 [0, 1],具体取决于二进制文件的价格值分类增加或减少;30 天的价格百分比变化和回归的第二天变化。

神经网络架构

我们将使用多层感知器作为基本模型。让我们把Keras作为一个实现框架——它非常简单、直观,你可以用它来实现相当复杂的计算图,但到目前为止我们还不需要它。

一个基本的网格由输入层的 30 个神经元、64 个神经元(第一个隐藏层)实现,然后是批量归一化——建议将它用于几乎所有多层网络,然后是激活函数(ReLU) 已经被认为是不正常的,所以让我们采取一些像 LeakyReLU 这样的时髦的函数。

在输出端,我们放置一个神经元(或两个用于分类),根据任务(分类或回归),它要么在输出端有一个 softmax,要么让它没有非线性,以便能够预测任何值。

分类代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential()
model.add(Dense(64, input_dim=30))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(2))
model.add(Activation('softmax'))

对于回归问题,激活参数最后应该是“线性”。

接下来,我们需要定义误差函数和优化算法。在不深入讨论梯度下降变化的细节的情况下,让我们以步长为 0.001 的 Adam 为例;分类的损失参数需要设置为交叉熵 ——'categorical_crossentropy',回归的损失参数需要设置为均方误差——“mse”。

Keras 还允许我们非常灵活地控制训练过程,例如,如果我们的结果没有改善,最好减少梯度下降步骤的值——这正是 Reduce LR On Plateau 所做的,我们将其添加为回调到模型训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.9, patience=5, min_lr=0.000001, verbose=1)
model.compile(optimizer=opt, 
              loss='categorical_crossentropy',
              metrics=['accuracy'])
Neural network training
history = model.fit(X_train, Y_train, 
          nb_epoch = 50, 
          batch_size = 128, 
          verbose=1, 
          validation_data=(X_test, Y_test),
          shuffle=True,
          callbacks=[reduce_lr])

学习过程完成后,最好在屏幕上显示误差和准确度值的动态图表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
plt.figure()
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='best')
plt.show()
plt.figure()
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel(‘acc’)
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='best')
plt.show()

在开始训练之前,我想提请你注意一个重要的点:有必要在此类数据上学习更长时间的算法,至少 50-100 个 epoch。

这是因为,如果你训练 5-10 个 epochs 并看到 55% 的准确率,这很可能并不意味着你已经学会了在分析训练数据时找到模式,你将看到只有 55 % 窗口用于一种模式(例如增加),其余 45% 用于另一种模式(减少)。

在我们的例子中,53% 的窗口属于“减少”类,47% 属于“增加”类,因此我们将尝试获得高于 53% 的准确度,这表明我们已经学会了寻找符号。

在准备训练样本时,原始数据(例如收盘价和简单算法)的准确性太高很可能表明模型过度拟合了。

预测金融时间序列 - 分类问题

让我们训练我们的第一个模型并查看图表:

可以看到,测试样本的准确率一直保持在±1值的误差,训练样本的误差下降,准确率增加,说明过拟合了。

让我们看看更深层次的两层模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential()

model.add(Dense(64, input_dim=30))

model.add(BatchNormalization())

model.add(LeakyReLU())

model.add(Dense(16))

model.add(BatchNormalization())

model.add(LeakyReLU())

model.add(Dense(2))

model.add(Activation('softmax'))

以下是它的工作成果:

大致相同的图片。当我们面临过拟合时,我们需要为我们的模型添加正则化。

在正则化的过程中,我们对神经网络的权重施加了一定的限制,使得值不会出现大的散布,尽管有大量的参数(即网络权重),但其中一些被翻转,为简单起见,设置为零。

我们将从最常见的方式开始——在权重总和的L2 范数中向误差函数添加一个附加项,在Keras 中 这是使用 keras.regularizers.activity_regularizer 完成的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential()
model.add(Dense(64, input_dim=30,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(16,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(2))
model.add(Activation('softmax'))

这个神经网络在误差函数方面学习得更好一点,但准确性仍然受到影响:

在处理具有大量噪声或随机性质的数据时,经常会遇到诸如误差减少而不是准确度降低这样的奇怪效果——这是因为误差是基于交叉熵值计算的,这可能会降低,而准确度是具有正确答案的神经元的指标,即使错误发生变化,也可能保持不正确。

因此,值得使用近年来流行的 Dropout 技术为我们的模型添加更多的正则化——粗略地说,这是在学习过程中随机“忽略”一些权重,以避免神经元的共同适应(以便他们不学习相同的功能)。代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model = Sequential()
model.add(Dense(64, input_dim=30,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dropout(0.5))
model.add(Dense(16,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(2))
model.add(Activation('softmax'))

如你所见,我们将在训练期间以 50% 的概率为每个权重“丢弃”两个隐藏层之间的连接。通常不会在输入层和第一个隐藏层之间添加 dropout,因为在这种情况下,我们将从简单的噪声数据中学习,并且它也不会在输出之前添加。当然,在网络测试期间,不会发生掉线。这样的网格如何学习:

如果你稍早停止训练网络,我们可以在预测价格变动方面获得 58% 的准确率,这肯定比随机猜测要好。

预测金融时间序列的另一个有趣且直观的时刻是,第二天的波动具有随机性,但是当我们查看图表、蜡烛图时,我们仍然可以注意到接下来 5-10 天的趋势。

让我们检查一下我们的神经元是否可以处理这样的任务——我们将使用最后一个成功的架构预测 5 天后的价格走势,我们将训练更多的 epoch:

如你所见,如果我们足够早地停止训练(超时,仍然会出现过拟合),那么我们可以获得 60% 的准确率,这是非常好的。

预测金融时间序列——回归问题

对于回归问题,让我们采用我们最后一个成功的分类架构(它已经表明它可以学习必要的特征),移除 Dropout,并进行更多迭代训练。

此外,在这种情况下,我们不仅可以查看误差值,还可以使用以下代码直观地评估预测质量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pred = model.predict(np.array(X_test))
original = Y_test
predicted = pred
plt.plot(original, color='black', label = 'Original data')
plt.plot(predicted, color='blue', label = 'Predicted data')
plt.legend(loc='best')
plt.title('Actual and predicted')
plt.show()
The network architecture will look like this:
model = Sequential()
model.add(Dense(64, input_dim=30,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(16,
                activity_regularizer=regularizers.l2(0.01)))
model.add(BatchNormalization())
model.add(LeakyReLU())
model.add(Dense(1))
model.add(Activation('linear'))

让我们看看如果我们在“原始”调整收盘价上训练会发生什么:

从远处看起来不错,但是如果我们仔细观察,我们会发现我们的神经网络只是在其预测方面落后,这可以被视为失败。

对于价格变化,结果是:

有些值预测得很好,有些地方的趋势是正确猜测的,但总的来说 - 马马虎虎。

讨论

原则上,结果通常乍一看并不令人印象深刻。确实如此,但我们在没有太多预处理的情况下,在一维数据上训练了最简单的神经网络。有许多步骤可以让你将准确度提高到 60-70% 的水平:

  • 不仅要使用收盘价,还要使用我们 .csv 中的所有数据(最高价、最低价、开盘价、收盘价、成交量)——也就是说,注意任何给定时间的所有可用信息
  • 优化超参数——窗口大小、隐藏层中的神经元数量、训练步骤——所有这些参数都是随机取的,使用随机搜索,你可以发现,也许,我们需要查看 45 天前和以较小的步长学习更深的网格。
  • 使用更适合我们任务的损失函数(例如,为了预测价格变化,我们可以找到不正确符号的神经函数,通常的 MSE 对数字的符号是不变的)

结论

在本文中,我们应用了最简单的神经网络架构来预测市场的价格走势。这个管道可以用于任何时间序列,主要是选择正确的数据预处理,确定网络架构,并评估算法的质量。

在我们的例子中,我们设法使用前 30 天的价格窗口以 60% 的准确率预测了 5 天的趋势,这可以被认为是一个很好的结果。价格变化的定量预测结果证明是失败的,对于这项任务,建议使用更严肃的工具和时间序列的统计分析。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-11-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 磐创AI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
大佬们能否有可能学习一下你们的源代码呀?我快被dimension搞疯了
大佬们能否有可能学习一下你们的源代码呀?我快被dimension搞疯了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
神经网络在算法交易上的应用系列——时序预测+回测
本期翻译:LIN | 公众号翻译部 这是公众号关于神经网络在金融领域特别是算法交易上的一个连载系列:
量化投资与机器学习微信公众号
2019/02/26
1.8K0
神经网络在算法交易上的应用系列——多元时间序列
之前的文章已经介绍了几种预测时间序列的方法:如何规范化数据,以实值或二进制变量的形式进行预测,以及如何处理高噪声中的过拟合。在上一篇文章中,我们只用了经过一些转换的收盘价,如果我们考虑历史数据中的最高价、最低价、开盘价、成交量,将会发生什么?这引出我们处理多元时间序列,每个时间点不止一个变量。在例子中,我们将使用整个OHLCV元组。
量化投资与机器学习微信公众号
2019/02/26
1.5K0
基于Python TensorFlow Keras Sequential的深度学习神经网络回归
前期一篇推文(基于Python TensorFlow Estimator DNNRegressor的深度学习回归)详细介绍了基于TensorFlow tf.estimator接口的深度学习网络;而在TensorFlow 2.0中,新的Keras接口具有与 tf.estimator接口一致的功能,且其更易于学习,对于新手而言友好程度更高;在TensorFlow官网也建议新手从Keras接口入手开始学习。因此,本文结合TensorFlow Keras接口,加以深度学习回归的详细介绍与代码实战。
疯狂学习GIS
2021/07/22
1.1K0
神经网络在算法交易上的应用系列——简单时序预测
我们想从零实现只基于深度学习模型的交易系统,对于在研究过程中我们遇到的任何问题(价格预测,交易策略,风险管理)我们都将采用不同类型的人工神经网络(ANNS)来解决,同时也会检验它们在处理这些问题的效果到底如何。
量化投资与机器学习微信公众号
2019/02/26
1.5K0
用机器学习来预测股价(代码+文档)——2018年iNTUtion决赛大作!
机器学习和深度学习在时间序列数据的预测上具有很高的准确率,在金融机构中获得了广泛的应用。有大量的研究来进一步提升金融数据相关模型的准确率,本文要介绍的AlphaAI项目就是其中之一,AlphaAI使用栈式神经网络的架构(stacked neural network architecture )来预测多只股票的价格。
量化投资与机器学习微信公众号
2019/02/26
2.4K0
Python TensorFlow循环神经网络RNN-LSTM神经网络预测股票市场价格时间序列和MSE评估准确性|附代码数据
自 2000 年 1 月以来的股票价格数据。我们使用的是 Microsoft 股票。
拓端
2023/07/28
5480
股票预测 lstm(时间序列的预测步骤)
如果对LSTM原理不懂得小伙伴可以看博主下一篇博客,因为博主水平有限,结合其他文章尽量把原理写的清楚些。
全栈程序员站长
2022/08/01
2.3K1
股票预测 lstm(时间序列的预测步骤)
深度学习中的正则化策略综述(附Python代码)
本文翻译自《An Overview of Regularization Techniques in Deep Learning (with Python code)》(https://www.analyticsvidhya.com/blog/2018/04/fundamentals-deep-learning-regularization-techniques/),原作者保留版权。
机器学习算法工程师
2018/07/27
8050
深度学习中的正则化策略综述(附Python代码)
使用Keras 构建基于 LSTM 模型的故事生成器
LSTM (Long Short Term Memory, 长短期神经网络)是一种特殊的循环神经网络(RNN, Recurrent neural networks)。LSTM 能够通过更新单元状态来学习参数间的长期依赖关系,目前在机器翻译、语言识别等领域有着广泛应用。
deephub
2020/06/24
1.7K0
使用Keras 构建基于 LSTM 模型的故事生成器
一文搞定深度学习建模预测全流程(Python)
本文详细地梳理及实现了深度学习模型构建及预测的全流程,代码示例基于python及神经网络库keras,通过设计一个深度神经网络模型做波士顿房价预测。主要依赖的Python库有:keras、scikit-learn、pandas、tensorflow(建议可以安装下anaconda包,自带有常用的python库)
算法进阶
2022/06/02
9990
一文搞定深度学习建模预测全流程(Python)
从零开始学keras(五)
【导读】Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow、和Theano的高阶应用程序接口,进行深度学习模型的设计、调试、评估、应用和可视化。本系列将教你如何从零开始学Keras,从搭建神经网络到项目实战,手把手教你精通Keras。相关内容参考《Python深度学习》这本书。
墨明棋妙27
2022/08/24
3250
从零开始学keras(五)
TF2.0初体验-使用TF2.0 + Keras构建简单的神经网络
首先,我们要在电脑里装一个tf2.0的虚拟环境(我的电脑是mac,windows和linux类似)。这里使用anaconda的命令:
石晓文
2019/05/21
2K0
lstm多变量时间序列预测(时间序列如何预测)
Now, we are familiar with statistical modelling on time series, but machine learning is all the rage right now, so it is essential to be familiar with some machine learning models as well. We shall start with the most popular model in time series domain − Long Short-term Memory model.
全栈程序员站长
2022/08/01
2.3K0
lstm多变量时间序列预测(时间序列如何预测)
通过支持向量回归和LSTM进行股票价格预测
人工智能(AI)无处不在。机器学习和人工智能正在彻底改变现代问题的解决方式。应用机器学习的一种很酷的方法是使用财务数据。财务数据是机器学习的一个游乐场。
代码医生工作室
2019/09/23
3.8K0
通过支持向量回归和LSTM进行股票价格预测
LSTM时间序列预测及网络层搭建[通俗易懂]
最近看到一篇博客,是时间预测问题,数据和代码的原地址在这里, https://www.jianshu.com/p/5d6d5aac4dbd
全栈程序员站长
2022/07/23
1.1K0
LSTM时间序列预测及网络层搭建[通俗易懂]
验证 | 单纯用LSTM预测股价,结果有多糟(附代码)
尽管预测股价确实是一个老问题,至今仍然没有被解决。事实十分简单:股票的价格由多种因素决定,而股票的历史价格仅仅是众多原因中的一小部分。因此,预测股价走势是一个非常困难的问题。
量化投资与机器学习微信公众号
2019/02/26
14.2K1
使用PYTHON中KERAS的LSTM递归神经网络进行时间序列预测|附代码数据
时间序列预测问题是预测建模问题中的一种困难类型(点击文末“阅读原文”获取完整代码数据)。
拓端
2022/10/31
2.3K0
Keras中神经网络模型的5阶段生命周期
使用Python的Keras库可以很容易创建和评测深度学习神经网络,但是您必须遵循严格的模型生命周期。
用户1161128
2018/02/05
3.2K0
独家 | 教你使用简单神经网络和LSTM进行时间序列预测(附代码)
下载波动性标准普尔500数据集,时间范围是:2011年2月11日至2019年2月11日。我的目标是采用ANN和LSTM来预测波动性标准普尔500时间序列。
数据派THU
2019/05/21
3.6K0
Python人工智能 | 十六.Keras环境搭建、入门基础及回归神经网络案例
从本专栏开始,作者正式研究Python深度学习、神经网络及人工智能相关知识。前一篇文章详细讲解了无监督学习Autoencoder的原理知识,然后用MNIST手写数字案例进行对比实验及聚类分析。这篇文章将开启Keras人工智能的学习,主要分享Keras环境搭建、入门基础及回归神经网络案例。基础性文章,希望对您有所帮助!
Eastmount
2022/03/30
9580
Python人工智能 | 十六.Keras环境搭建、入门基础及回归神经网络案例
推荐阅读
相关推荐
神经网络在算法交易上的应用系列——时序预测+回测
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验