Python使用LSTM预测未来值:如何修改代码实现超训练集日期预测
LSTM股票预测代码新增未来日期预测功能的修改方案
你的现有代码仅能在已有数据集范围内做回溯验证,核心原因是所有预测输入都使用已有的真实收盘价数据,要预测超出数据集的未来价格,不需要调整原有模型训练参数,新增滚动预测逻辑即可。
关键参数说明
- 代码中所有出现的
60为时间窗口参数:代表用过去60个交易日的收盘价预测下1个交易日的价格,可根据需求调整,不影响未来预测逻辑 - 新增
future_days变量:用于自定义你想要预测的未来交易日天数,比如设置为10就是预测未来10天的价格
完整修改后代码
import pandas as pd import numpy as np import yfinance as yf import os import matplotlib.pyplot as plt from IPython.display import display from keras.models import Sequential from keras.layers import LSTM, Dense from sklearn.preprocessing import MinMaxScaler os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' pd.options.mode.chained_assignment = None # 下载数据 df = yf.download(tickers=['AAPL'], period='2y') # 拆分数据集 train_data = df[['Close']].iloc[: - 200, :] valid_data = df[['Close']].iloc[- 200:, :] # 数据归一化 scaler = MinMaxScaler(feature_range=(0, 1)) scaler.fit(train_data) train_data = scaler.transform(train_data) valid_data = scaler.transform(valid_data) # 提取训练序列 x_train, y_train = [], [] for i in range(60, train_data.shape[0]): x_train.append(train_data[i - 60: i, 0]) y_train.append(train_data[i, 0]) x_train = np.array(x_train) y_train = np.array(y_train) # 提取验证序列 x_valid = [] y_valid = [] for i in range(60, valid_data.shape[0]): x_valid.append(valid_data[i - 60: i, 0]) y_valid.append(valid_data[i, 0]) x_valid = np.array(x_valid) y_valid = np.array(y_valid) # 序列维度转换 x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], 1) x_valid = x_valid.reshape(x_valid.shape[0], x_valid.shape[1], 1) # 训练模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=x_train.shape[1:])) model.add(LSTM(units=50)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(x_train, y_train, epochs=50, batch_size=128, verbose=1) # 生成验证集预测结果 y_pred = model.predict(x_valid) y_pred = scaler.inverse_transform(y_pred) y_pred = y_pred.flatten() # ------------------- 新增:未来日期预测逻辑 ------------------- future_days = 7 # 自定义需要预测的未来天数 # 取全量数据的最后60天作为初始预测输入 last_60_days = scaler.transform(df[['Close']].iloc[-60:].values) future_predictions = [] for _ in range(future_days): # 调整输入维度符合模型要求 input_seq = last_60_days.reshape(1, 60, 1) # 预测下一天价格 next_day_pred = model.predict(input_seq, verbose=0) # 保存预测结果 future_predictions.append(next_day_pred[0][0]) # 更新输入序列:去掉最早的一天,加入刚预测出来的价格作为新的输入末尾 last_60_days = np.append(last_60_days[1:], next_day_pred, axis=0) # 对未来预测结果做反归一化 future_predictions = scaler.inverse_transform(np.array(future_predictions).reshape(-1,1)).flatten() # 生成未来日期索引(仅交易日,跳过周末节假日,和yfinance数据格式对齐) future_dates = pd.bdate_range(start=df.index[-1] + pd.Timedelta(days=1), periods=future_days) # 把未来预测结果加入原数据集 future_df = pd.DataFrame({'Actual': np.nan, 'Predicted': future_predictions}, index=future_dates) df = pd.concat([df.rename(columns={'Close': 'Actual'}), future_df]) # ------------------------------------------------------------- # 绘图展示 df['Predicted'].iloc[-len(y_pred)-future_days: -future_days] = y_pred df[['Actual', 'Predicted']].plot(title='AAPL 实际价格 vs 预测价格') display(df) plt.show()
注意事项
- 滚动预测会有误差累积问题,预测天数越长误差越大,不建议单次预测超过30天
- 仅调整模型训练的
epochs、units等参数不会直接增加可预测的时间范围,必须配合上述滚动预测逻辑使用
内容的提问来源于stack exchange,提问作者WillTheWA
相关产品推荐
相关产品推荐

