Python股票预测:注意力多层Attention RNN LSTM应用

原文链接:https://tecdat.cn/?p=37152

Attention 机制是一种在神经网络处理序列数据时极为关键的技术,它赋予了模型“聚焦”能力,能够自动评估输入序列中各部分的重要性。通过为序列中的每个元素分配不同的权重,Attention 确保网络在处理过程中能够优先关注那些对任务更为关键的部分,从而显著提升模型的预测精度和效果。

相关视频

当Attention机制与LSTM(长短时记忆网络)相结合时,这一组合展现出了更为强大的序列处理能力。LSTM本身设计用于捕捉序列中的长期依赖关系,通过其独特的门控机制来控制信息的遗忘与保留。然而,面对极长的序列,LSTM可能会遭遇信息衰减或传递不畅的挑战。此时,Attention机制的引入如同一剂强心针,它允许模型动态地调整对序列不同片段的关注度,确保关键信息得以高效捕捉而不被忽略。

因此,Attention + LSTM 的结合不仅解决了LSTM在处理长序列时可能遇到的问题,还通过两者优势互补,极大地增强了模型对复杂序列数据的理解和分析能力,既提升了性能,也优化了计算效率。

股票预测模型使用注意力多层 RNN LSTM

数据准备
首先,我们从CSV文件中读取股票数据,并计算每对相邻交易日之间的对数收益率,假设收益率服从对数正态分布。接着,使用z-score标准化方法将数据映射到均值为0、方差为1的分布上,以减少不同量纲对模型训练的影响。
计算两点之间的对数收益率。假设收益率呈对数正态分布。

使用 zscore 将一个 pandas 系列映射,使其均值为 0,方差为 1,以对数据进行标准化。

图片

处理所有股票代码以生成数据框

Final = pd.DataFrame()
for f in os.listdir(datapath):
    filepath = os.path.join(datapath,f)
    if filepath.endswith('.csv'):

图片

数据透视

P是每个股票所有条目的扁平化数据框,每行代表一天

mi = P.columns.tolist()

图片

设置目标

为了简化问题,我们将预测目标设定为股票价格的涨跌方向(上涨、下跌或持平),分别用1、-1和0表示。通过计算每日的收益率,我们可以为每个交易日打上相应的标签。

现在我们有了输入和目标,算是有了。InputsDF 包含了我们想要预测的所有输入。Targets DF 包含了每个股票每天的收益率。首先,由于我们没有太多数据,让我们为预测设定一个比每个股票的收益率更简单的目标。

我们将目标标记为上涨(1)、下跌(-1)或持平(0)。顶部图表展示了如果我们每天为每个股票投入 1 美元将会出现的情况。底部图表展示了如果在上涨(1)的日子做多整个股票组合,在下跌(-1)的日子做空,在(0)的日子忽略会产生的结果。您能够看出这是一个具有价值的预测目标。

Labeled['max_return'] = Labeled['class'] * Labeled['return']
Labeled

图片

建立基线

为了评估后续模型的性能,我们首先构建了逻辑回归和全连接神经网络作为基线模型。

逻辑回归

from sklearn import linear_model
from sklearn.metrics import classification_report,confusion_matrix
logreg = linear_model.LogisticRegression(C=1e5)

基线全连接前馈神经网络

使用TensorFlow构建一个简单的全连接神经网络作为另一个基线。

with tf.Graph().as_default():
    model = Model()
    input_ = train[0]
    target = train[1]

    config = tf.ConfigProto()
    jit_level = tf.OptimizerOptions.ON_1
    config.graph_options.optimizer_options.global_jit_level = jit_level

图片

Res = (1+Result[-test_size:][['return','max_return','nn_ret']]).cumprod()
Res[0] =0
Res.plot(secondary_y='max_return')

图片

print(classification_report(Result['class'],Result['mod_nn_prod']))

图片

Result[Result.multi_class==6]['nn_pred'].hist()

图片

注意力循环神经网络与MultiRNNCell LSTMs

基于TensorFlow,我们构建了一个包含注意力机制的RNN模型,使用LSTM单元作为RNN的基本组件。注意力机制通过赋予不同时间步长不同的权重,帮助模型更好地捕捉关键信息。

在本节中,我们将创建一个能够学习考虑过去情况的 rnn 模型。此模型基于 AttentionCellWrapper,这是在以下https://arxiv.org/pdf/1409.0473v7.pdf 中描述的一种新颖方法,标题为“通过联合学习对齐和翻译的神经机器翻译”

rnn 网络定义

from tensorflow.contrib.layers.python.layers.initializers import xavier_initializer

# Parameters
learning_rate = 0.0007
display_step = 1
logpath = '/tmp/rnn_logs/example'

训练 RNN

# 构建模型并将所有操作封装到作用域中,使
# Tensorboard 的图形可视化更方便
with tf.Graph().as_default():
    model = RNNModel()
    input_ = train[0]
    target = train[1]
# XLA
    config = tf.ConfigProto()

图片

RNN 结果

Result['rnn_pred'] = final_preds
Result['mod_rnn_prod'] = list(map(lambda x: -1 if x <5 else 0 if x==5 else 1,final_preds))

图片

通过对比基线模型和注意力RNN模型的预测结果,我们发现注意力RNN模型在预测准确率、召回率和F1分数等指标上均有所提升,表明注意力机制有效地帮助模型捕捉到了股票数据中的关键时序特征。

Result[Result.multi_class==6]['rnn_pred'].hist()
<matplotlib.axes._subplots.AxesSubplot at 0x7f86a1938128>

Res.plot(figsize=(20,10))

图片

图片

g.map(sns.distplot, "return",);

图片

结论

本文提出了一种基于注意力机制的RNN模型用于股票价格预测,并通过实验验证了其有效性。与基线模型相比,该模型在预测性能上取得了显著提升。未来工作可以进一步探索不同注意力机制、优化模型结构以及融合更多外部数据源,以进一步提升预测精度和泛化能力。

发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/109116
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!

(0)
股市刺客的头像股市刺客
上一篇 6小时前
下一篇 6小时前

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注