多变量时间序列LSTM股票预测疑问:如何处理未知特征及求示例代码
多变量LSTM股票High价格预测解决方案
方法1:直接预测目标特征(High)的多步结果
这种方式无需依赖未来未知的其他特征,让模型从历史多变量数据直接输出未来N天的High值,适合仅关注High价格的场景。
代码实现
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # 1. 数据加载与预处理 df = pd.read_csv('stock_data.csv') # 替换为你的数据路径 df['Date'] = pd.to_datetime(df['Date']) df = df.set_index('Date') features = ['High', 'Low', 'Close', 'Volume'] target = 'High' data = df[features].values # 归一化处理 scaler = MinMaxScaler(feature_range=(0,1)) scaled_data = scaler.fit_transform(data) # 2. 构建训练序列 seq_length = 60 # 用60天历史数据做输入 future_days = 42 # 预测未来2个月(约42个交易日) X, y = [], [] for i in range(seq_length, len(scaled_data)-future_days+1): X.append(scaled_data[i-seq_length:i, :]) # 输入:60天多变量数据 y.append(scaled_data[i:i+future_days, features.index(target)]) # 目标:未来42天的High X, y = np.array(X), np.array(y) X = np.reshape(X, (X.shape[0], X.shape[1], len(features))) # LSTM输入格式:(样本数, 时间步长, 特征数) # 3. 构建并训练模型 model = Sequential() model.add(LSTM(units=100, return_sequences=True, input_shape=(X.shape[1], len(features)))) model.add(LSTM(units=100, return_sequences=False)) model.add(Dense(units=50)) model.add(Dense(units=future_days)) # 输出未来42天的High值 model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X, y, batch_size=32, epochs=25) # 4. 预测未来High价格 last_seq = scaled_data[-seq_length:] last_seq = np.reshape(last_seq, (1, seq_length, len(features))) pred_scaled = model.predict(last_seq, verbose=0) # 反归一化:构造完整特征数组,替换High列的预测值 pred_array = np.zeros((future_days, len(features))) pred_array[:, features.index(target)] = pred_scaled[0] pred_high = scaler.inverse_transform(pred_array)[:, features.index(target)] # 生成未来日期(过滤非交易日) future_dates = pd.bdate_range(start=df.index[-1]+pd.Timedelta(days=1), periods=future_days) pred_df = pd.DataFrame({'Date': future_dates, 'Predicted_High': pred_high}).set_index('Date') print(pred_df)
方法2:递归预测所有特征(适合多变量需求场景)
训练模型预测下一天的全部特征(High/Low/Close/Volume),再将预测结果作为下一次输入的一部分,循环完成未来2个月的预测。
代码实现
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dense # 1. 数据加载与预处理(同方法1) df = pd.read_csv('stock_data.csv') df['Date'] = pd.to_datetime(df['Date']) df = df.set_index('Date') features = ['High', 'Low', 'Close', 'Volume'] data = df[features].values scaler = MinMaxScaler(feature_range=(0,1)) scaled_data = scaler.fit_transform(data) # 2. 构建训练序列 seq_length = 60 X, y = [], [] for i in range(seq_length, len(scaled_data)): X.append(scaled_data[i-seq_length:i, :]) # 输入:60天多变量数据 y.append(scaled_data[i, :]) # 目标:下一天的所有特征 X, y = np.array(X), np.array(y) X = np.reshape(X, (X.shape[0], X.shape[1], len(features))) # 3. 构建并训练模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(X.shape[1], len(features)))) model.add(LSTM(units=50, return_sequences=False)) model.add(Dense(units=25)) model.add(Dense(units=len(features))) # 输出所有4个特征的归一化值 model.compile(optimizer='adam', loss='mean_squared_error') model.fit(X, y, batch_size=32, epochs=25) # 4. 递归预测未来2个月数据 last_seq = scaled_data[-seq_length:] future_predictions_scaled = [] for _ in range(42): input_seq = np.reshape(last_seq, (1, seq_length, len(features))) next_day_scaled = model.predict(input_seq, verbose=0) future_predictions_scaled.append(next_day_scaled[0]) # 更新输入序列:移除最旧的一天,加入刚预测的一天 last_seq = np.concatenate([last_seq[1:], next_day_scaled], axis=0) # 反归一化所有特征 future_predictions = scaler.inverse_transform(np.array(future_predictions_scaled)) # 提取并整理结果 future_dates = pd.bdate_range(start=df.index[-1]+pd.Timedelta(days=1), periods=42) pred_df = pd.DataFrame({ 'Date': future_dates, 'Predicted_High': future_predictions[:, features.index('High')], 'Predicted_Low': future_predictions[:, features.index('Low')], 'Predicted_Close': future_predictions[:, features.index('Close')], 'Predicted_Volume': future_predictions[:, features.index('Volume')] }).set_index('Date') print(pred_df)
关键注意事项
seq_length、LSTM单元数、训练轮次等参数需要根据你的数据调优,避免过拟合。- 股票数据受外部因素(政策、新闻等)影响极大,LSTM仅能捕捉历史数据模式,预测结果仅供参考。
- 归一化时必须使用训练集拟合的scaler处理所有数据,避免数据泄露。
- 递归预测会累积误差,预测天数越多,误差可能越大。
内容的提问来源于stack exchange,提问作者Hamzakhan Swati
相关产品推荐
相关产品推荐

