TensorFlow、Keras的LSTM神经网络异常检验和预测股市价格时间序列数据可视化python实例附代码数据

本文旨在探讨如何利用TensorFlow和Keras中的LSTM神经网络来预测和检验股市价格时间序列数据,并通过Python编程语言和可视化技术来展示预测结果和异常检验的效果。

由Kaizong Ye,Weilong Zhang撰写

具体而言,本文将首先介绍LSTM神经网络的基本原理和TensorFlow、Keras框架的使用方法,然后通过实例详细阐述如何构建和训练LSTM神经网络模型,以及如何进行数据预处理、特征提取和模型评估。

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


LSTM神经网络的基本原理

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

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


时间序列预测的示例

首先,安装所需的库:

!pip install gdown !pip install tensorflow-gpu

绘制正弦波数据:

image.png

视频

LSTM神经网络架构和原理及其在Python中的预测应用

探索见解

去bilibili观看

探索更多视频


视频

LSTM模型原理及其进行股票收盘价的时间序列预测讲解

探索见解

去bilibili观看

探索更多视频

对数据进行预处理:

image.png

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

train_size = int(len(df) * 0.8)

输出:

800 200

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

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

pythontime_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个神经元的全连接层。

pythonoptimizer=keras.optimizers.Adam(0.001))

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

 


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

image.png

异常检测

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


Chemicals-and-capital-markets-1536x1536.jpg

【视频】LSTM模型原理及其进行股票收盘价的时间序列预测讲解|附数据代码

阅读文章



!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.fit()函数对模型进行训练。


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

训练数据为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 从图中可以看出,异常点主要分布在股价波动较大的区域,这说明模型在预测股价波动较大的情况下可能存在一定的偏差。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。在此对他对本文所作的贡献表示诚挚感谢,他在上海财经大学完成了统计学专业的硕士学位,专注人工智能领域。擅长Python.Matlab仿真、视觉处理、神经网络、数据分析。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498