国庆放假闲着没事就拿chatgpto1指导下使用LSTM模型对深证股票未来30天成交额做了一个神经网络训练预测,使用了之前1200天的成交额数据做的预测。
这是预测结果,看起来还是像模像样。未来30天的成交额预测值:
Value in Billions
12645.969 亿
10991.534 亿
9643.2554 亿
8873.3339 亿
8516.6437 亿
8360.9931 亿
8265.0641 亿
8158.7267 亿
8019.8382 亿
7852.439 亿
7670.5137 亿
7488.089 亿
7314.9179 亿
7155.9165 亿
7012.3645 亿
6883.4709 亿
6767.6032 亿
6663.0307 亿
6568.2611 亿
6482.1133 亿
6403.6726 亿
6332.2115 亿
6267.1068 亿
6207.8006 亿
6153.7681 亿
6104.5139 亿
6059.5713 亿
6018.5097 亿
5980.9327 亿
5946.4824 亿
这是gpt写的python代码,具体怎么用可以试试把代码发给gpt问它。
import pandas as pd
import numpy as np
from sklearn.preprocessing import MinMaxScaler
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Dropout
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
import matplotlib.pyplot as plt
# 读取数据
data = pd.read_csv('extracted_data.csv', header=None)
data.columns = ['timestamp', 'total_transaction_value']
# 将时间戳转换为日期
data['date'] = pd.to_datetime(data['timestamp'], unit='ms')
# 设置日期为索引
data.set_index('date', inplace=True)
# 只保留总成交额数据
transaction_values = data['total_transaction_value'].values.reshape(-1,1)
# 归一化数据
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(transaction_values)
# 创建LSTM所需的输入格式(使用90天的数据)
def create_dataset(dataset, time_step=90):
X, y = [], []
for i in range(time_step, len(dataset)):
X.append(dataset[i-time_step:i, 0]) # 使用time_step长度的历史数据
y.append(dataset[i, 0]) # 预测下一个时间步的值
return np.array(X), np.array(y)
# 使用90天的时间步长
time_step = 90 # 使用过去90天的成交额数据进行预测
X, y = create_dataset(scaled_data, time_step)
# 划分训练集和验证集(80%训练,20%验证)
train_size = int(len(X) * 0.8)
X_train, X_val = X[:train_size], X[train_size:]
y_train, y_val = y[:train_size], y[train_size:]
# 调整输入数据的形状为 [样本数, 时间步长, 特征]
X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1)
X_val = X_val.reshape(X_val.shape[0], X_val.shape[1], 1)
# 构建3层LSTM模型,使用75个神经元
model = Sequential()
# 第一层 LSTM
model.add(LSTM(units=75, return_sequences=True, input_shape=(X_train.shape[1], 1)))
model.add(Dropout(0.2)) # 加入Dropout来防止过拟合
# 第二层 LSTM
model.add(LSTM(units=75, return_sequences=True)) # 保留序列传递到下一层
model.add(Dropout(0.2))
# 第三层 LSTM
model.add(LSTM(units=75, return_sequences=False)) # 最后一层LSTM,不需要传递整个序列
model.add(Dropout(0.2))
# 全连接层 Dense
model.add(Dense(units=25)) # 全连接层,神经元数量可以根据需要调整
model.add(Dense(units=1)) # 输出层,预测一个值
# 编译模型
model.compile(optimizer='adam', loss='mean_squared_error')
# 使用早停机制(early stopping)和模型保存机制(model checkpoint)
early_stop = EarlyStopping(monitor='val_loss', patience=10, restore_best_weights=True)
model_checkpoint = ModelCheckpoint('best_lstm_model.h5', save_best_only=True, monitor='val_loss', mode='min')
# 训练模型,监控验证集损失,使用早停机制
model.fit(X_train, y_train, validation_data=(X_val, y_val), batch_size=64, epochs=100, verbose=1,
callbacks=[early_stop, model_checkpoint])
# 加载训练期间保存的最佳模型
model = tf.keras.models.load_model('best_lstm_model.h5')
# 预测未来30天的成交额
future_predictions = []
last_90_days = scaled_data[-time_step:] # 使用最近的90天作为预测的初始输入
for _ in range(30): # 预测未来30天
X_input = last_90_days.reshape(1, -1, 1) # 保持输入为(1, 90, 1)的形状
next_pred = model.predict(X_input)
future_predictions.append(next_pred[0][0])
# 更新last_90_days,将预测值加入到后续预测中,同时保持其长度为90
last_90_days = np.append(last_90_days[1:], next_pred).reshape(-1, 1)
# 反归一化未来30天的预测值
future_predictions = scaler.inverse_transform(np.array(future_predictions).reshape(-1, 1))
# 打印未来30天的预测结果
print("未来30天的成交额预测值:")
print(future_predictions)
# 可视化实际值与未来预测值的比较
plt.figure(figsize=(14, 7))
plt.plot(transaction_values, label='历史成交额')
plt.plot(range(len(transaction_values), len(transaction_values) + 30), future_predictions, label='未来30天预测值', color='red')
plt.title('未来30天的成交额预测 (使用90天历史数据,75个神经元)')
plt.xlabel('时间')
plt.ylabel('成交额')
plt.legend()
plt.savefig('transaction_future_prediction_90_days_optimized.png') # 保存未来预测图像
plt.show()
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END