AI Agent 交易系统:从规则策略到智能决策,链上交易的自动化演进

一、链上交易的手动困境:速度、情绪与执行偏差

链上交易的执行速度要求远超传统金融。一个新代币的流动性池上线后,价格在几秒内完成发现;一笔清算机会出现后,多个 MEV 机器人同时竞争。人类交易者无法在毫秒级做出决策并提交交易,手动交易在 DeFi 生态中几乎没有竞争力。

更深层的问题是情绪偏差。恐惧导致过早止损,贪婪导致追高,FOMO 导致在错误的时间入场。这些偏差在链上交易的透明环境中被放大——任何人都可以看到大户的持仓变化,市场情绪的传染速度更快。AI Agent 的核心价值不是"比人更聪明",而是"比人更稳定"——严格执行策略,不受情绪干扰。

二、AI Agent 交易系统架构

flowchart TD
    A[链上数据流] --> B[信号采集层]
    B --> B1[价格数据: DEX 行情]
    B --> B2[链上事件: 大额转账/清算]
    B --> B3[社交信号: Twitter/Sentiment]
    B1 --> C[策略决策层]
    B2 --> C
    B3 --> C
    C --> C1[规则策略: 技术指标/套利]
    C --> C2[AI 策略: 模式识别/预测]
    C --> C3[风控层: 仓位/止损/滑点]
    C1 --> D[执行层]
    C2 --> D
    D --> D1[交易构建: Gas 估算/Nonce]
    D --> D2[交易提交: Flashbots/私有池]
    D --> D3[执行监控: 确认/回滚]

2.1 信号采集与处理

# signal_collector.py — 链上信号采集器
# 设计意图:实时采集链上事件和 DEX 行情数据,
# 为策略决策提供信号输入

import asyncio
from dataclasses import dataclass, field
from typing import Callable, Optional
from collections import deque
import time

@dataclass
class PriceTick:
    token_pair: str
    price: float
    volume: float
    timestamp: float = field(default_factory=time.time)

@dataclass
class ChainEvent:
    event_type: str        # swap / transfer / liquidation
    token: str
    amount: float
    sender: str
    tx_hash: str
    timestamp: float = field(default_factory=time.time)

class SignalCollector:
    def __init__(self, window_size: int = 1000):
        self.price_feeds: dict[str, deque[PriceTick]] = {}
        self.chain_events: deque[ChainEvent] = deque(maxlen=window_size)
        self.handlers: dict[str, list[Callable]] = {}
        self.window_size = window_size

    def on_price_tick(self, tick: PriceTick):
        """处理价格更新"""
        if tick.token_pair not in self.price_feeds:
            self.price_feeds[tick.token_pair] = deque(maxlen=self.window_size)

        self.price_feeds[tick.token_pair].append(tick)

        # 触发价格变更处理器
        for handler in self.handlers.get('price', []):
            handler(tick)

    def on_chain_event(self, event: ChainEvent):
        """处理链上事件"""
        self.chain_events.append(event)

        # 触发事件处理器
        for handler in self.handlers.get(event.event_type, []):
            handler(event)

    def register_handler(self, event_type: str, handler: Callable):
        """注册事件处理器"""
        if event_type not in self.handlers:
            self.handlers[event_type] = []
        self.handlers[event_type].append(handler)

    def get_moving_average(self, token_pair: str, period: int = 20) -> Optional[float]:
        """计算移动平均"""
        ticks = self.price_feeds.get(token_pair)
        if not ticks or len(ticks) < period:
            return None

        recent = list(ticks)[-period:]
        return sum(t.price for t in recent) / len(recent)

    def detect_price_anomaly(self, token_pair: str, threshold: float = 0.05) -> bool:
        """检测价格异常(短时间大幅波动)"""
        ticks = self.price_feeds.get(token_pair)
        if not ticks or len(ticks) < 10:
            return False

        recent = list(ticks)[-10:]
        price_change = abs(recent[-1].price - recent[0].price) / recent[0].price
        return price_change > threshold

2.2 策略决策引擎

# strategy_engine.py — AI Agent 交易策略引擎
# 设计意图:结合规则策略和 AI 策略,
# 通过风控层过滤后生成交易信号

from dataclasses import dataclass, field
from typing import Optional
from enum import Enum
import time

class SignalType(Enum):
    BUY = "buy"
    SELL = "sell"
    HOLD = "hold"

@dataclass
class TradingSignal:
    signal_type: SignalType
    token: str
    amount: float
    confidence: float       # 0-1
    strategy: str           # 策略名称
    reason: str
    timestamp: float = field(default_factory=time.time)

@dataclass
class Position:
    token: str
    amount: float
    entry_price: float
    current_price: float
    pnl_pct: float

@dataclass
class RiskConfig:
    max_position_size: float = 10000      # 单仓位最大金额
    max_total_exposure: float = 50000     # 总敞口上限
    stop_loss_pct: float = 0.05           # 止损线 5%
    take_profit_pct: float = 0.15         # 止盈线 15%
    max_slippage: float = 0.01            # 最大滑点 1%

class StrategyEngine:
    def __init__(self, risk_config: RiskConfig):
        self.risk_config = risk_config
        self.positions: dict[str, Position] = {}
        self.strategies: dict[str, callable] = {}

    def register_strategy(self, name: str, strategy_fn: callable):
        """注册交易策略"""
        self.strategies[name] = strategy_fn

    async def evaluate(self, market_data: dict) -> list[TradingSignal]:
        """评估所有策略,生成交易信号"""
        signals = []

        for name, strategy_fn in self.strategies.items():
            try:
                signal = await strategy_fn(market_data, self.positions)
                if signal and signal.signal_type != SignalType.HOLD:
                    # 风控过滤
                    if self._risk_check(signal):
                        signals.append(signal)
            except Exception as e:
                print(f"[StrategyEngine] 策略 {name} 执行异常: {e}")

        # 按置信度排序
        signals.sort(key=lambda s: s.confidence, reverse=True)
        return signals

    def _risk_check(self, signal: TradingSignal) -> bool:
        """风控检查"""
        # 检查单仓位大小
        if signal.amount > self.risk_config.max_position_size:
            return False

        # 检查总敞口
        total_exposure = sum(p.amount * p.current_price for p in self.positions.values())
        if total_exposure + signal.amount > self.risk_config.max_total_exposure:
            return False

        # 检查止损
        if signal.token in self.positions:
            position = self.positions[signal.token]
            if position.pnl_pct < -self.risk_config.stop_loss_pct:
                # 已亏损超过止损线,只允许卖出
                return signal.signal_type == SignalType.SELL

        return True

    def update_position(self, token: str, amount: float, price: float):
        """更新持仓"""
        if token in self.positions:
            pos = self.positions[token]
            pos.amount += amount
            pos.current_price = price
            pos.pnl_pct = (price - pos.entry_price) / pos.entry_price
        else:
            self.positions[token] = Position(
                token=token,
                amount=amount,
                entry_price=price,
                current_price=price,
                pnl_pct=0,
            )


# 规则策略示例:均线交叉
async def moving_average_crossover(market_data: dict, positions: dict) -> Optional[TradingSignal]:
    """均线交叉策略"""
    prices = market_data.get('prices', [])
    if len(prices) < 50:
        return None

    ma_short = sum(prices[-20:]) / 20
    ma_long = sum(prices[-50:]) / 50

    if ma_short > ma_long * 1.01:
        return TradingSignal(
            signal_type=SignalType.BUY,
            token=market_data['token'],
            amount=1000,
            confidence=0.6,
            strategy="ma_crossover",
            reason=f"短期均线 {ma_short:.2f} 上穿长期均线 {ma_long:.2f}"
        )
    elif ma_short < ma_long * 0.99:
        return TradingSignal(
            signal_type=SignalType.SELL,
            token=market_data['token'],
            amount=1000,
            confidence=0.6,
            strategy="ma_crossover",
            reason=f"短期均线 {ma_short:.2f} 下穿长期均线 {ma_long:.2f}"
        )

    return None

三、交易执行与 MEV 保护

3.1 Flashbots 集成

# flashbots_executor.py — Flashbots 交易执行器
# 设计意图:通过 Flashbots 私有交易池提交交易,
# 避免三明治攻击和前置交易

import json
from dataclasses import dataclass
from typing import Optional
from web3 import Web3

@dataclass
class TransactionResult:
    tx_hash: str
    status: str           # confirmed / failed / pending
    gas_used: int
    effective_gas_price: int
    block_number: int

class FlashbotsExecutor:

    def __init__(self, web3: Web3, flashbus_relay_url: str):
        self.web3 = web3
        self.relay_url = flashbus_relay_url

    async def execute_private(
        self,
        signed_tx: bytes,
        target_block: int,
        max_block_delta: int = 3
    ) -> Optional[TransactionResult]:
        """通过 Flashbots 提交私有交易"""
        # 构建 Flashbots bundle
        bundle = [{
            "signed_transaction": signed_tx.hex(),
        }]

        # 发送到 Flashbots relay
        payload = {
            "jsonrpc": "2.0",
            "method": "eth_sendBundle",
            "params": [{
                "txs": [tx["signed_transaction"] for tx in bundle],
                "blockNumber": hex(target_block),
                "minTimestamp": 0,
                "maxTimestamp": 0,
            }],
            "id": 1,
        }

        # 简化实现:实际需要与 Flashbots relay 通信
        print(f"[Flashbots] 提交私有交易,目标区块: {target_block}")
        return None

    async def simulate(self, signed_tx: bytes, block_number: int) -> dict:
        """模拟交易执行,预计算 Gas 和收益"""
        # 使用 eth_call 模拟
        payload = {
            "jsonrpc": "2.0",
            "method": "eth_call",
            "params": [{"data": signed_tx.hex()}, hex(block_number)],
            "id": 1,
        }

        # 简化实现
        return {"success": True, "gas_used": 200000}

四、边界分析与架构权衡

AI 策略的过拟合风险:AI 交易策略容易在历史数据上过拟合——回测表现优秀但实盘亏损。链上市场的非平稳性(规则变化、参与者变化、流动性变化)加剧了过拟合问题。需要严格的样本外测试和持续监控策略衰减。

执行延迟的竞争劣势:AI Agent 的决策延迟(信号采集→策略计算→交易构建→提交确认)可能在数百毫秒到秒级。对于套利策略,这个延迟可能让机会消失。需要将策略逻辑编译为链上合约或使用协处理器减少延迟。

风控的保守与激进:保守的风控限制单仓位大小和总敞口,降低了单次亏损的绝对值,但也限制了盈利空间。激进的风控允许大仓位,但一次黑天鹅事件可能清零账户。风控参数需要根据策略的胜率和盈亏比动态调整。

Gas 成本与利润:链上交易的 Gas 成本是固定的,但利润取决于市场条件。在低波动期,交易利润可能无法覆盖 Gas 成本。需要设置最小利润阈值,低于阈值不执行交易。

五、总结

AI Agent 交易系统通过信号采集、策略决策和执行保护三层架构,实现了链上交易的自动化。信号采集层实时监控价格和链上事件,策略引擎结合规则和 AI 生成交易信号,风控层过滤高风险操作,Flashbots 执行器保护交易不被 MEV 攻击。但策略过拟合、执行延迟、风控参数和 Gas 成本是需要权衡的边界条件。落地建议:策略必须经过样本外测试;套利策略优先使用链上合约执行;风控参数根据策略表现动态调整;设置最小利润阈值过滤低价值交易。

补充落地建议:围绕“AI Agent 交易系统:从规则策略到智能决策,链上交易的自动化演进”继续推进时,应把验证标准写成可执行清单,而不是停留在经验判断。性能类方案要给出基准数据,架构类方案要给出故障隔离方式,AI 类方案要给出输出质量和人工兜底策略。每一次迭代都应回答三个问题:收益是否可量化,失败是否可回滚,维护成本是否被团队接受。

如果短期资源有限,可以先保留最关键的观测指标,包括处理耗时、失败率、资源占用和人工介入次数。等这些指标稳定后,再扩展自动化能力。这样的节奏更慢,但风险更低,也更符合生产级技术文章强调的工程可验证性。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐