大数跨境
0
0

基于 LSTM 算法的金融市场价格走势预测

基于 LSTM 算法的金融市场价格走势预测 紫光数码企业解决方案
2024-05-23
1
导读:在人工智能领域,Transformer 无疑是当前的明星。它如同科技界的新晋偶像,每次亮相都引起一片惊叹。

在人工智能领域,Transformer 无疑是当前的明星。它如同科技界的新晋偶像,每次亮相都引起一片惊叹。而曾经辉煌一时的 LSTM,如今却有些黯然失色,犹如被遗忘的老兵。正所谓 “新人笑,旧人哭”,在 Transformer 风靡的时代,LSTM 显得有些落寞,被冷落在技术的角落里。


Transformer 就像一个全能超人,身披 Attention 机制的斗篷,拥有惊人的并行处理能力。它擅长处理长文本,利用自注意力机制能 “一心多用”,全面掌握全局。无论是机器翻译还是文本生成,Transformer 都能轻松应对,并且表现出色。因此,它被广泛用于机器翻译、文本生成、文本分类,以及如 BERT 和 GPT 等各种预训练模型。


相比之下,LSTM 更像是一位经验丰富的老将,专注于处理时间序列问题。它通过输入门、遗忘门和输出门这三道 “关卡” 严密控制信息流,确保重要信息不丢失。尽管 LSTM 处理数据是逐步进行的,但在需要长时间依赖的任务中,如时间序列预测、语音识别和较短文本处理,它依然表现得游刃有余。





01

LSTM 在金融市场的应用


自有股市以来,无数人试图发明不同的方法来预测股市,交易者们使用了各种技术指标和技术分析策略进行交易。有些人更聪明,会利用基本面分析甚至行为分析来增加赢得市场的机会。有些方法有效,有些则无效。随着人工智能和机器学习的发展,新的现代股票市场预测方法出现了,即 LSTM 神经网络。


LSTM 在股市预测中的实际应用已经有不少案例和研究报道。例如,J.P. Morgan 的研究团队使用 LSTM 网络来预测市场趋势和资产价格。他们发现,LSTM 模型在处理时间序列数据方面表现优异,特别是在捕捉市场的长期趋势和波动性方面。





02

了解 LSTM


LSTM 是一种神经网络,可以学习长期依赖性,对于预测股票价格很有用,它随着时间的推移检查一系列股票价格,以发现模式并预测未来价格。


想象一下人类如何处理语言。当我们听某人说话时,我们会在前面的单词和整个对话的上下文中理解每个单词。同样,在预测股票价格时,LSTM 依赖于它过去的经验,就像我们依赖我们的知识来理解句子中单词的含义一样。


为了说明 LSTM 的概念,让我们看看预测序列中的下一个数字:


  • 在序列 [6 - 7 - 8 - ] 中,我们期望下一个数字是 9。

  • 然而,在序列 [2 - 4 - 8 - ] 中,我们预计下一个数字是 16。


这就是 LSTM 网络的闪光点。它们擅长捕捉随时间变化的依赖关系,就像我们的大脑在对话过程中适应不断变化的环境一样。随着时间的推移,序列中较旧的输入对预测下一个值的影响较小。LSTM 网络旨在学习何时记住重要信息以及何时忘记不太相关的数据,这是处理不断变化的股市数据格局时的一个关键功能。





03

LSTM 网络如何工作


LSTM 网络的核心是随时间存储和更新信息的记忆细胞。这些存储单元通过控制信息流的门网络连接。LSTM 网络中的三个基本门是:



  1. 遗忘门:该门确定应丢弃或忘记前一时间步中的哪些信息。

  2. 输入门:输入门决定当前时间步中的哪些新信息应存储在存储单元中。

  3. 输出门:输出门选择应使用存储单元中的哪些信息来对当前时间步进行预测。


这些门协同工作以捕获数据中的模式和依赖性。通过在训练期间调整与每个门相关的权重和偏差,LSTM 网络可以有效地学习根据需要记住和忘记信息,以做出准确的预测。


下面我们来一步步介绍如何在 NVIDIA RTX 5880 电脑上使用 LSTM 来预测股市,这将帮助你了解如何将其用于你的目标,例如预测未来 3 天的股价。


免责声明: 该材料纯粹用于教育目的,不应被视为专业的投资建议,投资由您自行决定。





04

LTSM 算法预测部署实例


部署环境


硬件环境:GPU服务器(4张NVIDIA RTX 5880) 

软件环境:Ubuntu 22.04


NVIDIA RTX 5880 Ada

强大性能,成就无限可能


NVIDIA RTX™ 5880 Ada Generation 提供的特性、功能和性能可满足现今专业工作流程的挑战。RTX 5880 基于 NVIDIA Ada Lovelace GPU 架构构建,将第三代 RT Core、第四代 Tensor Core、新一代 CUDA® 核心与 48GB 显存相结合,可提供出色的渲染、图形和计算性能。NVIDIA RTX 5880 驱动的工作站可为您提供所需的功能,助您在当今极具挑战性的商业环境中取得成功。



程序代码


初始设置<<


我们先做一些初始设置:

# 安装yahoo_fin!pip install yahoo_fin
import numpy as npimport time as tmimport datetime as dtimport tensorflow as tf
# 数据准备from yahoo_fin import stock_info as yffrom sklearn.preprocessing import MinMaxScalerfrom collections import deque
# AIfrom keras.models import Sequentialfrom keras.layers import Dense, LSTM, Dropout
# 图像库import matplotlib.pyplot as plt
# 设置
# 窗口大小或序列长度,71周)N_STEPS = 7
# 预测步数,1表示明天,3表示后天LOOKUP_STEPS = [1, 2, 3]
# 股票代码,特斯拉STOCK = 'TSLA'
# 当前日期date_now = tm.strftime('%Y-%m-%d')date_3_years_back = (dt.date.today() - dt.timedelta(days=1104)).strftime('%Y-%m-%d')



加载数据<<


我们需要从 Yahoo 财经中加载数据,这里我们加载 Tesla 股票的 1104 条日线收盘数据:

# 加载数据# 从 yahoo_fin 获取# 1104 个周期,间隔 = 1init_df = yf.get_data(    STOCK,    start_date=date_3_years_back,    end_date=date_now,    interval='1d')
init_df


这里我们可以看到类似以下的输出结果:


我们不需要将所有这些列都放入 LSTM 模型中。我们只需要一列 "收盘价",即当天收盘市场的价格。


# 移除神经网络不使用的列init_df = init_df.drop(['open', 'high', 'low', 'adjclose', 'ticker', 'volume'], axis=1)# 基于索引列创建 'date'init_df['date'] = init_df.index
init_df


下面是只包括收盘价和日期的数据。



有了收盘价和日期,我们来绘制一幅 Tesla 的历史走势图


# 我们先在图表上初步查看数据plt.style.use(style='ggplot')plt.figure(figsize=(16,10))plt.plot(init_df['close'][-200:])plt.xlabel("days")plt.ylabel("price")plt.legend([f'Actual price for {STOCK}'])plt.show()


我们可以看到 Tesla 股票价格在过去一年中的基于收盘价的变化情况。




Scale 缩放数据<<


由于我们使用的是 LSTM 神经网络,我们需要缩放 "Close "列中的数据,因为机器学习算法在缩放数据时比在普通数据时效果更好。因此,我们需要以下代码:

# 为机器学习引擎缩放数据scaler = MinMaxScaler()init_df['close'] = scaler.fit_transform(np.expand_dims(init_df['close'].values, axis=1))
init_df


我们会得到如下运行结果:



我们看到价格在 0 到 1 的范围内缩放。这只是我们需要执行的初步操作,以便让我们的模型以更高的效率运行。



准备数据<<


我们已经为 LSTM 机器学习模型初步加载和缩放了数据。不过,我们还需要为下一步程序做好准备。我们的初始目标是预测未来三天的股票价格。这意味着,我们必须根据要预测的天数移动条形图,并为模型准备相应的数据。在本例中,"close " 列是目标列,我们将对其进行移位,并将结果保存在 "future "列中。这就是我们的移位本身。


def PrepareData(days):  # 创建数据副本  df = init_df.copy()  # 创建 'future' 列,其值为 'close' 列向后移动 days 天的值  df['future'] = df['close'].shift(-days)  # 获取最后 days 天的数据序列  last_sequence = np.array(df[['close']].tail(days))  # 删除包含 NaN 值的行  df.dropna(inplace=True)  # 初始化用于存储序列数据的列表  sequence_data = []  # 使用 deque 存储固定长度的窗口序列  sequences = deque(maxlen=N_STEPS)
 # 遍历数据中的每一行  for entry, target in zip(df[['close'] + ['date']].values, df['future'].values):      # 将当前行添加到序列中      sequences.append(entry)      # 如果序列的长度达到 N_STEPS,则将其添加到序列数据列表中      if len(sequences) == N_STEPS:          sequence_data.append([np.array(sequences), target])
 # 构造最后的序列数据  last_sequence = list([s[:len(['close'])] for s in sequences]) + list(last_sequence)  last_sequence = np.array(last_sequence).astype(np.float32)
 # 构建特征 (X) 和目标 (Y)  X, Y = [], []  for seq, target in sequence_data:      X.append(seq)      Y.append(target)
 # 转换为 numpy 数组  X = np.array(X)  Y = np.array(Y)
 return df, last_sequence, X, Y
PrepareData(3) # 3


我们会看到以下运行结果:




机器学习模型<<


我们在这里使用了 LSTM 神经网络和序列模型,我们有几个 LSTM 层和 Dropout 层,以及最后一个 Dense 层。


  • 参数 "x_train "是数据数组,用于模型训练;

  • 参数 "y_train "是目标列 "close",我们用它来给出训练的答案;

  • LSTM 第一层有 60 个神经元,第二层有 120 个神经元。在 LSTM 层之间还有隐藏层,神经元数量减少了 30% (0.3)。最后,我们有 20 个神经元的 "密集"(Dense)和只有一个神经元的 "密集"(Dense),这是模型最后一步的结果。


def GetTrainedModel(x_train, y_train):  # 创建一个顺序模型  model = Sequential()  # 添加一个 LSTM 层,包含 60 个单元,返回序列,输入形状为 (N_STEPS, 1)  model.add(LSTM(60, return_sequences=True, input_shape=(N_STEPS, len(['close']))))  # 添加 Dropout 层,丢弃 30% 的神经元  model.add(Dropout(0.3))  # 添加一个 LSTM 层,包含 120 个单元,不返回序列  model.add(LSTM(120, return_sequences=False))  # 添加 Dropout 层,丢弃 30% 的神经元  model.add(Dropout(0.3))  # 添加一个全连接层,包含 20 个神经元  model.add(Dense(20))  # 添加一个输出层,包含 1 个神经元  model.add(Dense(1))
 # 设置批量大小和训练轮数  BATCH_SIZE = 8  EPOCHS = 80
 # 编译模型,使用均方误差损失函数和 Adam 优化器  model.compile(loss='mean_squared_error', optimizer='adam')
 # 训练模型  model.fit(x_train, y_train,            batch_size=BATCH_SIZE,            epochs=EPOCHS,            verbose=1)
 # 打印模型摘要  model.summary()
 return model



预测股票价格<<


现在,我们已经具备了开始预测 Tesla 股票未来 3 天价格所需的一切。


# 获取预测值predictions = []
for step in LOOKUP_STEPS:  # 准备数据  df, last_sequence, x_train, y_train = PrepareData(step)  x_train = x_train[:, :, :len(['close'])].astype(np.float32)
 # 获取训练好的模型  model = GetTrainedModel(x_train, y_train)
 # 准备最后的序列数据  last_sequence = last_sequence[-N_STEPS:]  last_sequence = np.expand_dims(last_sequence, axis=0)  # 进行预测  prediction = model.predict(last_sequence)  # 将预测值逆缩放回原始范围  predicted_price = scaler.inverse_transform(prediction)[0][0]
 # 将预测值四舍五入并添加到预测列表中  predictions.append(round(float(predicted_price), 2))


我们看到如下运行结果:



从列表中我们可以看到,"损失 "等于 0.0034,约为缩放值的 3%。


运行下面的代码,我们得到未来三天的预测价格

# if bool(predictions) == True and len(predictions) > 0:  # 将预测值转换为字符串并添加美元符号  predictions_list = [str(d) + '$' for d in predictions]  # 将预测值列表转换为字符串,使用逗号分隔  predictions_str = ', '.join(predictions_list)  # 创建消息字符串,包含股票代码和未来 3 天的预测值  message = f'{STOCK} prediction for upcoming 3 days ({predictions_str})'
 # 打印消息  print(message)


我们得到如下 Tesla 股票未来三天的预测价格:

TSLA prediction for upcoming 3 days (180.1$, 173.88$, 186.67$)



结果图表<<


最后我们输出历史数据和预测图的对比走势

# 为整个历史范围执行模型copy_df = init_df.copy()y_predicted = model.predict(x_train)y_predicted_transformed = np.squeeze(scaler.inverse_transform(y_predicted))first_seq = scaler.inverse_transform(np.expand_dims(y_train[:6], axis=1))last_seq = scaler.inverse_transform(np.expand_dims(y_train[-3:], axis=1))y_predicted_transformed = np.append(first_seq, y_predicted_transformed)y_predicted_transformed = np.append(y_predicted_transformed, last_seq)copy_df[f'predicted_close'] = y_predicted_transformed
# 将预测结果添加到表中date_now = dt.date.today()date_tomorrow = dt.date.today() + dt.timedelta(days=1)date_after_tomorrow = dt.date.today() + dt.timedelta(days=2)
copy_df.loc[date_now] = [predictions[0], f'{date_now}', 0, 0]copy_df.loc[date_tomorrow] = [predictions[1], f'{date_tomorrow}', 0, 0]copy_df.loc[date_after_tomorrow] = [predictions[2], f'{date_after_tomorrow}', 0, 0]
# 结果图表plt.style.use(style='ggplot')plt.figure(figsize=(16,10))plt.plot(copy_df['close'][-150:].head(147))plt.plot(copy_df['predicted_close'][-150:].head(147), linewidth=1, linestyle='dashed')plt.plot(copy_df['close'][-150:].tail(4))plt.xlabel('days')plt.ylabel('price')plt.legend([f'Actual price for {STOCK}',            f'Predicted price for {STOCK}',            f'Predicted price for future 3 days'])plt.show()


下图显示了未来 3 天的预测价格(紫色小线)、整个期间的预测价格(蓝色虚线)和实际价格(橙色实线),紫色小线标出了未来 3 天的预测价格走势。






05

LSTM 股价预测的局限性


使用 LSTM 神经网络进行股票价格预测存在许多限制。一个限制是 LSTM 模型需要大量历史数据来训练。另一个限制是 LSTM 模型很复杂并且难以调整。此外,LSTM 模型容易出现过度拟合,从而导致对新数据的预测不准确。





06

结论


未来,机器学习将在金融领域得到更广泛的应用。通过深度学习、强化学习和迁移学习等技术,算法将变得更加复杂和精确。企业将能够利用人工智能系统分析大量数据,检测复杂模式和关系,从而对市场做出极其准确的预测。这将极大地改善投资方式和金融业的运作方式。


在这一进程中,NVIDIA GPU 发挥着关键作用。其强大的计算能力和并行处理性能,使得复杂的深度学习模型能够高效地进行训练和推理,显著加速了金融算法的开发和部署。因此,NVIDIA GPU 不仅推动了技术进步,也成为金融科技创新的重要基石。


欢迎扫码关注,

获取更多精彩资讯!

【声明】内容源于网络
0
0
紫光数码企业解决方案
第一时间获取紫光数码企业级解决方案、成功案例介绍,报名市场活动。
内容 283
粉丝 0
紫光数码企业解决方案 第一时间获取紫光数码企业级解决方案、成功案例介绍,报名市场活动。
总阅读6
粉丝0
内容283