feat: 新增 Wiki 基础理论和流程图解模块
基础理论: - 量化交易入门指南(零基础友好,含学习路径) 流程图解(3个完整流程图): - 信号系统完整流程图(总体/评分/EWO转换/大周期过滤) - 交易策略执行流程(通用流程/EWO决策树/MTF协同/风控) - 数据采集与处理流程(API获取/缓存管理/指标计算/质量检查) 所有内部链接均指向仓库内文档,无外部链接
这个提交包含在:
232
wiki/流程图解/数据采集与处理流程.md
普通文件
232
wiki/流程图解/数据采集与处理流程.md
普通文件
@@ -0,0 +1,232 @@
|
||||
# 数据采集与处理流程
|
||||
|
||||
> 返回:[Wiki 主索引](../README.md)
|
||||
> 相关文档:[数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md)
|
||||
|
||||
## 概述
|
||||
|
||||
本文档说明量化交易系统中数据从交易所 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秒 |
|
||||
| 交易信号 | MySQL(signals 表) | 永久 | 实时 |
|
||||
| 用户配置 | MySQL(user_settings 表) | 永久 | 用户操作时 |
|
||||
| 历史 K 线 | 本地文件(Parquet/CSV) | 按需 | 手动下载 |
|
||||
| 链上数据 | 本地文件(JSON/CSV) | 按需 | 每日更新 |
|
||||
|
||||
---
|
||||
|
||||
## 七、API 速率限制处理
|
||||
|
||||
Binance API 有速率限制,需要合理规划请求频率:
|
||||
|
||||
| API 类型 | 限制 | tradehk 处理方式 |
|
||||
|---------|------|----------------|
|
||||
| REST API(K线)| 1200 请求/分钟 | 30秒轮询,每次批量获取 |
|
||||
| REST API(行情)| 1200 请求/分钟 | 与K线合并请求 |
|
||||
| WebSocket | 300 连接/5分钟 | 复用连接,不频繁重连 |
|
||||
|
||||
**注意**:监控超过 20 个币对时,建议将轮询间隔调整为 60 秒,避免触发速率限制。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [数据采集与处理流程](../../06_数据流程/数据采集与处理流程.md) — 详细数据流程
|
||||
- [tradehk 数据库与存储](../tradehk/数据库与存储.md) — 存储机制
|
||||
- [链上数据分析指南](../../10_链上数据分析/链上数据分析指南.md) — 链上数据扩展
|
||||
在新工单中引用
屏蔽一个用户