一、引言

这个完整的股票开盘价预测案例结合了 Transformer 和随机森林,通过集成学习提高模型性能。通过组合,既用到了Transformer捕捉时序依赖的强大能力,也用了随机森林的稳健集成优势,得到了一个既灵活又易于调参的股票开盘价预测模型。整体流程如下:

  • 数据准备
  • 收集历史股票开盘数据。
  • 按固定窗口切分成序列:例如用过去7天的数据去预测下一天。
  • Transformer 特征提取
  • 输入嵌入:把每个时间点的流量值映射到高维向量。
  • 位置编码:告诉模型“这是第几个时刻”,因为Transformer本身不“记得”顺序。
  • 自注意力机制:计算序列内部任意两时刻的关联程度,突出重要上下文信息。
  • 多头注意力 & 前馈网络:并行多个“视角”看数据,再通过一层小型神经网进一步提纯特征。
  • 输出特征:得到了每个时刻的高维表示,我们选取最后一个位置或做池化,得到一个代表整个输入序列的向量。
  • 随机森林回归
  • 用Transformer输出的向量作为输入特征。
  • 建立多棵决策树,每棵树从这批特征中学习“如果这些数字长这样,未来流量就可能是这个数”。
  • 多棵树预测后取平均值,得到最终的股价预测。

二、实现过程

2.1 读取时序数据

核心代码:

df = pd.DataFrame(pd.read_csv("data.csv"))
print(df)

结果:

2.2 构建训练和测试数据集

核心代码:

# 选择特征
features = ['Open', 'High', 'Low', 'Close', 'Adj Close']
train_size = int(len(df) * 0.8)
train_df = df[:train_size]
test_df = df[train_size:]
# 构建训练和测试数据集
input_window = 7
pred_window = 1
train_dataset = StockDataset(train_df[features], input_window, pred_window)
test_dataset = StockDataset(test_df[features], input_window, pred_window)
train_loader = DataLoader(train_dataset, batch_size=32, shuffle=False)
test_loader = DataLoader(test_dataset, batch_size=32, shuffle=False)

2.3 定义 Transformer 模型

核心代码:

class TransformerModel(nn.Module):
def __init__(self, input_dim, d_model=64, nhead=4, num_layers=2, dropout=0.1):
super().__init__()
self.embedding = nn.Linear(input_dim, d_model)
encoder_layer = nn.TransformerEncoderLayer(d_model=d_model, nhead=nhead, dropout=dropout)
self.transformer = nn.TransformerEncoder(encoder_layer, num_layers=num_layers)
self.decoder = nn.Linear(d_model, 1)
def forward(self, src):
src = self.embedding(src)
src = src.permute(1, 0, 2)  # 转换为(seq_len, batch, feature)
output = self.transformer(src)
output = output[-1]  # 最后一个时间步
output = self.decoder(output)
return output.squeeze()
model = TransformerModel(input_dim=len(features))
criterion = nn.MSELoss()
optimizer = optim.Adam(model.parameters(), lr=0.001)

2.4 训练 Transformer 模型

核心代码:

num_epochs = 10
for epoch in range(num_epochs):
model.train()
epoch_loss = 0
for X_batch, y_batch in train_loader:
optimizer.zero_grad()
y_pred = model(X_batch)
loss = criterion(y_pred, y_batch.squeeze())
loss.backward()
optimizer.step()
epoch_loss += loss.item()
print(f"Epoch {epoch+1}/{num_epochs}, Loss: {epoch_loss/len(train_loader):.4f}")

结果:

2.5 得到 Transformer 预测结果作为随机森林输入

核心代码:

model.eval()
train_features, train_targets = [], []
test_features, test_targets = [], []
with torch.no_grad():
for X_batch, y_batch in train_loader:
transformer_preds = model(X_batch).numpy()
High = X_batch[:, -1, 1].numpy()
Low = X_batch[:, -1, 2].numpy()
Close = X_batch[:, -1, 3].numpy()
Adj_Close = X_batch[:, -1, 4].numpy()
combined = np.stack([transformer_preds, High, Low, Close, Adj_Close], axis=1)
train_features.extend(combined)
train_targets.extend(y_batch.numpy())
for X_batch, y_batch in test_loader:
transformer_preds = model(X_batch).numpy()
High = X_batch[:, -1, 1].numpy()
Low = X_batch[:, -1, 2].numpy()
Close = X_batch[:, -1, 3].numpy()
Adj_Close = X_batch[:, -1, 4].numpy()
combined = np.stack([transformer_preds, High, Low, Close, Adj_Close], axis=1)
test_features.extend(combined)
test_targets.extend(y_batch.numpy())

2.6 随机森林模型训练

核心代码:

rf = RandomForestRegressor(n_estimators=100, random_state=42)
rf.fit(train_features, np.array(train_targets).ravel())
rf_preds = rf.predict(test_features)

2.7 可视化分析

图一实际 vs 预测图:评估整体预测准确性

核心代码:

plt.figure(figsize=(14, 4))
plt.plot(np.array(test_targets).ravel(), label='Actual', color='black')
plt.plot(rf_preds, label='Predicted', color='crimson')
plt.title('Actual vs Predicted Open Price')
plt.xlabel('Time Index')
plt.ylabel('Open Price')
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()

结果:

图二误差分布图:了解误差的集中程度与偏差

核心代码:

errors = rf_preds - np.array(test_targets).ravel()
sns.histplot(errors, bins=30, kde=True, color='darkorange')
plt.title('Prediction Error Distribution')
plt.xlabel('Prediction Error')
plt.ylabel('Frequency')
plt.tight_layout()
plt.show()

结果:

图三特征重要性图:理解哪些变量对预测贡献最大

核心代码:

feature_importances = rf.feature_importances_
print(feature_importances)
feature_names = ['Transformer Output', 'High', 'Low', 'Close', 'Adj_Close']
sns.barplot(x=feature_importances, y=feature_names, palette='viridis')
plt.title('Feature Importance in Random Forest')
plt.xlabel('Importance')
plt.tight_layout()
plt.show()

结果:

模型评估指标:

mse = mean_squared_error(test_targets, rf_preds)
print(f"Random Forest Ensemble MSE: {mse:.2f}")

结果:

最后

为什么要学AI大模型

当下,⼈⼯智能市场迎来了爆发期,并逐渐进⼊以⼈⼯通⽤智能(AGI)为主导的新时代。企业纷纷官宣“ AI+ ”战略,为新兴技术⼈才创造丰富的就业机会,⼈才缺⼝将达 400 万!

DeepSeek问世以来,生成式AI和大模型技术爆发式增长,让很多岗位重新成了炙手可热的新星,岗位薪资远超很多后端岗位,在程序员中稳居前列。

在这里插入图片描述

与此同时AI与各行各业深度融合,飞速发展,成为炙手可热的新风口,企业非常需要了解AI、懂AI、会用AI的员工,纷纷开出高薪招聘AI大模型相关岗位。
在这里插入图片描述
最近很多程序员朋友都已经学习或者准备学习 AI 大模型,后台也经常会有小伙伴咨询学习路线和学习资料,我特别拜托北京清华大学学士和美国加州理工学院博士学位的鲁为民老师给大家这里给大家准备了一份涵盖了AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频 全系列的学习资料,这些学习资料不仅深入浅出,而且非常实用,让大家系统而高效地掌握AI大模型的各个知识点。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

AI大模型系统学习路线

在面对AI大模型开发领域的复杂与深入,精准学习显得尤为重要。一份系统的技术路线图,不仅能够帮助开发者清晰地了解从入门到精通所需掌握的知识点,还能提供一条高效、有序的学习路径。

img

但知道是一回事,做又是另一回事,初学者最常遇到的问题主要是理论知识缺乏、资源和工具的限制、模型理解和调试的复杂性,在这基础上,找到高质量的学习资源,不浪费时间、不走弯路,又是重中之重。

AI大模型入门到实战的视频教程+项目包

看视频学习是一种高效、直观、灵活且富有吸引力的学习方式,可以更直观地展示过程,能有效提升学习兴趣和理解力,是现在获取知识的重要途径

在这里插入图片描述
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
在这里插入图片描述

海量AI大模型必读的经典书籍(PDF)

阅读AI大模型经典书籍可以帮助读者提高技术水平,开拓视野,掌握核心技术,提高解决问题的能力,同时也可以借鉴他人的经验。对于想要深入学习AI大模型开发的读者来说,阅读经典书籍是非常有必要的。
在这里插入图片描述

600+AI大模型报告(实时更新)

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。
在这里插入图片描述

AI大模型面试真题+答案解析

我们学习AI大模型必然是想找到高薪的工作,下面这些面试题都是总结当前最新、最热、最高频的面试题,并且每道题都有详细的答案,面试前刷完这套面试题资料,小小offer,不在话下
在这里插入图片描述

在这里插入图片描述

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

Logo

更多推荐