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 预测苹果股票价格趋势

我们将研究苹果公司在 2014 年 1 月 1 日至 2018 年 12 月 31 日这 5 年期间的股票价格,并尝试使用 RNN 预测和预测该公司 2019 年 1 月的未来趋势。由于我们有 2019 年 1 月的实际股价数据,因此可以将预测结果与实际值进行比较。具体步骤如下:
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
training_data
  1. 数据归一化
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
training_data_scaled
  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))
X_train
  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
actual_stock_price
  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 预测微软股票价格趋势

我们将研究微软公司在过去 5 年(2014 年 1 月 1 日至 2018 年 12 月 31 日)的股票价格,并尝试使用 RNN 和 LSTM 预测该公司 2019 年 1 月的未来趋势。具体步骤如下:
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 应用正则化 | 结合更多数据和正则化 |

哪种组合能提供最佳结果,就可以将其视为特定数据集的优秀算法。

graph LR
    A[开始] --> B[导入所需库]
    B --> C[导入数据集]
    C --> D[提取开盘价数据]
    D --> E[数据归一化]
    E --> F[创建时间戳数据]
    F --> G[重塑数据]
    G --> H[导入构建 RNN 的库]
    H --> I[初始化顺序模型]
    I --> J[构建 ANN 架构]
    J --> K[编译网络]
    K --> L[加载和处理测试数据]
    L --> M[合并数据]
    M --> N[准备测试数据]
    N --> O[可视化结果]
    O --> P[结束]

通过以上步骤和方法,我们可以利用 LSTM 对股票价格趋势进行预测,并通过不同的优化方法提升预测的准确性。后续我们还会通过更多的练习和活动来进一步探索 LSTM 在股票价格预测中的应用。

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

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

我们依旧关注苹果公司过去 5 年(2014 年 1 月 1 日至 2018 年 12 月 31 日)的股票价格,尝试用 RNN 预测其 2019 年 1 月的未来趋势,并与实际值对比。此练习与练习 27 任务相同,但使用 100 个单元,需将输出与练习 27 对比。具体步骤如下:
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
training_data
  1. 数据归一化
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
training_data_scaled
  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
actual_stock_price
  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 中 50 个神经元的 LSTM 和此练习 100 个单元的 LSTM,可发现 100 个单元的 LSTM 能更好地捕捉苹果股票趋势。不过,100 个单元的 LSTM 需要更多计算时间,但在该场景下结果更好。

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

我们将研究微软公司过去 5 年(2014 年 1 月 1 日至 2018 年 12 月 31 日)的股票价格,用 RNN 和 LSTM 预测 2019 年 1 月的未来趋势,并与实际值对比。此前用 50 个单元的 LSTM 预测过,此次添加 dropout 正则化并与活动 17 结果对比。具体步骤如下:
1. 导入所需库。
2. 从完整数据集中提取开盘价列用于预测,可从 GitHub 仓库 下载数据集。
3. 将数据归一化到 0 到 1 之间。
4. 创建时间戳,2019 年 1 月每天的值由前 60 天的值预测。
5. 将数据重塑为三维,以满足网络需求。
6. 使用 Keras 构建 50 个单元(神经元)的 LSTM,第一步提供输入形状,最后一个 LSTM 层添加 return_sequences=True
7. 添加 20% 的 dropout 正则化。
8. 处理和准备 2019 年 1 月的实际测试数据。
9. 合并和处理训练数据和测试数据。
10. 可视化结果。

7. 活动 19:使用 100 个 LSTM 神经元预测微软股票价格趋势

我们还是聚焦微软公司过去 5 年(2014 年 1 月 1 日至 2018 年 12 月 31 日)的股票价格,尝试用 RNN 预测 2019 年 1 月的未来趋势,并与实际值对比,也可与活动 17 结果对比。具体步骤如下:
1. 导入所需库。
2. 从完整数据集中提取开盘价列进行预测。
3. 将数据归一化到 0 到 1 之间。
4. 创建时间戳,2019 年 1 月每天的值由前 60 天的值预测。
5. 将数据重塑为三维,适应网络要求。
6. 使用 Keras 构建 100 个单元(神经元)的 LSTM,第一步提供输入形状,最后一个 LSTM 层添加 return_sequences=True
7. 处理和准备 2019 年 1 月的实际测试数据。
8. 合并和处理训练数据和测试数据。
9. 可视化结果。

8. 总结

我们通过实际案例了解了顺序建模和顺序记忆,深入探究了顺序建模与 RNN 的关系,以及 RNN 与传统前馈网络的差异。详细学习了梯度消失问题,并且明白使用 LSTM 比简单 RNN 更能有效克服该问题。还将所学应用于时间序列问题,如股票趋势预测。

在整个学习过程中,我们掌握了机器学习和 Python 的基础知识,深入理解了如何运用 Keras 开发高效的深度学习解决方案。清楚了机器学习和深度学习的区别,学会了先用 scikit - learn 再用 Keras 构建逻辑回归模型。通过为各种现实场景创建预测模型,进一步探索了 Keras 及其不同模型。学会了评估、优化和改进模型以获取最大信息,通过 Keras Wrapper 和 scikit - learn 进行交叉验证评估模型,还应用了 L1、L2 和 dropout 正则化技术提高模型准确性。为保持准确性,运用了零准确率、精度和 AUC - ROC 分数等技术微调模型。最后,使用真实的股票价格数据集创建了各种 CNN 和 RNN 网络。

graph LR
    A[开始] --> B[导入所需库]
    B --> C[提取开盘价列]
    C --> D[数据归一化]
    D --> E[创建时间戳]
    E --> F[数据重塑]
    F --> G[构建 LSTM 模型]
    G --> H{是否添加正则化}
    H -- 是 --> I[添加正则化]
    H -- 否 --> J[继续]
    I --> J
    J --> K[处理测试数据]
    K --> L[合并数据]
    L --> M[预测并反归一化]
    M --> N[可视化结果]
    N --> O[结束]

总之,LSTM 在股票价格预测中展现出强大的潜力,通过不断调整模型参数和应用正则化等技术,可以提高预测的准确性。但在实际应用中,还需要结合更多的市场因素和数据进行综合分析。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值