310 lines
15 KiB
Markdown
310 lines
15 KiB
Markdown
# 系统架构说明
|
||
|
||
## 📐 整体架构
|
||
|
||
```
|
||
┌─────────────────────────────────────────────────────────────────┐
|
||
│ 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条)
|
||
```
|
||
|
||
### 输出文件结构
|
||
|
||
```json
|
||
{
|
||
"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. **可观测性**
|
||
- 详细日志
|
||
- 健康检查
|
||
- 统计信息
|