LBL-LSTM模型:考虑银行贷款利率的股票预测新方法

需积分: 9 1 下载量 134 浏览量 更新于2024-08-09 收藏 1.01MB PDF 举报
"Lbl - Lstm:考虑外部波动因素的基于对数双线性和长期短期记忆的高效股票预测模型-研究论文" 这篇研究论文探讨的是在股票市场预测领域中,如何结合对数双线性(LogBilinear)和长期短期记忆(LSTM)神经网络来构建一个更高效的模型,以应对股票市场的高波动性。股票市场预测是一个复杂的任务,通常被归类为NP-hard问题,因为它涉及到大量的不确定性、非线性动态以及大量数据的处理。传统的机器学习算法在处理这类问题时可能面临挑战。 文章指出,外部波动因素,如银行的贷款利率,对股票市场的影响至关重要。银行的贷款利率变动会影响企业的财务状况,进而影响投资者的决策,特别是在金融危机期间。因此,将这种外部因素纳入模型的考虑范围是提高预测准确性的关键。 在模型构建部分,作者提出了LBL-LSTM模型,这是一种结合了对数双线性模型和LSTM神经网络的方法。对数双线性模型能够有效地处理高维数据并捕获复杂的相互作用,而LSTM则擅长处理时间序列数据,能记忆过去的信息,适应股票市场的长期依赖性。通过将这两个模型结合,作者期望能够更精确地预测股票价格的变化。 实验结果表明,提出的LBL-LSTM模型相对于现有的机器学习算法,如支持向量机、决策树、随机森林等,在股票市场预测上表现出更好的性能。这可能是由于模型能够同时理解和利用外部经济因素与股票市场的内在动态。 关键词涵盖了数据挖掘、人工智能、股票市场预测、LSTM以及机器学习算法,强调了该研究的多学科性质和应用范围。数据挖掘技术用于从海量金融数据中提取有价值的信息,人工智能则提供了解决复杂问题的能力,而LSTM作为机器学习的一种,特别适用于处理时间序列数据的预测问题。 这篇论文展示了如何通过创新的模型设计,结合现实世界的经济因素,提高股票市场预测的准确性和效率。这对于金融市场分析、投资决策制定以及金融风险管理具有重要的实践意义。未来的研究可能进一步探索更多的外部因素以及更复杂的神经网络架构,以优化预测模型。

import numpy as np import matplotlib.pyplot as plt import pickle as pkl import pandas as pd import tensorflow.keras from tensorflow.keras.models import Sequential, Model, load_model from tensorflow.keras.layers import LSTM, GRU, Dense, RepeatVector, TimeDistributed, Input, BatchNormalization, \ multiply, concatenate, Flatten, Activation, dot from sklearn.metrics import mean_squared_error,mean_absolute_error from tensorflow.keras.optimizers import Adam from tensorflow.python.keras.utils.vis_utils import plot_model from tensorflow.keras.callbacks import EarlyStopping from keras.callbacks import ReduceLROnPlateau df = pd.read_csv('lorenz.csv') signal = df['signal'].values.reshape(-1, 1) x_train_max = 128 signal_normalize = np.divide(signal, x_train_max) def truncate(x, train_len=100): in_, out_, lbl = [], [], [] for i in range(len(x) - train_len): in_.append(x[i:(i + train_len)].tolist()) out_.append(x[i + train_len]) lbl.append(i) return np.array(in_), np.array(out_), np.array(lbl) X_in, X_out, lbl = truncate(signal_normalize, train_len=50) X_input_train = X_in[np.where(lbl <= 9500)] X_output_train = X_out[np.where(lbl <= 9500)] X_input_test = X_in[np.where(lbl > 9500)] X_output_test = X_out[np.where(lbl > 9500)] # Load model model = load_model("model_forecasting_seq2seq_lstm_lorenz.h5") opt = Adam(lr=1e-5, clipnorm=1) model.compile(loss='mean_squared_error', optimizer=opt, metrics=['mae']) #plot_model(model, to_file='model_plot.png', show_shapes=True, show_layer_names=True) # Train model early_stop = EarlyStopping(monitor='val_loss', patience=20, verbose=1, mode='min', restore_best_weights=True) #reduce_lr = ReduceLROnPlateau(monitor='val_loss', factor=0.2, patience=9, verbose=1, mode='min', min_lr=1e-5) #history = model.fit(X_train, y_train, epochs=500, batch_size=128, validation_data=(X_test, y_test),callbacks=[early_stop]) #model.save("lstm_model_lorenz.h5") # 对测试集进行预测 train_pred = model.predict(X_input_train[:, :, :]) * x_train_max test_pred = model.predict(X_input_test[:, :, :]) * x_train_max train_true = X_output_train[:, :] * x_train_max test_true = X_output_test[:, :] * x_train_max # 计算预测指标 ith_timestep = 10 # Specify the number of recursive prediction steps # List to store the predicted steps pred_len =2 predicted_steps = [] for i in range(X_output_test.shape[0]-pred_len+1): YPred =[],temdata = X_input_test[i,:] for j in range(pred_len): Ypred.append (model.predict(temdata)) temdata = [X_input_test[i,j+1:-1],YPred] # Convert the predicted steps into numpy array predicted_steps = np.array(predicted_steps) # Plot the predicted steps #plt.plot(X_output_test[0:ith_timestep], label='True') plt.plot(predicted_steps, label='Predicted') plt.legend() plt.show()

2023-06-12 上传