第四章:多智能体交易系统架构

聊到多智能体交易系统的架构,我脑子里第一个蹦出来的词就是「分层」。为什么?因为我在早期做单体交易系统时踩过一个大坑——所有逻辑揉在一起,改一个参数要重启整个系统,那叫一个痛苦。后来我学乖了,分层设计,各司其职,出了问题也能快速定位。

今天我们就来拆解这套架构。说白了,就是三个层次加一套通信机制再加一条数据流。你想想看,一个交易系统要处理行情、做决策、下订单,这三件事本质上是不同节奏的——行情每秒几百次变化,决策可能几秒一次,执行则要毫秒级响应。不分层,根本玩不转。

4.1 分层架构:感知层、决策层、执行层

我习惯把多智能体交易系统比作一个交易团队。感知层是情报员,决策层是分析师,执行层是交易员。各干各的活,互不干扰。

4.1.1 感知层(Perception Layer)

感知层负责「看」和「听」。它从交易所、数据源、新闻API等地方获取原始数据,然后做清洗、对齐、特征提取。

我在项目中遇到过一个问题:不同交易所的行情数据时间戳格式不一样,有的用毫秒,有的用微秒。感知层必须统一处理,否则后续决策层算出来的指标全是错的。

核心职责:
  • 行情数据订阅与解析(Tick、K线、深度)
  • 新闻与舆情数据采集
  • 数据清洗与标准化
  • 特征工程(技术指标、波动率、相关性等)

感知层的Agent通常是轻量级的,每个Agent负责一个数据源。比如一个Agent专门盯BTC/USDT的Tick数据,另一个专门抓Twitter上的关键词。这样设计的好处是——某个数据源挂了,不影响其他Agent。

4.1.2 决策层(Decision Layer)

决策层是大脑。它接收感知层处理好的特征数据,运行策略模型,输出交易信号。

嗯,这里要注意:决策层不直接跟交易所打交道。它只做一件事——「现在该不该开仓?开多少?」。我见过不少新手把策略逻辑和下单逻辑写在一起,结果策略回测没问题,实盘一跑就崩。为什么?因为网络延迟、交易所限流这些因素干扰了策略本身的判断。

我的经验:决策层的Agent应该保持「无状态」。每次决策只依赖当前输入的特征向量,不依赖历史状态。这样方便做回测和A/B测试。

决策层内部可以再细分:

  • 信号生成Agent:基于规则或模型生成买卖信号
  • 风险管理Agent:检查当前敞口、止损条件、资金使用率
  • 组合优化Agent:多策略、多品种的仓位分配

4.1.3 执行层(Execution Layer)

执行层是手脚。它接收决策层的指令,负责把订单发到交易所,并处理成交回报。

执行层最头疼的问题是「滑点」和「成交率」。我记得有一次,决策层发了一个市价单指令,结果因为流动性不足,实际成交价差了0.3%。对于高频策略来说,这简直是灾难。

避坑指南:我曾经把执行层的重试逻辑写成了死循环——订单没成交就一直重发,结果交易所把我当成了恶意攻击,直接封了API。后来我加上了重试次数限制和指数退避策略。

执行层的Agent通常包含:

  • 订单管理Agent:管理订单生命周期(创建、撤销、查询)
  • 路由Agent:选择最优交易所或流动性池
  • 对冲Agent:处理多腿订单或跨交易所套利

4.2 Agent通信机制

三个层次之间怎么通信?这是架构设计的核心。我见过两种主流方式:消息队列和共享内存。

4.2.1 消息队列模式

适合异步、松耦合的场景。感知层把处理好的数据丢到队列里,决策层从队列里取。执行层再把指令丢到另一个队列。

// 伪代码示例:感知层发布行情数据
MessageQueue.publish("market.data", {
  symbol: "BTC/USDT",
  price: 50000.12,
  timestamp: 1712345678000,
  features: {
    rsi: 45.2,
    ma_5: 49800,
    volatility: 0.023
  }
});

// 决策层订阅并处理
MessageQueue.subscribe("market.data", (data) => {
  let signal = strategy.run(data.features);
  if (signal.action !== "HOLD") {
    MessageQueue.publish("trade.signal", signal);
  }
});

我常用的消息队列有Redis Pub/Sub(低延迟场景)和Kafka(高吞吐场景)。如果你做的是高频交易,建议用ZeroMQ——延迟可以控制在微秒级。

4.2.2 共享内存模式

适合同一台机器上的Agent通信。延迟极低,但实现复杂。我一般在执行层内部用共享内存,因为执行层对延迟最敏感。

通信协议选择:
场景 推荐方式 延迟
感知层 → 决策层 消息队列(Redis/Kafka) 毫秒级
决策层 → 执行层 消息队列(ZeroMQ) 微秒级
执行层内部 共享内存 纳秒级

4.3 系统数据流设计

数据流是系统的血液。我画了一张图来展示完整的数据流转过程:

多智能体交易系统数据流图 感知层 行情Agent 新闻Agent 数据清洗Agent 决策层 信号生成Agent 风控Agent 组合优化Agent 执行层 订单管理Agent 路由Agent 对冲Agent 原始行情/新闻 特征数据 交易指令 订单 成交回报 / 状态反馈 数据存储层 时序数据库(行情) | 关系型数据库(订单、账户) | 缓存(实时状态) 图例: 特征数据流 指令流 反馈流 持久化

数据流的核心逻辑其实很简单:

  1. 原始数据从交易所、新闻源流入感知层
  2. 感知层清洗、特征化后,通过消息队列推给决策层
  3. 决策层运行策略,生成交易信号,传给执行层
  4. 执行层下单到交易所,同时接收成交回报
  5. 所有层的数据持久化到数据库,用于回测和分析
一个实用技巧:我习惯在数据流中加一个「审计Agent」。它不参与交易决策,只负责记录每一笔数据流转的日志。出了问题,直接查审计日志,不用翻代码。

最后说一句:架构设计没有银弹。分层架构虽然清晰,但也会带来额外的通信开销。如果你的策略延迟要求极高(比如微秒级),可能需要考虑把感知层和决策层合并。但大多数场景下,分层带来的可维护性收益远大于性能损失。

嗯,这就是我对多智能体交易系统架构的理解。从感知到决策再到执行,每一层做好自己的事,系统才能稳定运行。