20、长短期记忆网络(LSTM)在股票趋势预测中的应用

长短期记忆网络(LSTM)在股票趋势预测中的应用

1. LSTM 基础介绍

简单循环神经网络(RNN)和长短期记忆网络(LSTM)的主要区别在于 LSTM 存在门控单元。可以将门控单元想象成计算机内存,信息可以在其中写入、读取或存储。门控单元中的细胞会决定存储哪些信息,以及何时允许读取或写入数值。门控单元接受 0 到 1 之间的任何信息:如果输入为 0,则信息被阻止;如果为 1,则所有信息都能通过;如果输入在 0 到 1 之间,则只有部分信息通过。

除了输入门,网络的梯度依赖于两个因素:权重和激活函数。门控单元决定哪些记忆需要被记住,哪些需要被遗忘。就像水阀一样,网络可以选择让哪些阀门允许水流过,哪些不允许。通过调整这些“阀门”,可以避免输出值出现梯度消失或爆炸的问题。例如,如果某个值变得太大,遗忘门会将其遗忘,不再用于计算。遗忘门的本质是将信息乘以 0 或 1,如果信息需要进一步处理,遗忘门就将信息乘以 1;如果需要遗忘,就乘以 0。每个门都配有一个 Sigmoid 函数,将信息压缩在 0 到 1 之间。

2. 练习 27:使用 50 个单元(神经元)的 LSTM 预测苹果股票价格趋势

以下是具体步骤:
1. 导入所需库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  1. 导入数据集
dataset_training = pd.read_csv('AAPL_train.csv')
dataset_training.head()
  1. 提取开盘价数据
training_data = dataset_training.iloc[:, 1:2].values
  1. 特征缩放
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
  1. 创建时间戳数据
X_train = []
y_train = []
for i in range(60, 1258):
    X_train.append(training_data_scaled[i-60:i, 0])
    y_train.append(training_data_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
  1. 重塑数据
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
  1. 导入构建 RNN 的库
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
  1. 初始化顺序模型
model = Sequential()
  1. 构建 ANN 架构
model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], 1)))
model.add(LSTM(units = 50, return_sequences = True))
model.add(LSTM(units = 50, return_sequences = True))
model.add(LSTM(units = 50))
model.add(Dense(units = 1))
  1. 编译网络
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
model.fit(X_train, y_train, epochs = 100, batch_size = 32)
  1. 加载和处理测试数据
dataset_testing = pd.read_csv("AAPL_test.csv")
actual_stock_price = dataset_testing.iloc[:, 1:2].values
  1. 合并数据
total_data = pd.concat((dataset_training['Open'], dataset_testing['Open']), axis = 0)
  1. 准备测试数据
inputs = total_data[len(total_data) - len(dataset_testing) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 81):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = model.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)
  1. 可视化结果
plt.plot(actual_stock_price, color = 'green', label = 'Real Apple Stock Price',ls='--')
plt.plot(predicted_stock_price, color = 'red', label = 'Predicted Apple Stock Price',ls='-')
plt.title('Predicted Stock Price')
plt.xlabel('Time in days')
plt.ylabel('Real Stock Price')
plt.legend()
plt.show()
3. 活动 17:使用 50 个单元(神经元)的 LSTM 预测微软股票价格趋势

步骤如下:
1. 导入所需库。
2. 从完整数据集中提取开盘价列,可从 GitHub 仓库 下载数据集。
3. 将数据归一化到 0 到 1 之间。
4. 创建时间戳,2019 年 1 月每天的值将由前 60 天的值预测。
5. 将数据重塑为三维,因为网络需要三维数据。
6. 在 Keras 中使用 50 个单元构建 LSTM,第一步要提供输入形状,最后一个 LSTM 层始终添加 return_sequences=True
7. 处理和准备 2019 年 1 月的测试数据。
8. 合并和处理训练数据和测试数据。
9. 可视化结果。

4. 提高 LSTM 性能的方法

虽然没有构建 LSTM 的黄金标准,但可以尝试以下排列组合来提高性能:
| 方法 | 描述 |
| ---- | ---- |
| 构建中等单元的 LSTM | 如使用 50 个单元 |
| 构建单元数超过 100 的 LSTM | 使用更多神经元 |
| 使用更多数据 | 例如,将数据从 5 年增加到 10 年 |
| 对 100 个单元的 LSTM 应用正则化 | 防止过拟合 |
| 对 50 个单元的 LSTM 应用正则化 | 提高模型泛化能力 |
| 对更多数据和 50 个单元的 LSTM 应用正则化 | 结合更多数据和正则化 |

5. 练习 28:使用 100 个单元的 LSTM 预测苹果股票价格趋势

此练习步骤与练习 27 类似,只是将 LSTM 单元数从 50 增加到 100。具体步骤如下:
1. 导入所需库

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
  1. 导入数据集
dataset_training = pd.read_csv('AAPL_train.csv')
dataset_training.head()
  1. 提取开盘价数据
training_data = dataset_training.iloc[:, 1:2].values
  1. 特征缩放
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
  1. 创建时间戳数据
X_train = []
y_train = []
for i in range(60, 1258):
    X_train.append(training_data_scaled[i-60:i, 0])
    y_train.append(training_data_scaled[i, 0])
X_train, y_train = np.array(X_train), np.array(y_train)
  1. 重塑数据
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
  1. 导入构建 RNN 的库
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
  1. 初始化顺序模型
model = Sequential()
  1. 构建 ANN 架构
model.add(LSTM(units = 100, return_sequences = True, input_shape = (X_train.shape[1], 1)))
model.add(LSTM(units = 100, return_sequences = True))
model.add(LSTM(units = 100, return_sequences = True))
model.add(LSTM(units = 100))
model.add(Dense(units = 1))
  1. 编译网络
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
model.fit(X_train, y_train, epochs = 100, batch_size = 32)
  1. 加载和处理测试数据
dataset_testing = pd.read_csv("AAPL_test.csv")
actual_stock_price = dataset_testing.iloc[:, 1:2].values
  1. 合并数据
total_data = pd.concat((dataset_training['Open'], dataset_testing['Open']), axis = 0)
  1. 准备测试数据
inputs = total_data[len(total_data) - len(dataset_testing) - 60:].values
inputs = inputs.reshape(-1,1)
inputs = sc.transform(inputs)
X_test = []
for i in range(60, 81):
    X_test.append(inputs[i-60:i, 0])
X_test = np.array(X_test)
X_test = np.reshape(X_test, (X_test.shape[0], X_test.shape[1], 1))
predicted_stock_price = model.predict(X_test)
predicted_stock_price = sc.inverse_transform(predicted_stock_price)
  1. 可视化结果
plt.plot(actual_stock_price, color = 'green', label = 'Real Apple Stock Price',ls='--')
plt.plot(predicted_stock_price, color = 'red', label = 'Predicted Apple Stock Price',ls='-')
plt.title('Predicted Stock Price')
plt.xlabel('Time in days')
plt.ylabel('Real Stock Price')
plt.legend()
plt.show()

通过比较练习 27 和练习 28 的结果,可以发现使用 100 个单元的 LSTM 能更准确地捕捉苹果股票的趋势,但需要更多的计算时间。

6. 活动 18:添加正则化预测微软股票价格

步骤如下:
1. 导入所需库。
2. 从完整数据集中提取开盘价列,可从 GitHub 仓库 下载数据集。
3. 将数据归一化到 0 到 1 之间。
4. 创建时间戳,2019 年 1 月每天的值将由前 60 天的值预测。
5. 将数据重塑为三维。
6. 在 Keras 中使用 50 个单元构建 LSTM,提供输入形状,最后一个 LSTM 层添加 return_sequences=True
7. 添加 20% 的丢弃正则化。
8. 处理和准备 2019 年 1 月的测试数据。
9. 合并和处理训练数据和测试数据。
10. 可视化结果。

7. 活动 19:使用增加神经元数量(100 个单元)的 LSTM 预测微软股票价格趋势

步骤如下:
1. 导入所需库。
2. 从完整数据集中提取开盘价列。
3. 将数据归一化到 0 到 1 之间。
4. 创建时间戳,2019 年 1 月每天的值将由前 60 天的值预测。
5. 将数据重塑为三维。
6. 在 Keras 中使用 50 个单元构建 LSTM,提供输入形状,最后一个 LSTM 层添加 return_sequences=True
7. 处理和准备 2019 年 1 月的测试数据。
8. 合并和处理训练数据和测试数据。
9. 可视化结果。

综上所述,通过不同的实验和调整,可以找到适合特定数据集的 LSTM 模型,提高股票趋势预测的准确性。同时,理解 LSTM 的工作原理和如何克服梯度消失问题,对于处理时间序列问题至关重要。

长短期记忆网络(LSTM)在股票趋势预测中的应用

8. 实验结果分析

在前面的练习和活动中,我们进行了多次不同设置的实验,包括不同的单元数量和是否添加正则化等。通过这些实验,我们可以对结果进行分析。

对于苹果股票价格的预测,比较练习 27(50 个单元的 LSTM)和练习 28(100 个单元的 LSTM)的结果,发现使用 100 个单元的 LSTM 能更准确地捕捉股票趋势。这表明增加单元数量可以提高模型的表达能力,从而更好地拟合数据。但需要注意的是,增加单元数量也会带来更多的计算时间和资源消耗。

对于微软股票价格的预测,活动 17(50 个单元的 LSTM)、活动 18(添加正则化的 50 个单元 LSTM)和活动 19(100 个单元的 LSTM)的结果也有所不同。添加正则化可以在一定程度上防止过拟合,提高模型的泛化能力;而增加单元数量同样可能提高预测的准确性,但也伴随着计算成本的增加。

我们可以用以下表格总结不同实验的特点和结果:
| 实验名称 | 单元数量 | 是否添加正则化 | 特点 | 结果 |
| ---- | ---- | ---- | ---- | ---- |
| 练习 27 | 50 | 否 | 计算量相对较小 | 能捕捉一定趋势,但准确性稍低 |
| 练习 28 | 100 | 否 | 计算量较大 | 更准确地捕捉苹果股票趋势 |
| 活动 17 | 50 | 否 | 基础设置 | 能进行基本的微软股票趋势预测 |
| 活动 18 | 50 | 是 | 防止过拟合 | 提高模型泛化能力 |
| 活动 19 | 100 | 否 | 计算量较大 | 可能提高微软股票预测准确性 |

9. LSTM 工作原理深入理解

为了更好地理解 LSTM 为什么能在股票趋势预测等时间序列问题中表现出色,我们深入探讨其工作原理。

LSTM 的核心在于门控单元,门控单元就像计算机内存,能够控制信息的流入、流出和存储。具体来说,有输入门、遗忘门和输出门。

遗忘门决定哪些信息需要从细胞状态中遗忘。它通过一个 Sigmoid 函数将输入信息压缩到 0 到 1 之间,然后与细胞状态相乘。如果结果接近 0,则表示遗忘该信息;如果接近 1,则表示保留该信息。

输入门决定哪些新信息需要添加到细胞状态中。它由一个 Sigmoid 函数和一个 Tanh 函数组成。Sigmoid 函数决定哪些值需要更新,Tanh 函数创建一个新的候选值向量。然后将这两个结果组合起来更新细胞状态。

输出门决定从细胞状态中输出哪些信息。同样,它使用 Sigmoid 函数来决定细胞状态的哪些部分将输出,然后将细胞状态通过 Tanh 函数处理后与 Sigmoid 函数的输出相乘,得到最终的输出。

下面是 LSTM 工作原理的 mermaid 流程图:

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
    classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px

    A([输入信息]):::startend --> B(遗忘门):::process
    A --> C(输入门):::process
    A --> D(输出门):::process
    E([细胞状态]):::startend --> B
    B --> F(更新细胞状态 - 遗忘部分):::process
    C --> G(更新细胞状态 - 添加部分):::process
    F --> H([更新后的细胞状态]):::startend
    G --> H
    H --> D
    D --> I([输出信息]):::startend
10. 时间序列问题中的应用优势

LSTM 在处理时间序列问题(如股票趋势预测)中具有明显的优势。与简单的 RNN 相比,LSTM 能够有效克服梯度消失问题。

简单 RNN 在处理长序列时,由于梯度在反向传播过程中会不断相乘,容易导致梯度消失或爆炸。而 LSTM 通过门控单元的机制,能够更好地控制信息的流动,使得梯度在传播过程中不会过度衰减或放大。

在股票趋势预测中,时间序列数据具有长期依赖的特点,即当前的股票价格可能受到过去很长一段时间内的多种因素影响。LSTM 能够记住这些长期信息,从而更准确地预测未来的趋势。

11. 总结与展望

通过前面的学习和实验,我们了解了 LSTM 的基本原理和在股票趋势预测中的应用。我们学会了如何构建不同设置的 LSTM 模型,包括调整单元数量和添加正则化等方法来提高模型性能。

同时,我们也认识到在实际应用中,需要根据具体的数据集和问题来选择合适的模型设置。增加单元数量可能提高准确性,但会增加计算成本;添加正则化可以防止过拟合,但需要选择合适的正则化参数。

未来,我们可以进一步探索更多的优化方法,如调整学习率、尝试不同的激活函数等,以提高模型的性能。此外,还可以结合其他技术,如卷积神经网络(CNN),来处理更复杂的时间序列数据,进一步提高股票趋势预测的准确性。

总之,LSTM 为处理时间序列问题提供了强大的工具,通过不断的学习和实践,我们可以更好地利用它来解决实际问题。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值