Skip to content

揭秘:如何用思想增强型LSTM网络精准预测股价?

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

写在前面的话:本文介绍了一种创新模型——“思想增强型 LSTM”,用于提升股价预测的准确性。该模型在每个时间步生成抽象的“思想”表征,与 LSTM 输出结合,捕捉股价序列的复杂模式。通过实验证明,这种方法在股价预测上优于传统 LSTM,这为您的金融投资提供了一种新的技术工具,我会在文末附上全部源码和Google Colab笔记本运行环境地址,感兴趣的朋友不妨一探究竟。

一、了解 LSTM 网络

长短期记忆(LSTM)网络是一种递归神经网络(RNN),旨在捕捉连续数据中的长期依赖关系。与标准 RNN 不同的是,LSTM 可以选择性地记忆或遗忘长序列中的信息,这使其对股票价格预测等时间序列预测任务尤为有效。

1. LSTM 网络的核心在于其单元结构,主要由以下几个部分组成:

LSTM 利用这些方程更新其单元状态,并在每个时间步产生输出:

f_t = σ(W_f · [h_(t-1), x_t] + b_f) i_t = σ(W_i · [h_(t-1), x_t] + b_i) o_t = σ(W_o · [h_(t-1), x_t] + b_o) c̃_t = tanh(W_c · [h_(t-1), x_t] + b_c) c_t = f_t * c_(t-1) + i_t * c̃_t h_t = o_t * tanh(c_t)
f_t = σ(W_f - [h_(t-1), x_t] + b_f) i_t = σ(W_i - [h_(t-1), x_t] + b_i) o_t = σ(W_o - [h_(t-1)、x_t] + b_o) c̃_t = tanh(W_c - [h_(t-1), x_t] + b_c) c_t = f_t * c_(t-1) + i_t * c̃_t h_t = o_t * tanh(c_t)
  • f_t、i_t、o_t 分别是遗忘门、输入门和输出门
  • c_t 是单元状态
  • h_t 是隐藏状态
  • x_t 是 t 时刻的输入
  • W 和 b 是权重矩阵和偏置向量
  • σ 是正余弦函数。

2. LSTM 的工作流程可以概括为以下几个步骤:

3. LSTM 网络在多个领域表现出色,以下是一些典型应用

我也曾写过几篇涉及 LSTM 的文章,感兴趣的朋友可以点击下面的链接阅读:

二、思维增强 LSTM 简介

传统的LSTM模型无疑具有强大的功能,但我们的愿景是将其推向一个新的高度。我们计划通过引入一种“思维”机制来进一步提升其性能。我们的创新思路在于,为输入序列的每一个时间步生成一种抽象的表征——我们称之为“思想”。将这些“思想”融合在一起,并与LSTM的输出相结合,以此来实现更为精准的预测。这就像是在LSTM的大脑中植入一颗思考的种子,让它能够以更接近人类思维的方式理解和预测数据。

这种方法受到注意力机制概念的启发,但我们并不是专注于输入的特定部分,而是产生更高层次的抽象(思维),从而捕捉整个序列中的复杂模式。

三、代码实现

我们的实现被称为 LSTMWithThoughts,它扩展了基本的 LSTM 架构:

class LSTMWithThoughts(nn.Module):
    def __init__(self, input_dim, hidden_dim, thought_dim, num_thoughts, output_dim):
        super(LSTMWithThoughts, self).__init__()
        self.encoder = nn.LSTM(input_dim, hidden_dim, batch_first=True)
        self.thought_generator = nn.Linear(hidden_dim, num_thoughts * thought_dim)
        self.mlp_combine_thoughts = nn.Sequential(
            nn.Linear(num_thoughts * thought_dim, thought_dim),
            nn.ReLU(),
            nn.Linear(thought_dim, thought_dim)
        )
        self.output_layer = nn.Linear(hidden_dim + thought_dim, output_dim)

    def forward(self, x):
        # LSTM encoding
        _, (h_enc, _) = self.encoder(x.unsqueeze(1))  # Add sequence dimension
        h_last = h_enc[-1]

        # Generate thoughts
        thoughts = self.thought_generator(h_last)

        # Apply MLP to combine thoughts
        combined_thoughts = self.mlp_combine_thoughts(thoughts)

        # Combine with last hidden state
        combined_rep = torch.cat((combined_thoughts, h_last), dim=-1)

        # Predict next price
        prediction = self.output_layer(combined_rep)
        return prediction

主要组成部分:

  • LSTM 编码器:处理输入序列,为每个时间步生成隐藏状态。
  • 思维生成器:为每个隐藏状态创建一个思维向量。
  • 思维组合器:将所有思维向量合并为单一的综合思维表征。
  • 输出层:将最终的 LSTM 隐藏状态与综合思维相结合,做出最终预测。

The forward pass:

  • 使用 LSTM 对输入序列进行编码。
  • 为每个时间步生成想法。
  • 将这些想法合并为一个表征。
  • 将组合思想与最终的 LSTM 隐藏状态合并。
  • 得出最终预测结果。

这种架构使模型既能利用 LSTM 的顺序处理能力,又能利用抽象的 “思维 “表征,从而捕捉股价数据中更多细微的模式。

四、输出成果

1. Reliance.NS

  • 平均绝对误差 (MAE):32.8966
  • 平均绝对百分比误差 (MAPE):0.0184
  • 测试平均绝对误差 (MAE):33.4168
  • 测试平均绝对百分比误差 (MAPE): 0.01430.0143

2. SBIN.NS

  • 平均绝对误差 (MAE):6.5945
  • 平均绝对百分比误差 (MAPE):0.0206
  • 测试平均绝对误差 (MAE):7.9423
  • 测试平均绝对百分比误差 (MAPE): 0.01430.0143

3. Manali Petro

  • 平均绝对误差 (MAE):3.1939
  • 平均绝对百分比误差 (MAPE):0.1065
  • 测试平均绝对误差 (MAE):1.8901
  • 测试平均绝对百分比误差 (MAPE): 0.02110.0211

五、观点总结

我们上面的文章中尝试了一种方法,即:网络在给出最终预测之前会进行更多的思考。它会反思之前的隐藏状态,然后将这些组合成一个思想向量,用它来预测未来。我还认为这可以进一步与策略网络结合起来,通过奖励机制进一步优化预测结果。这就像是给网络装上了一个智慧的大脑,让它能够更有效地学习和进化。

  • 传统LSTM网络能够处理长期依赖问题,但在股价预测任务中可能需要进一步的增强。
  • 通过引入“思想”机制,可以使LSTM网络生成更高层次的抽象表示,从而提高对股价时间序列的预测能力。
  • LSTMWithThoughts模型的关键在于它能够结合LSTM的隐藏状态和生成的思维表征,合成出更为全面的特征,用于最终的预测。
  • 实验结果表明,相较于传统LSTM,思想增强型LSTM在股价预测上取得了更好的性能。
  • 未来的研究可能会将思想增强型LSTM与策略网络结合,通过奖励机制进一步优化预测结果。

代码示例和 Google Colab 笔记本地址如下:

https://colab.research.google.com/drive/10k_L1ISBoL5kKBlHWU_oDnP4ZFimGHDC?usp=sharing


感谢您阅读到最后,希望本文能给您带来新的收获。祝您投资顺利!如果对文中的内容有任何疑问,请给我留言,必复。


本文内容仅仅是技术探讨和学习,并不构成任何投资建议。

Published inAI&Invest专栏

Be First to Comment

发表回复