如何利用LSTM编写一个外汇EA程序(附示例代码)
2025-05-30
为什么选 LSTM(而非 Transformer):
| LSTM | Transformer |
|---|---|
| 适合中等 GPU(如 RTX4060) | 训练耗显存,效果依赖大数据 |
| 学习时间依赖很好 | 强大建模能力但对资源依赖重 |
| 在金融时间序列中表现稳定 | 过拟合风险大(你数据不多) |
模型结构建议
输入特征(可扩展):
-
Open / High / Low / Close / Volume
-
可添加技术指标(如 RSI, MACD, EMA)
输出头(Multi-task):
-
分类头:Buy / Sell / Hold( 入场信号)
-
回归头:StopLoss 值、TakeProfit 值
python复制编辑Model: - Shared LSTM layers - Output1: Dense(3) + Softmax → 交易动作 - Output2: Dense(1) → 止损价位 - Output3: Dense(1) → 止盈价位示例代码
# CFD 交易模型(XAUUSD)- 使用 LSTM 实现交易建议(入场、止盈、止损)
import numpy as np
import pandas as pd
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
# ==========================
# 数据准备部分
# ==========================
class TradingDataset(Dataset):
def __init__(self, df, window_size=60):
self.window_size = window_size
self.X = []
self.y_signal = [] # 交易信号: 0 = Hold, 1 = Buy, 2 = Sell
self.y_sl = [] # 止损价位(相对当前价格)
self.y_tp = [] # 止盈价位
for i in range(window_size, len(df) - 10):
window = df.iloc[i-window_size:i]
future = df.iloc[i:i+10] # 用未来10根K线判断是否应买卖
current_price = df.iloc[i]['close']
max_future = future['high'].max()
min_future = future['low'].min()
# 简单交易信号逻辑
if max_future >= current_price * 1.005: # 涨了0.5%
signal = 1 # Buy
tp = current_price * 1.005
sl = current_price * 0.995
elif min_future <= current_price * 0.995:
signal = 2 # Sell
tp = current_price * 0.995
sl = current_price * 1.005
else:
signal = 0 # Hold
tp = current_price
sl = current_price
features = window[['open', 'high', 'low', 'close', 'volume']].values
self.X.append(features)
self.y_signal.append(signal)
self.y_tp.append(tp)
self.y_sl.append(sl)
self.X = torch.tensor(np.array(self.X), dtype=torch.float32)
self.y_signal = torch.tensor(self.y_signal, dtype=torch.long)
self.y_tp = torch.tensor(self.y_tp, dtype=torch.float32)
self.y_sl = torch.tensor(self.y_sl, dtype=torch.float32)
def __len__(self):
return len(self.X)
def __getitem__(self, idx):
return self.X[idx], self.y_signal[idx], self.y_tp[idx], self.y_sl[idx]
# ==========================
# LSTM 模型定义
# ==========================
class TradingLSTM(nn.Module):
def __init__(self, input_size=5, hidden_size=64, num_layers=2):
super(TradingLSTM, self).__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc_signal = nn.Linear(hidden_size, 3) # 交易信号输出
self.fc_tp = nn.Linear(hidden_size, 1) # 止盈
self.fc_sl = nn.Linear(hidden_size, 1) # 止损
def forward(self, x):
_, (hn, _) = self.lstm(x)
hn = hn[-1] # 最后一层输出
signal_out = self.fc_signal(hn)
tp_out = self.fc_tp(hn).squeeze()
sl_out = self.fc_sl(hn).squeeze()
return signal_out, tp_out, sl_out
# ==========================
# 训练函数
# ==========================
def train_model(model, dataloader, epochs=10, lr=1e-3):
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
model = model.to(device)
criterion_signal = nn.CrossEntropyLoss()
criterion_price = nn.MSELoss()
optimizer = torch.optim.Adam(model.parameters(), lr=lr)
for epoch in range(epochs):
model.train()
total_loss = 0
for X, y_signal, y_tp, y_sl in dataloader:
X, y_signal, y_tp, y_sl = X.to(device), y_signal.to(device), y_tp.to(device), y_sl.to(device)
pred_signal, pred_tp, pred_sl = model(X)
loss_signal = criterion_signal(pred_signal, y_signal)
loss_tp = criterion_price(pred_tp, y_tp)
loss_sl = criterion_price(pred_sl, y_sl)
loss = loss_signal + 0.5 * (loss_tp + loss_sl)
optimizer.zero_grad()
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}/{epochs} | Loss: {total_loss/len(dataloader):.4f}")
# ==========================
# 使用示例(需替换为你的 XAUUSD 数据)
# ==========================
# df = pd.read_csv("xauusd_data.csv")
# dataset = TradingDataset(df)
# dataloader = DataLoader(dataset, batch_size=32, shuffle=True)
# model = TradingLSTM()
# train_model(model, dataloader, epochs=20)
# 保存模型
# torch.save(model.state_dict(), "cfd_trading_model.pt")
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站文章有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。