tradusai/ARCHITECTURE.md
2025-12-02 22:54:03 +08:00

15 KiB
Raw Blame History

系统架构说明

📐 整体架构

┌─────────────────────────────────────────────────────────────────┐
│                      Binance Futures                            │
│                   (WebSocket Streams)                           │
└────────────────┬────────────────────────────────────────────────┘
                 │
                 │ WebSocket连接
                 ▼
┌─────────────────────────────────────────────────────────────────┐
│              Data Ingestion Service (ingestion)                 │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │  • K线数据流 (5m, 15m, 1h, 4h)                          │  │
│  │  • 订单簿快照 (Top 20)                                   │  │
│  │  • 实时成交流                                            │  │
│  └──────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         │ 去重 → 缓冲 → 批量写入                │
│                         ▼                                        │
└─────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                    Redis (数据存储)                             │
│  ┌──────────────────────────────────────────────────────────┐  │
│  │  Stream: binance:raw:kline:5m  (5分钟K线)              │  │
│  │  Stream: binance:raw:kline:15m (15分钟K线)             │  │
│  │  Stream: binance:raw:kline:1h  (1小时K线)              │  │
│  │  Stream: binance:raw:kline:4h  (4小时K线)              │  │
│  │  Stream: binance:raw:depth:20  (订单簿Top20)            │  │
│  │  Stream: binance:raw:trade     (实时成交)               │  │
│  └──────────────────────────────────────────────────────────┘  │
└────────────────┬────────────────────────────────────────────────┘
                 │
                 │ 读取历史数据
                 ▼
┌─────────────────────────────────────────────────────────────────┐
│          Signal Generation Service (scheduler)                  │
│                                                                 │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │  1⃣ Market Analysis Engine                             │  │
│  │     • 获取6个时间周期数据 (5m/15m/1h/4h/1d/1w)         │  │
│  │     • 计算技术指标 (RSI/MACD/ATR/EMA/ADX...)           │  │
│  │     • 识别支撑压力位                                    │  │
│  │     • 分析订单流                                        │  │
│  └─────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │  2⃣ Quantitative Signal Generator                      │  │
│  │     • 趋势得分 (Trend Score)                            │  │
│  │     • 动量得分 (Momentum Score)                         │  │
│  │     • 订单流得分 (OrderFlow Score)                      │  │
│  │     • 突破得分 (Breakout Score)                         │  │
│  │     • 综合得分 = 加权平均                               │  │
│  │     → 输出: BUY/SELL/HOLD + 置信度                      │  │
│  └─────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │  3⃣ LLM Gate (极简门控)                                │  │
│  │     ✓ 频率限制 (12次/天, 间隔≥15分钟)                  │  │
│  │     ✓ 数据检查 (K线≥100根)                             │  │
│  │     ✓ 质量检查 (综合得分≥15)                           │  │
│  │     → PASS / BLOCK                                      │  │
│  └─────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         ▼ (if PASS)                              │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │  4⃣ LLM Decision Maker (可选)                          │  │
│  │     • 使用: Deepseek / GPT / Claude                     │  │
│  │     • 输入: 多时间周期完整技术分析                      │  │
│  │     • 输出: 交易机会识别                                │  │
│  │       - 日内机会 (Intraday)                            │  │
│  │       - 中长线机会 (Swing)                              │  │
│  │       - 埋伏点位 (Ambush)                               │  │
│  │     • 包含: 进场价/止损/止盈/风险评估                   │  │
│  └─────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         ▼                                        │
│  ┌─────────────────────────────────────────────────────────┐  │
│  │  5⃣ Signal Aggregator                                  │  │
│  │     • 融合量化信号 + LLM信号                            │  │
│  │     • 检查一致性 (Consensus)                            │  │
│  │     • 计算最终置信度                                    │  │
│  │     • 生成综合建议                                      │  │
│  └─────────────────────────────────────────────────────────┘  │
│                         │                                        │
│                         ▼                                        │
│                  保存到文件                                     │
└─────────────────────────────────────────────────────────────────┘
                          │
                          ▼
┌─────────────────────────────────────────────────────────────────┐
│                 Output (输出文件)                               │
│                                                                 │
│  ./output/latest_signal.json                                   │
│  {                                                              │
│    "timestamp": "2025-11-30T13:23:24",                         │
│    "aggregated_signal": {                                      │
│      "final_signal": "BUY",                                    │
│      "final_confidence": 0.75,                                 │
│      "opportunities": {...}                                    │
│    },                                                           │
│    "quantitative_signal": {...},                               │
│    "llm_signal": {...}                                         │
│  }                                                              │
└─────────────────────────────────────────────────────────────────┘

🔄 数据流详解

1. 实时数据采集 (24/7持续)

Binance WebSocket → Ingestion Service → Redis Streams
     ↓                    ↓                    ↓
  • K线更新           • 去重过滤          • 持久化存储
  • 订单簿快照        • 缓冲优化          • 时间序列
  • 实时成交          • 批量写入          • 可回溯查询

特点:

  • 低延迟 (< 100ms)
  • 高可靠 (自动重连)
  • 防重复 (去重缓存)
  • 流量控制 (缓冲 + 速率限制)

2. 信号生成 (定时或手动)

模式A: 定时自动生成 (scheduler服务)

每N分钟触发
    ↓
读取Redis历史数据
    ↓
执行完整分析链路
    ↓
保存信号到文件

配置: SIGNAL_INTERVAL_MINUTES=5 (可调整)

模式B: 手动执行

用户触发
    ↓
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
    ↓
一次性生成信号

3. LLM调用控制流程

量化信号生成
    ↓
┌───────────────────┐
│  LLM Gate检查     │
│                   │
│  ✓ 频率OK?        │────NO───→ 跳过LLM使用量化信号
│  ✓ 数据OK?        │
│  ✓ 质量OK?        │
└───────┬───────────┘
        │ YES
        ▼
调用 LLM API
    ↓
获取深度分析
    ↓
融合量化+LLM
    ↓
输出最终信号

Gate保护机制:

  • 🚦 防止过度调用 (成本控制)
  • 🚦 确保数据质量 (分析准确性)
  • 🚦 频率合理分布 (避免集中消耗)

⚙️ 服务依赖关系

┌──────────┐
│  Redis   │ ← 基础服务,必须先启动
└────┬─────┘
     │
     ├─────→ ┌──────────────┐
     │       │  Ingestion   │ ← 数据采集,持续运行
     │       └──────────────┘
     │
     └─────→ ┌──────────────┐
             │  Scheduler   │ ← 信号生成,可选启动
             └──────────────┘

启动顺序:

  1. Redis (自动健康检查)
  2. Ingestion (依赖Redis健康)
  3. Scheduler (依赖Redis健康可选)

🗂️ 数据存储结构

Redis Streams 结构

binance:raw:kline:5m
├─ 消息ID: 1701234567890-0
│  ├─ event_time: 1701234567890
│  ├─ symbol: BTCUSDT
│  ├─ kline_start_time: 1701234500000
│  ├─ kline_close_time: 1701234599999
│  ├─ open: "91650.10"
│  ├─ high: "91680.50"
│  ├─ low: "91620.00"
│  ├─ close: "91670.30"
│  ├─ volume: "123.45"
│  └─ ...
├─ 消息ID: 1701234567891-0
│  └─ ...
└─ (最多保留10000条)

输出文件结构

{
  "timestamp": "ISO格式时间戳",
  "aggregated_signal": {
    "final_signal": "BUY|SELL|HOLD",
    "final_confidence": 0.0-1.0,
    "consensus": "字符串描述",
    "opportunities": {
      "intraday": "日内机会详情",
      "swing": "中长线机会详情",
      "ambush": "埋伏点位详情"
    },
    "levels": "价格位详情",
    "recommendation": "综合建议"
  },
  "market_analysis": "市场分析详情",
  "quantitative_signal": "量化信号详情",
  "llm_signal": "LLM信号详情"
}

🔐 安全和配置

环境变量层级

1. docker-compose.yml (服务默认配置)
   ↓ 可被覆盖
2. .env 文件 (本地配置)
   ↓ 可被覆盖
3. 环境变量 (运行时配置)

敏感信息保护

✅ 推荐: 使用 .env.local 文件 (添加到 .gitignore)
❌ 避免: 直接在 docker-compose.yml 中硬编码API key

📊 性能特征

数据采集服务 (Ingestion)

  • 吞吐量: ~1000 消息/秒
  • 延迟: < 100ms (WebSocket → Redis)
  • 内存: ~50-100 MB
  • CPU: < 5% (空闲时)

信号生成服务 (Scheduler)

  • 执行时间: 2-5秒/次 (无LLM), 10-30秒/次 (有LLM)
  • 内存: ~200-300 MB
  • CPU: 10-20% (计算时), < 1% (等待时)

LLM API调用

  • 延迟: 5-20秒 (Deepseek), 2-10秒 (GPT-4)
  • 成本: ~$0.001/次 (Deepseek), ~$0.01/次 (GPT-4)
  • 限流: 通过LLM Gate控制

🎯 设计原则

  1. 关注点分离

    • 数据采集 ≠ 信号生成
    • 可独立部署、独立扩展
  2. 可靠性优先

    • WebSocket自动重连
    • Redis持久化
    • 优雅关闭
  3. 成本可控

    • LLM Gate严格限流
    • 只在高质量场景调用
  4. 灵活配置

    • 环境变量控制所有参数
    • 支持多种运行模式
  5. 可观测性

    • 详细日志
    • 健康检查
    • 统计信息