Skip to content

使用堆叠 LSTM 模型预测市场趋势

作者:老余捞鱼

原创不易,转载请标明出处及原作者。

用神经网络分析历史数据,改进市场预测

写在前面的话:本文主要介绍预测市场趋势的一种研究方法,这一研究的重点是利用堆栈式长短期记忆(LSTM)网络预测股票价格。这种方法利用先进的神经网络架构,根据历史价格数据分析和预测市场趋势。并展示了如何通过 Python 编程环境中的数据预处理、模型构建、训练和预测来实现这一目标。

股票价格预测是金融分析的一个重要方面,它能帮助投资者和金融专业人士做出明智的决策。堆叠 LSTM 网络以其捕捉时间依赖性的能力而著称,特别适合这项任务。通过堆叠多个 LSTM 层,该模型增强了学习时间序列数据中复杂模式的能力。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM

本代码片段介绍了在 Python 编程环境中广泛用于数据分析和机器学习的几个库。

Pandas 以 pd 的形式导入,提供了数据处理和分析的基本功能,尤其是处理结构化数据(如 DataFrames)的功能。这一功能对于准备建模的数据集至关重要。NumPy 以 np 的形式导入,是 Python 中进行数值计算的基本软件包。它可以对数组和矩阵进行操作,这些操作对于机器学习模型中的数据操作和数学函数来说是必不可少的。
Matplotlibs pyplot 是以 plt 的形式导入的,它是一个专为在 Python 中创建静态、交互式和动画可视化而设计的库。该库在数据可视化方面发挥着重要作用,允许用户生成图形和图表,以深入了解数据并评估模型性能。
MinMaxScaler 源自 sklearn.preprocessing 模块,用于在定义的范围内(通常在 0 和 1 之间)缩放特征。 这种缩放过程是机器学习中一个重要的预处理步骤,因为它能提高处理输入数据时模型收敛的速度和准确性。

采用 TensorFlow 的 Keras API 来构建神经网络模型,特别是序列模型。这种方法有助于深度学习架构的开发。该模型由不同的层组成,包括全连接神经网络层–密集层,以及代表长短期记忆层的 LSTM 层,后者对于时间序列分析或自然语言处理等序列预测任务尤为有效。

plt.plot(df_close)
plt.show()

这段代码是为 Python 中的数据可视化而设计的,特别是用来绘制线形图,表示名为 df_close 的 DataFrame 对象中包含的时间序列数据。主要功能是创建可视化表示,特别是线形图,以说明存储在 df_close DataFrame 中的值。这种可视化效果在数据分析中得到广泛应用,可用于识别随时间变化的趋势或有效比较不同的数据集。该代码通过使用 Matplotlib 库进行操作,由 plt.plot(df_close) 命令启动。该命令使用 df_close DataFrame 中的数据生成图表,其中 x 轴通常代表时间(前提是 DataFrame 的索引基于时间),y 轴显示相应的值。要渲染和显示创建的曲线图,必须使用 plt.show() 函数;如果不使用该函数,曲线图可能无法在某些环境中显示。

该代码的意义在于它能够促进数据可视化,这在数据分析中至关重要。数据可视化可以增强对数据集中的趋势、模式和异常的理解和解释。通过绘制 df_close,用户可以提取到仅通过检查原始数字数据可能不那么明显的洞察力。这一过程最终有助于根据数据的可视化描述做出明智的决策。MinMax 缩放是一种预处理技术,在处理长短时记忆 (LSTM) 网络时尤为重要,因为它们对输入数据的规模非常敏感。通常情况下,当输入特征归一化到特定范围时,LSTM 模型的性能会更好。这种调整有助于确保各种输入特征对学习过程的贡献相同,从而提高模型的性能和稳定性。在使用 MinMax 缩放时,必须仔细考虑其对数据模式的影响。虽然 MinMax 可以有效地标准化输入值,但必须保留原始数据集中的基本关系。因此,在使用 LSTM 网络时,整合 MinMax 缩放可以提高模型的准确性和效率。

scaler = MinMaxScaler(feature_range=(0,1))
df_close = scaler.fit_transform(np.array(df_close).reshape(-1,1))

本代码片段演示了在数据集上应用特征缩放,特别是利用 Scikit-learn 库提供的 Min-Max 缩放技术。该程序的目的是将 df_close 数据集中的值转换为 0 至 1 的标准化范围,df_close 数据集可能由股票收盘价或类似的数字数据组成。

该过程从 MinMaxScaler 对象的初始化开始,配置的特征范围为 (0,1)。这样就可以对转换后的数据进行重新缩放,使最小值变为 0,最大值变为 1。这种初始化是缩放过程中至关重要的第一步。随后,原始数据 df_close 被重塑为二维数组。这种转换是必要的,因为缩放器需要二维格式的数据,包括样本和特征,即使只有单一特征,收盘价数据集也是如此。接下来,在缩放器对象上使用 fit_transform 方法,使用重塑后的数据。该方法计算原始数据集的最小值和最大值,应用缩放变换以确保数据在指定范围内,然后返回归一化值。

在数据预处理中,尤其是在机器学习和统计分析中,使用该代码至关重要。归一化可以确保在对数据规模敏感的算法(如 K 最近邻和梯度下降优化方法)中,特征对距离计算的贡献是相等的。此外,缩放还能提高某些算法的收敛速度,从而加快训练过程并提高效率。此外,它还能减少异常值的影响,防止它们对模型学习过程产生负面影响。

train_size = int(len(df_close)*0.65)
test_size = len(df_close) - train_size
train_data = df_close[0:train_size,:]
test_data = df_close[train_size:,:]

该代码用于为机器学习模型的训练和测试准备数据集,特别是在时间序列数据的背景下,例如以变量名 df_close 表示的金融信息。代码的主要功能是计算用于训练和测试的数据集比例。具体来说,它将总数据集的 65% 指定为训练部分,剩余的 35% 用于测试。这种划分使程序能够有效评估模型在未见数据上的性能。

为了实现这种划分,代码首先会确定训练数据集的大小(称为 train_size),它被计算为代表 df_close 中总行数 65% 的整数值。然后,从总行数中减去 train_size,就得出了测试数据集的大小(称为 test_size),以确保 df_close 中的所有数据都得到利用。最后,代码通过分割 DataFrame 创建了两个不同的片段:一个指定用于训练,另一个通过索引用于测试。

使用该代码的基本原理是基于模型训练和验证的概念。通过分割数据集,可以在一个子集上训练模型,同时在另一个子集上评估其有效性。这种方法可以让我们深入了解模型在面对以前未曾接触过的数据时的泛化能力。此外,将训练数据与测试数据分开有助于降低过度拟合的风险。在一个独特的数据集上进行训练,可以降低模型仅仅记住输入数据的可能性–这种现象可能会对应用于新数据时的性能产生不利影响。在不同的数据集上测试模型,可以对模型的准确性和整体有效性进行可靠的评估。

在时间序列分析中,保持数据的时间结构至关重要。本代码遵循这一原则,将数据集的初始部分分配给训练,并将随后的部分保留给测试。这种方法可以有效地模拟应用历史数据预测未来结果的现实场景。

plt.figure(figsize=[15,5])
plt.subplot(121)
plt.plot(train_data)
plt.title('Train Data')
plt.subplot(122)
plt.plot(test_data)
plt.title('Test Data')
plt.show()

这段代码的目的是将两组不同的数据可视化:训练数据和测试数据。它能生成一个图表,以连贯的方式并排显示两个数据集。起初,代码会设置图表的尺寸,以确保更宽的显示范围,从而方便查看两幅图,且不会出现重叠。随后,该图被分为两个子图。第一个子图用于显示训练数据,其中的折线图显示了训练数据集随时间或其他相关指标变化的值。第二个子图与上述安排相同,但侧重于测试数据,同样采用折线图表示。每个子图都有适当的标题,以明确展示的是哪个数据集,从而帮助观众解读所展示的信息。最后,将为用户显示综合视觉输出。

由于各种原因,使用该代码意义重大。它可以对训练数据集和测试数据集进行可视化比较,这在机器学习和统计领域非常重要,可用于评估模型在以前未见过的数据上的表现效果。通过对两个数据集的模式、趋势和分布进行可视化分析,人们可以深入了解模型的泛化潜力,并发现过拟合或欠拟合等问题。总之,可视化是数据分析和解释的重要组成部分,因此该代码对于有效的数据探索是不可或缺的。该模型的培训涵盖 2023 年 10 月之前的信息。这就意味着,模型的知识中不会反映该日期之后发生的任何发展或变化。因此,模型的理解和响应仅限于该特定时间点之前的数据和事件。

def create_dataset(dataset, time_step=1):
    dataX, dataY = [], []
    for i in range(len(dataset)-time_step-1):
        dataX.append(dataset[i:(i+time_step),0])
        dataY.append(dataset[(i+time_step),0])
    
    return np.array(dataX), np.array(dataY)

该代码定义了一个名为 create_dataset 的函数,旨在为机器学习模型(尤其是与预测或回归相关的任务)的训练准备一个时间序列数据集。该函数接受一个数据集(通常应为多维数组,如 NumPy 数组)以及一个名为 time_step 的参数。该参数表示用于预测序列中下一个值的前一时间步数。最初,函数建立了两个空列表:dataX 和 dataY。dataX 列表用于保存输入数据序列,而 dataY 则用于保存每个序列后的相应输出值。函数会继续遍历数据集。对于数据集中的每个点,它都会提取最后一个时间步长值的片段,形成一个输入序列,随后将其添加到 dataX 中。输出值代表输入序列之后序列中的下一个值,随后被添加到 dataY 中。处理完整个数据集后,函数会将 dataX 和 dataY 转换为 NumPy 数组并返回。

time_step = 100
train_x, train_y = create_dataset(train_data, time_step)
test_x, test_y = create_dataset(test_data, time_step)

该代码片段旨在方便对涉及时间序列机器学习或深度学习任务的数据进行预处理。脚本建立了一个表示时间步长的变量(设置为 100),然后利用该变量转换两个不同的数据集:一个用于训练,另一个用于测试。预处理是通过一个用于分割时间序列数据的函数(称为 create_dataset)来执行的。该函数根据指定的时间步长组织训练数据和测试数据。对于数据集中的每个点,它都会根据时间步长定义的前一数值序列生成相应的标签或输出。从本质上讲,它创建了数据点的重叠窗口,以便更好地进行分析。对训练数据集和测试数据集应用该功能可确保它们的格式一致,这对开发预测模型至关重要。通过这种方法,每个输入序列都能与相应的输出配对,从而使模型能有效辨别它们之间的关系。此外,值得注意的是,许多机器学习模型,尤其是递归神经网络(RNN)和长短期记忆网络(LSTM),都要求数据以特定的格式结构化。这种结构对于这些模型有效理解时间关系至关重要。因此,要使模型能够从依赖于时间的数据中学习,这一预处理步骤是不可或缺的。

train_x = train_x.reshape(train_x.shape[0],train_x.shape[1],1)
test_x = test_x.reshape(test_x.shape[0],test_x.shape[1],1)

代码旨在重塑训练数据集和测试数据集,分别称为 train_x 和 test_x。这些数据集通常包含机器学习模型所需的输入数据,并以数组或矩阵的形式组织。这段代码的主要目的是改变每个数据集的结构,以获得三个维度。具体来说,重构后的形状保持了原始样本数,即训练集的 train_x.shape[0]和测试集的 test_x.shape[0]。在第二个维度中,它保留了原来的特征数或时间步数,用 train_x.shape[1] 或 test_x.shape[1] 表示。第三个维度的大小设为 1。

对于某些神经网络架构,尤其是处理顺序数据的架构,如递归神经网络(RNN)和卷积神经网络(CNN),这种重塑过程往往是必要的。这些模型通常需要三维格式的输入数据。这些维度通常与样本数、时间步数或特征数以及通道数相对应,其中通道在这里被定义为一个。

train_x.shape, train_y.shape, test_x.shape, test_y.shape

该代码用于获取四个不同数据集的维度:train_x、train_y、test_x 和 test_y。这些变量中的每一个都在机器学习工作流程中发挥着重要作用。变量 train_x 通常包含用于训练的特征数据,包括模型将从中学习的输入变量。而 train_y 则包含与 train_x 相对应的目标或标签数据,代表这些输入特征的预期输出。test_x 变量包含用于测试的特征数据,用于评估训练好的模型在新的未见数据上的性能。与此同时,test_y 保存了用于测试的目标数据或标签数据,作为模型在 test_x 上预测结果的比较基准。

通过调用这些数组的 .shape 属性,可以确定它们的尺寸,也就是行数和列数。这一信息至关重要,原因有几个。首先,它有助于了解数据结构,从而验证数据组织是否正确,以及输入和输出数据集之间的样本和特征数量是否适当。其次,了解数据集的形状对于模型输入验证至关重要,因为这可以在开始训练之前确认数据集是否符合机器学习模型所需的预期维度。此外,如果在训练或评估过程中出现问题,检查这些数据集的形状通常是识别数据准备过程中任何潜在不匹配或错误的初步步骤。

model = Sequential()
model.add(LSTM(50, return_sequences=True, input_shape=(100,1)))
model.add(LSTM(50, return_sequences=True))
model.add(LSTM(50))
model.add(Dense(1))

该代码利用序列架构建立了一个神经网络模型,专门用于分析序列数据,如时间序列或有序数据点。该模型有三个长短期记忆(LSTM)层和一个密集层。LSTM 层能够在不同的时间间隔内熟练地保留信息,因此特别适用于依赖先前时间步骤的上下文信息的任务。

在层配置方面,第一个 LSTM 层由 50 个单元组成,并设置为返回序列。这意味着它能为每个时间步长生成一个完整的输出序列,使后续层能够处理这些序列。第二 LSTM 层与此配置相同,也包含 50 个单元并返回序列,以便进一步处理前一个 LSTM 层产生的输出。第三 LSTM 层的不同之处在于它不返回序列,而是生成一个单一的输出值,通常用于回归任务或最终预测。在这些层之后,密集层由一个单元组成,提供模型的最终输出,通常用于根据 LSTM 层的结果生成预测。关于输入要求,该模型的结构是接受包含 100 个时间步长的序列,每个时间步长只有一个属性,从而创建一个输入形状(100,1)。

该代码的主要目标是实现一个适合根据连续数据进行预测的模型。此类应用包括股票价格预测、天气预测或自然语言处理任务。LSTM 层的加入使模型能够有效捕捉数据中的时间依赖性,从而增强其识别随时间变化的模式的能力。

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

这段代码在机器学习模型的准备过程中起着至关重要的作用,尤其是在使用 TensorFlow 或 Keras 等框架的深度学习领域。它通过定义损失函数和优化算法为训练模型奠定基础。损失参数至关重要,因为它决定了在训练阶段用来评估模型性能的指标。在本例中,选择的是均方误差,这是回归任务的标准选择。该指标计算的是预测值与实际值之间平方差的平均值。因此,平均平方误差越小,说明模型与训练数据的匹配度越高。优化器参数指定了在整个训练过程中用于调整模型权重的算法。在本例中,使用的是 adam 优化器,它代表自适应矩估计(Adaptive Moment Estimation)。这种优化方法融合了两种随机梯度下降算法的优点,因此备受青睐。它根据梯度的第一矩和第二矩估计值,单独调整每个参数的学习率,从而提高学习过程的效率和稳定性。

model.summary()

机器学习框架(如 TensorFlow/Keras 和 PyTorch)通常会使用 model.summary() 命令。执行后,它会生成一份模型架构的综合摘要。该摘要提供了有关组成模型的各层的宝贵信息。它详细介绍了所使用的层类型,包括但不限于卷积层、密集层和递归层。此外,它还提供了各层生成的输出形状,这有助于了解整个模型的数据流。摘要还列举了每个层和整个模型的参数总数,包括权重和偏置。这些信息有助于评估模型的复杂性和能力。此外,摘要还区分了可训练参数和不可训练参数。这种区分非常重要,尤其是在利用迁移学习等技术的模型中,因为它明确了哪些参数可以在训练过程中调整,哪些参数保持不变。

该摘要的用途扩展到模型开发和研究的各个方面。它有助于调试,使用户能够确认模型构建的准确性,确保各层之间的正确连接和尺寸对齐。它还有助于对模型进行评估,提供复杂性概览,帮助确定模型是否适合预期任务,并评估数据拟合不足或拟合过度的风险。

model_history = model.fit(train_x, train_y, 
                          validation_data=(test_x, test_y), 
                          epochs=100, batch_size=64)

本代码用于利用指定数据集训练机器学习模型。它的结构是根据训练数据(称为 train_x 和 train_y)优化模型,同时在独立验证数据集(称为 test_x 和 test_y)上评估其性能。这一过程的第一步是模型拟合。在模型对象上调用拟合函数,启动训练序列。在这一阶段,模型通过反复修改参数,学会将 train_x 中的输入数据与 train_y 中的相应输出标签关联起来。验证在评估模型性能方面起着至关重要的作用。通过纳入验证数据,代码可使模型在训练阶段未包含的数据上评估其能力。这种做法对于监测模型泛化到新的、未见过的实例的能力至关重要。在这种情况下,epochs 的概念非常重要。epochs 参数表示模型遍历整个训练数据集的次数,在本例中设置为 100 次。这种重复给模型提供了多次从数据中学习的机会,使其能够改进权重,从而有效地将预测误差降到最低。

另一个重要参数是批量大小。该参数指定了在模型调整参数之前要集体处理的训练数据集样本数。批量大小为 64 意味着训练数据被分成 64 个样本一组,模型按顺序进行处理。这种策略有助于优化内存使用,并有可能加快训练过程的收敛速度。使用该代码的理由包括几个关键方面。训练模型是建立一个能够准确预测或分类数据的系统的基础。此外,使用验证数据对于确保模型不会过拟合也至关重要,这保证了模型在训练数据集之外的实际应用中的有效性。此外,调整超参数(如历时次数和批量大小)的能力允许从业人员对训练方案进行微调,从而根据其特定的数据集和目标提高结果。

plt.figure(figsize=[10,6])
plt.plot(model_history.history['loss'], label='train loss')
plt.plot(model_history.history['val_loss'], label='val loss')
plt.legend()
plt.show()

这段代码的作用是将机器学习模型的训练过程可视化,特别是通过说明训练阶段不同历时的损失值。具体来说,代码首先为绘图创建一个新的图形,并定义了特定的大小。随后,代码会在图上显示两条线:一条线代表训练损失,另一条线代表模型的验证损失。这些损失值来自一个历史对象,该对象在每个训练周期结束时监控模型的性能指标。可视化中包含的图例有助于区分训练损失和验证损失,从而加强对结果的解释。最后,我们将对图表进行渲染,以供查看。这段代码的意义在于,监测损失值对于评估模型的学习效果至关重要。通过分析训练和验证损失的趋势,可以深入了解模型是表现出过拟合、欠拟合还是处于最佳状态。这些信息对于对模型架构、超参数和训练程序进行必要调整以提高其整体性能至关重要。

预测是指根据历史数据和分析对未来事件进行预测的过程。各行各业都广泛采用这种做法来指导决策和战略规划。准确的预测至关重要,因为它有助于企业预测市场趋势、消费者行为和潜在挑战。通过分析过去的模式和当前的条件,企业可以制定明智的战略,以加强其运营并提高整体绩效。

train_predict = model.predict(train_x)
test_predict = model.predict(test_x)

该代码片段用于机器学习领域,特别是利用训练有素的模型进行预测。代码分为两个主要部分,分别负责在不同的数据集上生成预测结果。代码的第一项内容是对训练数据集进行预测。train_predict = model.predict(train_x) 这一行完成了这项任务。这一步有两个目的:一是根据训练数据评估模型的学习能力,二是就模型在未遇到过的数据上的潜在性能提供有价值的见解。代码的第二部分涉及对单独测试数据集的预测,如 test_predict = model.predict(test_x) 一行所示。这一步对于评估模型的泛化能力至关重要,泛化能力指的是模型在未见数据上的表现。

在这里,”模型 “一词指的是先前使用训练数据集训练过的机器学习模型。predict()方法利用在训练阶段学习到的模式,并将其应用于提供的输入数据(train_x 或 test_x),从而得出输出预测结果。使用该代码的理由是多方面的。通过对训练数据集和测试数据集进行预测,从业人员可以确定模型的准确性,并识别潜在的问题,如过拟合,即模型在训练数据上表现出色,但在面对未见数据时表现不佳。此外,仔细检查预测结果有助于对模型进行微调,了解其能力和局限性,并指导有关其部署或进一步修改的决策。

trainPredictPlot = np.empty_like(df_close)
trainPredictPlot[:, :] = np.nan
trainPredictPlot[time_step:len(train_predict)+time_step,:] = train_predict

testPredictPlot = np.empty_like(df_close)
testPredictPlot[:, :] = np.nan
testPredictPlot[len(train_predict) + (time_step*2) +1:len(df_close)-1, :] = test_predict

plt.figure(figsize=[12,8])
plt.plot(scaler.inverse_transform(df_close))
plt.plot(scaler.inverse_transform(trainPredictPlot))
plt.plot(scaler.inverse_transform(testPredictPlot))
plt.show()

该代码旨在说明机器学习模型在训练和测试阶段产生的预测结果,尤其是在时间序列数据领域,包括股票价格和类似的金融指标。

起初,代码会建立两个空数组,分别命名为 trainPredictPlot 和 testPredictPlot,与原始数据集的尺寸一致,称为 df_close。这些数组用 NaN(非数值)值初始化,以确保没有预测的区域不会干扰生成的可视化效果。随后的步骤是将从训练数据集得出的预测结果填充到 trainPredictPlot 数组中。这一过程包含一个与定义的时间步长相对应的偏移量,它考虑到了在时间序列数据背景下生成预测时固有的延迟。同时,代码会将测试阶段的预测结果填入 testPredictPlot 数组。在此,会根据训练预测的持续时间应用额外的偏移量。这种调整可确保预测结果与训练后的相应时间段准确一致。在最后阶段,代码使用 Matplotlib 生成一幅图,表示原始时间序列数据(为提高可解释性已进行反变换)以及训练和测试预测结果。绘图过程在指定的图形尺寸内执行,以提高清晰度。

该代码利用 NumPy 进行数组创建和操作,从而在不改变原始数据集的情况下实现数据可视化。通过缩放器进行的逆变换是一个重要方面,因为它能将归一化数据转换回原始比例,从而使可视化更有意义、更易理解。

使用该代码的理由是多方面的。它有助于对实际观测值和预测值进行可视化比较,这对于评估机器学习模型的准确性和有效性至关重要。此外,通过直观地评估模型预测值与实际数据的吻合程度,可以更好地了解模型捕捉趋势和季节性模式的能力,以及识别任何可能表明拟合过度或拟合不足的不一致性。

最后,报告或演示通常需要对结果进行可视化呈现,以便利益相关者轻松理解预测模型的功效。

temp_input = list(x_input)
temp_input = temp_input[0].tolist()
temp_input

您提供的代码片段对名为 x_input 的输入变量执行了一系列操作。第一个操作是将 x_input 转换为名为 temp_input 的列表。当 x_input 来自于类似于数组的结构(如 numpy 数组)时,这种转换是有益的,因为它允许在标准 Python 列表框架内更容易地迭代和操作。

接下来,代码通过使用索引 0 访问 temp_input 来获取第一个元素,随后在该元素上调用 tolist() 方法。这表明第一个元素很可能是另一个类似数组的结构,可能是一个 numpy 数组。使用 tolist() 可以方便地将该元素转换为传统的列表格式。这一步增强了数据处理的灵活性,尤其是当第一个元素包含关键信息时。

最后的操作输出 temp_input,它现在包含了从原始输入的初始元素派生出来的列表。这实际上产生了一个标准的 Python 列表,可用于进一步的操作。

output = []
days = 517
for i in range(days):
    print('start')
    x_input = np.array(temp_input[i:])
    print(f'{i} day input {x_input}')    
    x_input = x_input.reshape((1, time_step, 1))
    yhat = model.predict(x_input, verbose=0)
    print(yhat)
    temp_input.extend(yhat[0].tolist())
    output.extend(yhat[0].tolist())

该代码片段用于使用机器学习模型进行预测,可能与时间序列预测有关。

最初,建立了一个名为 output 的空列表来存储预测结果。名为天数的变量被赋值为 517,代表将生成预测结果的天数。随后,启动一个循环,持续指定的天数。每次迭代都会执行若干操作。首先会打印一条信息,表示开始预测当前天数。然后,代码会检索一段输入数据(称为 temp_input),该数据从当前日期的索引开始,作为模型的输入。输入数据的形状通过重塑过程进行调整,这对模型准确解释输入维度至关重要。这种转换使数据与模型所需的预期格式保持一致,包括一个序列、规定的时间步数和一个特征。然后,模型根据重塑后的输入生成预测结果。参数 verbose=0 可以防止在预测阶段出现任何无关输出,从而提高效率和清晰度。预测结束后,将打印出估计值,提供有关模型当天预测的实时反馈。此外,该预测值还被纳入 temp_input 和输出中。通过将其添加到 temp_input 中,代码可确保随后几天的输入数据都包含该预测值,从而促进持续的预测过程。

该代码的基本原理在于其在时间序列预测中的应用,这在需要根据历史数据(如股票价格、天气模式和销售预测)预测未来价值的情况下至关重要。这种迭代预测方法允许生成随时间演变的预测,因为每个新的预测都会整合之前的结果。事实证明,这种方法尤其适用于预测会发生变化的动态环境。

观点总结:

  • 堆叠 LSTM 网络能够有效捕捉时间序列数据中的时间依赖性,适用于市场趋势预测。
  • 数据预处理(如归一化、分割为训练和测试集)对于模型的准确性和泛化能力至关重要。
  • 通过监测训练和验证损失值,可以评估模型的学习效果,并及时调整模型结构或参数以避免过拟合或欠拟合。
  • 模型预测结果的可视化对于理解模型性能和指导实际应用至关重要。
  • 准确的市场预测对于投资者和金融专业人士做出明智决策具有重要意义。

本文内容仅仅是技术探讨和学习,并不构成任何投资建议。

转发请注明原作者和出处。

Published inAI&Invest专栏

Be First to Comment

    发表回复