LSTM股票预测代码

  • 研究目的:使用 LSTM 模型预测股票价格。

导入python包

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

#获取股票数据
def get_stock_data(stock_code):
return ak.stock_zh_a_daily(symbol=stock_code, adjust="qfq")

#预处理数据
def preprocess_data(stock_data):
data = stock_data.filter(['close'])
dataset = data.values
training_data_len = int(np.ceil(len(dataset) * .8))
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(dataset)
return scaled_data, training_data_len, scaler

#创建训练数据集
def create_train_data(scaled_data, training_data_len):
train_data = scaled_data[0:int(training_data_len), :]
x_train = []
y_train = []
for i in range(60, len(train_data)):
x_train.append(train_data[i-60:i, 0])
y_train.append(train_data[i, 0])
x_train, y_train = np.array(x_train), np.array(y_train)
x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1))
return x_train, y_train

#创建LSTM模型
def create_lstm_model():
model = Sequential()
model.add(LSTM(128, return_sequences=True, input_shape=(60, 1)))
model.add(LSTM(64, return_sequences=False))
model.add(Dense(25))
model.add(Dense(1))
return model

#编译并训练模型
def compile_and_train_model(model, x_train, y_train):
model.compile(optimizer='adam', loss='mean_squared_error')
history = model.fit(x_train, y_train, batch_size=1, epochs=10, verbose=2)
return model, history.history['loss']

#创建测试数据集
def create_test_data(scaled_data, training_data_len):
test_data = scaled_data[training_data_len - 60:, :]
x_test = []
y_test = [] # 将 y_test 初始化为空列表
for i in range(60, len(test_data)):
x_test.append(test_data[i-60:i, 0])
y_test.append(test_data[i, 0]) # 现在可以使用 append 方法了
x_test = np.array(x_test)
x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1))
y_test = np.array(y_test)
return x_test, y_test

#预测股票价格
def predict_prices(model, x_test, scaler):
predictions = model.predict(x_test)
predictions = scaler.inverse_transform(predictions)
return predictions

#生成预测结果图
def plot_results(train, valid, predictions):
plt.figure(figsize=(16,8))
plt.title('Model')
plt.xlabel('Date', fontsize=18)
plt.ylabel('Close Price USD ($)', fontsize=18)
valid['date'] = pd.to_datetime(valid['date']) # 将字符串日期转换为datetime.date对象
plt.plot(valid['date'][valid['date'] <= '2024-06-30'], valid['close'][valid['date'] <= '2024-06-30'])
plt.plot(valid['date'][valid['date'] <= '2024-06-30'], valid['close'][valid['date'] <= '2024-06-30'], label='Val')
plt.plot(valid['date'][valid['date'] <= '2024-06-30'], valid['Predictions'][valid['date'] <= '2024-06-30'], label='Predictions')
plt.legend(['Train', 'Val', 'Predictions'], loc='lower right')
plt.show()

# 生成训练过程中损失的相关图
def plot_loss(loss_history):
plt.figure(figsize=(10,6))
plt.plot(loss_history, label='Training Loss')
plt.title('Training Loss Over Epochs')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()

调用函数
if __name__ == "__main__":
stock_code = "sh600519"
stock_name = "贵州茅台"
stock_data = get_stock_data(stock_code)
scaled_data, training_data_len, scaler = preprocess_data(stock_data)
x_train, y_train = create_train_data(scaled_data, training_data_len)
model = create_lstm_model()
model, loss_history = compile_and_train_model(model, x_train, y_train)
plot_loss(loss_history)
x_test, y_test = create_test_data(scaled_data, training_data_len)
predictions = predict_prices(model, x_test, scaler)
train = stock_data[:training_data_len]
valid = stock_data[training_data_len:]
valid['Predictions'] = predictions
plot_results(train, valid, predictions)

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值