文件
quantKonwledge/wiki/流程图解/数据采集与处理流程.md
Manus Quant Agent e75a2340d9 feat: 新增 Wiki 基础理论和流程图解模块
基础理论:
- 量化交易入门指南(零基础友好,含学习路径)

流程图解(3个完整流程图):
- 信号系统完整流程图(总体/评分/EWO转换/大周期过滤)
- 交易策略执行流程(通用流程/EWO决策树/MTF协同/风控)
- 数据采集与处理流程(API获取/缓存管理/指标计算/质量检查)

所有内部链接均指向仓库内文档,无外部链接
2026-03-05 23:18:29 -05:00

14 KiB

数据采集与处理流程

返回:Wiki 主索引 相关文档:数据采集与处理流程

概述

本文档说明量化交易系统中数据从交易所 API 到信号计算的完整流程,包括数据获取、清洗、存储和实时更新。


一、Binance API 数据获取流程

┌─────────────────────────────────────────────────────────────┐
│                    Binance API 端点                          │
│                                                             │
│  REST API历史数据                                      │
│  GET /api/v3/klines                                         │
│  参数symbol, interval, limit最多1000根                 │
│                                                             │
│  WebSocket实时数据                                     │
│  wss://stream.binance.com:9443/ws/{symbol}@kline_{interval} │
└──────────────────────┬──────────────────────────────────────┘
                       │
          ┌────────────┴────────────┐
          ▼                         ▼
┌─────────────────┐       ┌──────────────────────┐
│  初始化加载      │       │  实时更新              │
│  (启动时)       │       │  (持续运行)            │
│                 │       │                       │
│  拉取最近300根  │       │  WebSocket 推送        │
│  K线数据        │       │  每根K线实时更新        │
│  存入 pairCache │       │  收线时触发信号检测     │
└────────┬────────┘       └──────────┬───────────┘
         │                           │
         └────────────┬──────────────┘
                      ▼
┌─────────────────────────────────────────────────────────────┐
│                    数据格式标准化                             │
│                                                             │
│  原始 Binance K线格式                                      │
│  [openTime, open, high, low, close, volume,                 │
│   closeTime, quoteVolume, trades, ...]                      │
│                                                             │
│  标准化后的 Candle 格式:                                    │
│  { time: number,    // Unix 时间戳(秒)                     │
│    open: number,    // 开盘价                               │
│    high: number,    // 最高价                               │
│    low: number,     // 最低价                               │
│    close: number,   // 收盘价                               │
│    volume: number } // 成交量                               │
└──────────────────────────────────────────────────────────────┘

二、K线缓存管理流程

pairCache 缓存结构:
Map<"BTCUSDT__10m", {
  candles: Candle[],  // 最多 300 根
  updatedAt: number   // 最后更新时间
}>

┌─────────────────────────────────────────────────────────────┐
│                    缓存更新策略                               │
│                                                             │
│  每30秒轮询                                               │
│  1. 检查缓存是否过期(> 30秒                               │
│  2. 调用 Binance REST API 获取最新 K 线                     │
│  3. 合并新数据到缓存(去重、排序)                            │
│  4. 保留最近 300 根(超出则删除最旧的)                      │
│  5. 更新 updatedAt 时间戳                                   │
│                                                             │
│  WebSocket 实时更新:                                        │
│  1. 收到 kline 消息                                         │
│  2. 判断是否已收线x: true                               │
│  3. 已收线 → 更新缓存中最后一根 K 线                        │
│  4. 触发信号检测                                            │
└──────────────────────────────────────────────────────────────┘

三、指标计算数据流

输入Candle[] 数组300根K线
        │
        ▼
┌─────────────────────────────────────────────────────────────┐
│  提取价格序列                                                │
│  closes = candles.map(c => c.close)                         │
│  highs  = candles.map(c => c.high)                          │
│  lows   = candles.map(c => c.low)                           │
│  volumes = candles.map(c => c.volume)                       │
│  midPrices = candles.map(c => (c.high + c.low) / 2)        │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  基础指标计算(所有指标的基础)                               │
│                                                             │
│  EMA(5)  = 指数移动平均周期5                             │
│  EMA(10) = 指数移动平均周期10                            │
│  EMA(20) = 指数移动平均周期20                            │
│  EMA(35) = 指数移动平均周期35                            │
│                                                             │
│  计算公式:                                                  │
│  EMA[i] = price[i] × k + EMA[i-1] × (1-k)                 │
│  k = 2 / (period + 1)                                      │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  衍生指标计算                                                │
│                                                             │
│  EWO  = EMA(5) - EMA(35)                                   │
│  MACD = EMA(10) - EMA(20)                                  │
│  MACD信号线 = EMA(MACD, 10)                                 │
│  MACD柱 = MACD - 信号线                                     │
│                                                             │
│  AO = SMA(midPrices, 5) - SMA(midPrices, 34)              │
│                                                             │
│  RSI = 100 - 100/(1 + RS)                                  │
│  RS = 平均涨幅(14) / 平均跌幅(14)                           │
└──────────────────────┬──────────────────────────────────────┘
                       │
                       ▼
┌─────────────────────────────────────────────────────────────┐
│  信号评分计算                                                │
│  (见:信号系统完整流程图)                                   │
└──────────────────────────────────────────────────────────────┘

四、数据质量检查流程

原始 K 线数据
        │
        ▼
┌─────────────────────────────────────┐
│  完整性检查                          │
│  ├─ 时间戳连续性(无缺口)            │
│  ├─ OHLC 逻辑合理性                  │
│  │   high >= max(open, close)        │
│  │   low  <= min(open, close)        │
│  └─ 成交量 >= 0                      │
└──────────────────┬──────────────────┘
                   │
                   ▼
┌─────────────────────────────────────┐
│  异常值处理                          │
│  ├─ 价格跳空(> 20%)→ 标记警告      │
│  ├─ 成交量异常(> 10倍均值→ 标记   │
│  └─ 零成交量 → 使用前一根数据填充    │
└──────────────────┬──────────────────┘
                   │
                   ▼
┌─────────────────────────────────────┐
│  数据量检查                          │
│  K线数量 >= 35 根?                  │
│  ├─ 否 → 返回 null数据不足       │
│  └─ 是 → 继续计算                   │
└─────────────────────────────────────┘

五、多数据源整合流程(扩展方案)

┌──────────┐  ┌──────────┐  ┌──────────┐  ┌──────────┐
│ Binance  │  │ Glassnode│  │Coinglass │  │ CoinGecko│
│ K线数据  │  │ 链上数据 │  │ 资金费率 │  │ 恐惧指数 │
└────┬─────┘  └────┬─────┘  └────┬─────┘  └────┬─────┘
     │              │              │              │
     └──────────────┴──────────────┴──────────────┘
                              │
                              ▼
                   ┌──────────────────────┐
                   │   数据聚合层          │
                   │   统一时间戳          │
                   │   标准化格式          │
                   │   缺失值处理          │
                   └──────────┬───────────┘
                              │
                              ▼
                   ┌──────────────────────┐
                   │   多维度信号引擎      │
                   │   技术指标层权重60%)│
                   │   链上数据层权重25%)│
                   │   情绪指标层权重15%)│
                   └──────────────────────┘

六、数据存储策略

数据类型 存储位置 保留时间 更新频率
实时 K 线 内存缓存pairCache 300根 30秒
行情数据 内存缓存tickerCache 最新1条 30秒
交易信号 MySQLsignals 表) 永久 实时
用户配置 MySQLuser_settings 表) 永久 用户操作时
历史 K 线 本地文件Parquet/CSV 按需 手动下载
链上数据 本地文件JSON/CSV 按需 每日更新

七、API 速率限制处理

Binance API 有速率限制,需要合理规划请求频率:

API 类型 限制 tradehk 处理方式
REST APIK线 1200 请求/分钟 30秒轮询,每次批量获取
REST API行情 1200 请求/分钟 与K线合并请求
WebSocket 300 连接/5分钟 复用连接,不频繁重连

注意:监控超过 20 个币对时,建议将轮询间隔调整为 60 秒,避免触发速率限制。

相关文档