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

基于R语言Keras的MLP股价预测出现异常结果求助

没问题,我帮你梳理并实现这个基于R语言Keras的MLP股票价格预测模型,完全匹配你要求的2个隐藏层(各40神经元)的结构,结合你给出的滞后数据格式,下面是完整的分步实现和说明:

1. 数据准备与预处理

首先要把你的滞后特征和目标价格拆分,而且金融数据对尺度敏感,必须做标准化处理,避免模型收敛困难。

# 加载必要的库
library(keras)
library(tidyverse)

# 导入你的实际数据(这里用你给出的示例模拟)
stock_data <- tibble(
  date = c("2018-04-13", "2018-04-16", "2018-04-17", "2018-04-18"),
  price_lag_4 = c(157.73, 161.21, 160.28, 162.21),
  price_lag_3 = c(161.21, 160.28, 162.21, 161.37),
  price_lag_2 = c(160.28, 162.21, 161.37, 162.60),
  price_lag_1 = c(162.21, 161.37, 162.60, 166.10),
  price = c(161.37, 162.60, 166.10, 166.40)
)

# 拆分特征矩阵(X)和目标向量(y)
X <- stock_data %>% select(starts_with("price_lag")) %>% as.matrix()
y <- stock_data$price %>% as.matrix()

# 标准化处理(MLP必须步骤)
scaler_X <- preprocessing_standardization() %>% fit(X)
X_scaled <- transform(scaler_X, X)

scaler_y <- preprocessing_standardization() %>% fit(y)
y_scaled <- transform(scaler_y, y)

# 划分训练集和测试集(示例用8:2比例)
train_size <- floor(0.8 * nrow(X_scaled))
X_train <- X_scaled[1:train_size, ]
y_train <- y_scaled[1:train_size, ]
X_test <- X_scaled[(train_size+1):nrow(X_scaled), ]
y_test <- y_scaled[(train_size+1):nrow(X_scaled), ]
2. 构建指定结构的MLP模型

严格按照你的要求,搭建包含2个各40神经元隐藏层的模型,回归任务输出层用线性激活:

# 初始化序列模型
model <- keras_model_sequential() %>%
  # 输入层(4个滞后特征)+ 第一个隐藏层(40神经元,ReLU激活)
  layer_dense(units = 40, activation = "relu", input_shape = c(4)) %>%
  # 第二个隐藏层(40神经元,ReLU激活)
  layer_dense(units = 40, activation = "relu") %>%
  # 输出层(1个神经元,预测股票价格)
  layer_dense(units = 1)

# 编译模型:Adam优化器+MSE损失(回归任务标准配置)
model %>% compile(
  optimizer = optimizer_adam(learning_rate = 0.001),
  loss = "mean_squared_error",
  metrics = c("mean_absolute_error")
)

# 查看模型结构确认是否符合要求
summary(model)
3. 训练模型

设置训练参数,同时用部分训练数据做验证,监控过拟合情况:

# 启动训练
history <- model %>% fit(
  x = X_train,
  y = y_train,
  epochs = 50,          # 可根据验证损失调整
  batch_size = 8,
  validation_split = 0.2, # 用20%训练数据做验证
  verbose = 1
)

# 可视化训练过程(观察损失变化)
plot(history)
4. 预测与结果还原

因为之前做了标准化,预测后要反变换回原始价格尺度,方便对比真实值:

# 测试集预测
y_pred_scaled <- model %>% predict(X_test)
y_pred <- transform(scaler_y, y_pred_scaled, invert = TRUE)
y_true <- transform(scaler_y, y_test, invert = TRUE)

# 生成对比表格
comparison <- tibble(
  date = stock_data$date[(train_size+1):nrow(stock_data)],
  true_price = y_true[,1],
  predicted_price = y_pred[,1]
)

print(comparison)

# 计算评估指标
mse <- mean((y_true - y_pred)^2)
mae <- mean(abs(y_true - y_pred))
cat(sprintf("测试集MSE: %.4f\n", mse))
cat(sprintf("测试集MAE: %.4f\n", mae))

额外注意事项

  • 金融序列随机性极强,仅用4个滞后特征的MLP效果可能有限,你可以尝试加入成交量、RSI等技术指标提升性能
  • 如果出现过拟合,可以在隐藏层后加入layer_dropout(rate = 0.2),或者减少epochs、调整学习率
  • 数据标准化是MLP训练的关键步骤,跳过会导致模型权重更新失衡,难以收敛

内容的提问来源于stack exchange,提问作者Andrew

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:22:53