长短期记忆网络(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
- 导入数据集 :
dataset_training = pd.read_csv('AAPL_train.csv')
dataset_training.head()
- 提取开盘价数据 :
training_data = dataset_training.iloc[:, 1:2].values
training_data
- 数据归一化 :
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
training_data_scaled
- 创建时间戳数据 :
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)
- 重塑数据 :
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
X_train
- 导入构建 RNN 的库 :
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
- 初始化顺序模型 :
model = Sequential()
- 构建 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))
- 编译网络 :
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
model.fit(X_train, y_train, epochs = 100, batch_size = 32)
- 加载和处理测试数据 :
dataset_testing = pd.read_csv("AAPL_test.csv")
actual_stock_price = dataset_testing.iloc[:, 1:2].values
actual_stock_price
- 合并数据 :
total_data = pd.concat((dataset_training['Open'], dataset_testing['Open']), axis = 0)
- 准备测试数据 :
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)
- 可视化结果 :
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
- 导入数据集 :
dataset_training = pd.read_csv('AAPL_train.csv')
dataset_training.head()
- 提取开盘价数据 :
training_data = dataset_training.iloc[:, 1:2].values
training_data
- 数据归一化 :
from sklearn.preprocessing import MinMaxScaler
sc = MinMaxScaler(feature_range = (0, 1))
training_data_scaled = sc.fit_transform(training_data)
training_data_scaled
- 创建时间戳数据 :
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)
- 重塑数据 :
X_train = np.reshape(X_train, (X_train.shape[0], X_train.shape[1], 1))
- 导入构建 RNN 的库 :
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.layers import Dropout
- 初始化顺序模型 :
model = Sequential()
- 构建 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))
- 编译网络 :
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
model.fit(X_train, y_train, epochs = 100, batch_size = 32)
- 加载和处理测试数据 :
dataset_testing = pd.read_csv("AAPL_test.csv")
actual_stock_price = dataset_testing.iloc[:, 1:2].values
actual_stock_price
- 合并数据 :
total_data = pd.concat((dataset_training['Open'], dataset_testing['Open']), axis = 0)
- 准备测试数据 :
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)
- 可视化结果 :
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 在股票价格预测中展现出强大的潜力,通过不断调整模型参数和应用正则化等技术,可以提高预测的准确性。但在实际应用中,还需要结合更多的市场因素和数据进行综合分析。
超级会员免费看

被折叠的 条评论
为什么被折叠?



