You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多变量时间序列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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:00:33