最诚信 最高效 最好服务
当前位置:首页 > 交易学堂 > 中级课程

如何利用LSTM编写一个外汇EA程序(附示例代码)

2025-05-30   

为什么选 LSTM(而非 Transformer):

LSTM Transformer
 适合中等 GPU(如 RTX4060)  训练耗显存,效果依赖大数据
学习时间依赖很好 强大建模能力但对资源依赖重
在金融时间序列中表现稳定  过拟合风险大(你数据不多)


模型结构建议

输入特征(可扩展):

输出头(Multi-task):

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")


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站文章有涉嫌抄袭侵权/违法违规的内容, 请发送邮件举报,一经查实,本站将立刻删除。

上一篇:《股票作手回忆录》作者杰西·利弗莫尔的传奇一生

下一篇:添加汇币通客服,领取免费复盘工具

相关标签:

  • 常见蜡烛图表技术形态有哪些
    常见蜡烛图表技术形态有···
    2024-03-07

    在技术分析中,图表形态是一种通过观察价格图表上的特定图案来进行市场预测的方法。以下是一些经典的图表形态:头肩顶和头肩底(···

  • 外汇返佣网:密歇根大学消费者信心指数是什么?
    外汇返佣网:密歇根大学消···
    2024-02-26

    密歇根大学消费者信心指数(University of Michigan Consumer Sentiment Index)终值。这一指数是对美国消费者信心水平的一个重要···

  • 外汇交易入门:ISM制造业PMI是什么?
    外汇交易入门:ISM制造业···
    2024-02-26

    美国ISM制造业采购经理人指数(Purchasing Managers' Index,简称ISM制造业PMI)是由美国供应管理协会(Institute for Suppl···

  • 外汇交易入门:PCE核心物价指数是什么?
    外汇交易入门:PCE核心物···
    2024-02-26

    核心PCE物价指数是美国联邦储备系统(美联储)所关注的通货膨胀指标之一。核心PCE物价指数排除了食品和能源等波动较大的物价成分···

  • 外汇交易入门:超短线交易和剥头皮有什么区别?
    外汇交易入门:超短线交易···
    2024-02-26

    二者在几乎是等价的,我们可以在翻译软件中看到,超短线交易的英文翻译正是Scalping.超短线交易(Scalping)是一种外汇和股票交易的···

  • 外汇返佣网:经典的k线形态有哪些?
    外汇返佣网:经典的k线形···
    2024-02-23

    蜡烛图是一种用于显示金融市场价格走势的图表,其中的K线(蜡烛)形态可以提供关于市场行为的信息。以下是一些常见的经典K线形态···

  • 外汇交易常用指标之震荡指标(stoch)
    外汇交易常用指标之震荡···
    2024-01-08

    该指标的数值范围有0-100,默认20和80是衡量超买超卖的分界线,20以下的超卖即是认为价格因为卖出过多,价格低于其实际价值,应该结合···

  • Exness:常用的技术指标有哪些
    Exness:常用的技术指标有···
    2023-12-21

    在外汇交易中,有许多知名且常用的技术指标,这些指标用于分析市场趋势、价格走势和交易信号。以下是一些常见且知名的外汇指标:···

  • 什么是外汇指标重绘?
    什么是外汇指标重绘?
    2023-12-20

    外汇指标重绘(Repainting)是指在历史数据中,某些技术指标或图表图示在当前时刻发生改变,因此对历史数据产生了不准确的展示。···

  • 外汇交易初学者的学习路线
    外汇交易初学者的学习路···
    2023-12-05

    学习外汇交易需要耐心和持续的努力。以下是外汇返佣网给出外汇交易入门的建议.一个初学者的学习路线和时间安排:### 初步阶段(1···

  • 咨询qq客服
    微信咨询