全文链接:https://tecdat.cn/?p=36448

原文出处:拓端数据部落公众号

本文旨在探讨如何利用TensorFlow和Keras中的LSTM神经网络来预测和检验股市价格时间序列数据,并通过Python编程语言和可视化技术来展示预测结果和异常检验的效果。具体而言,本文将首先介绍LSTM神经网络的基本原理和TensorFlow、Keras框架的使用方法,然后通过实例详细阐述如何构建和训练LSTM神经网络模型,以及如何进行数据预处理、特征提取和模型评估。

本文将展示如何帮助客户应用该模型进行时间序列预测和股票价格数据进行异常点检测,并通过可视化技术来直观地呈现预测结果和异常点。最后,本文将对结果进行分析和讨论,并探讨该模型在实际应用中的潜力和挑战。

LSTM神经网络的基本原理

长短时记忆网络(Long Short-Term Memory,LSTM)是一种特殊的循环神经网络,它可以学习长期依赖关系,并在时间序列数据中捕捉到更多的历史信息。传统的RNN在处理长序列数据时,存在梯度消失或梯度爆炸的问题,而LSTM通过引入内部门控制结构解决了这个问题。

LSTM的核心组件包括输入门、遗忘门和输出门。输入门决定了哪些信息需要被存储到细胞状态中;遗忘门决定了哪些信息需要从细胞状态中删除;输出门决定了细胞状态中的信息如何与其他层交互。这三个门的输出都是一个向量,表示对相应操作的程度。

时间序列预测的示例

首先,安装所需的库:

!pip install gdown
!pip install tensorflow-gpu

绘制正弦波数据:

image.png

对数据进行预处理:

image.png

将数据集划分为训练集和测试集:

train_size = int(len(df) * 0.8)

输出:

800 200

定义一个函数,用于创建输入数据和标签:

首先,我们需要创建一个具有时间步长的数据集。在这个例子中,我们使用了10个时间步长。

time_steps = 10

# 将数据重塑为 [samples, time_steps, n_features] 的形状
X_train, y_train = create_dataset(train, train.sine, time_steps)

输出结果为:

(790, 10, 1) (790,)

接下来,我们构建一个模型。在这个例子中,我们使用了一个具有128个神经元的LSTM层,然后是一个具有1个神经元的全连接层。

optimizer=keras.optimizers.Adam(0.001))

现在,我们开始训练模型。我们设置了30个训练周期,批量大小为16,验证集比例为0.1。

训练过程中的损失值如下图所示:

image.png

接下来,我们评估模型的性能。我们绘制了训练损失和验证损失的曲线。

评估结果如下图所示:

image.png

最后,我们预测测试集上的值。

y_pred = model.predict(X_test)

我们绘制了历史数据、真实值和预测值的曲线。

7f11f44e5cdc4f1bbf52b75a73d4358b~tplv-k3u1fbpfcp-jj-mark_0_0_0_0_q75.jpg

异常检测

这是一个使用TensorFlow和Keras进行时间序列预测的示例。首先,安装所需的库:

!pip install gdown 
!pip install tensorflow-gpu

接下来,读取数据并设置索引:

df = pd.read_csv('spx.csv'

查看数据的前5行:

image.png

绘制收盘价:

plt.plot(df, label='close price') 
plt.legend();

image.png

将数据分为训练集和测试集:

image.png



scaler = StandardScaler()

以上代码使用StandardScaler对训练集和测试集的收盘价进行了标准化处理。

这是一个函数,用于将数据集划分为输入和输出,输入为最近的time_steps个值,输出为接下来的一个值。

这里,我们定义了时间步长TIME_STEPS为30,然后使用create_dataset函数将训练集和测试集划分为输入和输出。最后,我们打印出训练集的形状,以便后续使用。

image.png

首先,我们定义了一个Sequential模型,并添加了一个LSTM层,单元数为64,输入形状为(X_train.shape[1], X_train.shape[2])。接着,我们添加了一个Dropout层,丢弃率为0.2,以减少过拟合。然后,我们添加了一个RepeatVector层,重复次数为X_train.shape[1]。再次,我们添加了一个LSTM层,单元数为64,返回序列为True。最后,我们添加了一个TimeDistributed层,其中的Dense层单元数为X_train.shape[2]。模型编译时,我们选择了均方误差作为损失函数,优化器为Adam。


model.compile(loss='mae', optimizer='adam')

接下来,我们使用model.fit()函数对模型进行训练。训练数据为X_train和y_train,训练轮数为10,批量大小为32,验证集比例为0.1,不打乱数据顺序。训练完成后,我们绘制了训练损失和验证损失随迭代次数的变化曲线,如图1所示。从图中可以看出,训练损失和验证损失都逐渐降低,说明模型在训练过程中逐渐收敛。

image.png

image.png

然后,我们使用模型预测训练数据,得到预测结果X_train_pred。计算预测结果与真实值之间的平均绝对误差,得到train_mae_loss。最后,我们使用seaborn库绘制了train_mae_loss的分布图,如图2所示。从图中可以看出,大部分样本的MAE损失集中在较小的范围内,说明模型在训练数据上的预测效果较好。

sns.distplot(train_mae_loss, bins=50, kde=True);

image.png

首先,我们需要将测试数据集的MAE损失值、阈值和收盘价等信息整合到一个DataFrame中,以便后续分析。这里的阈值为0.65。

接下来,我们绘制了损失值与时间的关系图,以及阈值与时间的关系图。

image.png

从图中可以看出,损失值在大部分时间内都低于阈值,说明模型的预测效果较好。

然后,我们筛选出了所有异常点(即损失值大于阈值的点)。


anomalie.head()

image.png

最后,我们将原始收盘价与异常点绘制在同一张图上,以便观察异常点在股价走势中的位置。


plt.xticks(rotation=25)
plt.legend();

6dd85f66d0f64c5e9292bedfae12162c~tplv-k3u1fbpfcp-jj-mark_0_0_0_0_q75.jpg
从图中可以看出,异常点主要分布在股价波动较大的区域,这说明模型在预测股价波动较大的情况下可能存在一定的偏差。

QQ截图20220302134203.png


拓端tecdat
195 声望46 粉丝