424 lines
8.6 KiB
Markdown
424 lines
8.6 KiB
Markdown
# 交易信号生成指南
|
||
|
||
## 📊 系统架构
|
||
|
||
系统分为两个独立的服务:
|
||
|
||
### 1. 数据采集服务 (ingestion) - 持续运行
|
||
- **功能**: WebSocket实时数据采集
|
||
- **数据源**: Binance期货WebSocket (K线、订单簿、交易流)
|
||
- **存储**: Redis Streams
|
||
- **状态**: 24/7持续运行
|
||
|
||
### 2. 信号生成服务 (scheduler) - 可选运行
|
||
- **功能**: 定时执行量化分析 + LLM决策
|
||
- **数据源**: 从Redis读取历史数据
|
||
- **输出**: 交易信号JSON文件
|
||
- **运行模式**: 定时自动 或 手动执行
|
||
|
||
---
|
||
|
||
## 🚀 运行方式
|
||
|
||
### 方式一:只运行数据采集(默认)
|
||
|
||
**适用场景**: 只需要采集数据,手动生成信号
|
||
|
||
```bash
|
||
# 启动数据采集服务
|
||
docker compose up -d
|
||
|
||
# 查看状态
|
||
docker compose ps
|
||
|
||
# 查看日志
|
||
docker compose logs -f ingestion
|
||
```
|
||
|
||
**运行的服务**:
|
||
- ✅ `redis` - 数据存储
|
||
- ✅ `ingestion` - WebSocket数据采集
|
||
- ❌ `scheduler` - 未启动
|
||
|
||
**手动生成信号**:
|
||
```bash
|
||
# 随时可以手动执行
|
||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||
```
|
||
|
||
---
|
||
|
||
### 方式二:数据采集 + 自动信号生成(推荐)
|
||
|
||
**适用场景**: 完全自动化,定时生成交易信号
|
||
|
||
```bash
|
||
# 启动数据采集 + 信号调度器
|
||
docker compose --profile scheduler up -d
|
||
|
||
# 查看状态
|
||
docker compose --profile scheduler ps
|
||
|
||
# 查看调度器日志
|
||
docker compose logs -f scheduler
|
||
|
||
# 查看采集服务日志
|
||
docker compose logs -f ingestion
|
||
```
|
||
|
||
**运行的服务**:
|
||
- ✅ `redis` - 数据存储
|
||
- ✅ `ingestion` - WebSocket数据采集
|
||
- ✅ `scheduler` - 定时信号生成 (每5分钟)
|
||
|
||
**配置信号生成间隔**:
|
||
|
||
编辑 `docker-compose.yml` 修改环境变量:
|
||
```yaml
|
||
scheduler:
|
||
environment:
|
||
- SIGNAL_INTERVAL_MINUTES=5 # 改为你想要的间隔(分钟)
|
||
```
|
||
|
||
支持的间隔:
|
||
- `1` - 每1分钟(高频,适合测试)
|
||
- `5` - 每5分钟(推荐,平衡频率和成本)
|
||
- `15` - 每15分钟(低频,节省LLM调用)
|
||
- `60` - 每1小时(很低频)
|
||
|
||
---
|
||
|
||
### 方式三:手动执行单次信号生成
|
||
|
||
**适用场景**: 测试、调试、手动判断
|
||
|
||
```bash
|
||
# 确保数据采集服务在运行
|
||
docker compose up -d
|
||
|
||
# 手动执行一次信号生成
|
||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||
```
|
||
|
||
---
|
||
|
||
## 📁 信号输出
|
||
|
||
### 输出文件位置
|
||
```
|
||
./output/latest_signal.json
|
||
```
|
||
|
||
### 输出文件格式
|
||
```json
|
||
{
|
||
"timestamp": "2025-11-30T13:23:24.816000",
|
||
"aggregated_signal": {
|
||
"final_signal": "BUY",
|
||
"final_confidence": 0.75,
|
||
"consensus": "QUANT_ONLY",
|
||
"opportunities": {
|
||
"intraday": {
|
||
"exists": true,
|
||
"direction": "LONG",
|
||
"entry_price": 91128.0,
|
||
"stop_loss": 91000.0,
|
||
"take_profit": 91342.0
|
||
},
|
||
"swing": {...},
|
||
"ambush": {...}
|
||
}
|
||
},
|
||
"market_analysis": {...},
|
||
"quantitative_signal": {...},
|
||
"llm_signal": {...}
|
||
}
|
||
```
|
||
|
||
### 查看最新信号
|
||
```bash
|
||
# 直接查看
|
||
cat output/latest_signal.json
|
||
|
||
# 格式化查看
|
||
cat output/latest_signal.json | jq .
|
||
```
|
||
|
||
---
|
||
|
||
## 🔧 配置LLM API(可选)
|
||
|
||
如果需要LLM深度分析,配置API key:
|
||
|
||
### 方法1: 修改 docker-compose.yml
|
||
|
||
编辑 `docker-compose.yml` 的 `scheduler` 服务:
|
||
|
||
```yaml
|
||
scheduler:
|
||
environment:
|
||
# 使用 Deepseek (推荐,低成本)
|
||
- OPENAI_API_KEY=sk-your-deepseek-key
|
||
- OPENAI_BASE_URL=https://api.deepseek.com
|
||
|
||
# 或使用 OpenAI GPT
|
||
# - OPENAI_API_KEY=sk-your-openai-key
|
||
|
||
# 或使用 Claude
|
||
# - ANTHROPIC_API_KEY=sk-ant-your-key
|
||
```
|
||
|
||
### 方法2: 使用 .env 文件
|
||
|
||
创建 `.env.local` 文件:
|
||
```bash
|
||
OPENAI_API_KEY=sk-your-key
|
||
OPENAI_BASE_URL=https://api.deepseek.com
|
||
```
|
||
|
||
修改 docker-compose.yml:
|
||
```yaml
|
||
scheduler:
|
||
env_file:
|
||
- .env.local
|
||
```
|
||
|
||
---
|
||
|
||
## 📊 LLM Gate 控制
|
||
|
||
### 当前配置(极简模式)
|
||
|
||
LLM Gate 确保合理使用LLM API:
|
||
|
||
```yaml
|
||
LLM_GATE_ENABLED: true # 启用门控
|
||
LLM_MIN_CANDLES: 100 # 最少K线数量
|
||
LLM_MIN_COMPOSITE_SCORE: 15.0 # 综合得分门槛
|
||
LLM_MAX_CALLS_PER_DAY: 12 # 每天最多调用12次
|
||
LLM_MIN_INTERVAL_MINUTES: 15 # 调用间隔≥15分钟
|
||
```
|
||
|
||
### Gate 逻辑
|
||
|
||
信号生成时,LLM调用需要通过:
|
||
|
||
1. ✅ **频率检查** - 今日调用 < 12次,且距上次 ≥ 15分钟
|
||
2. ✅ **数据检查** - K线数量 ≥ 100根
|
||
3. ✅ **质量检查** - 综合得分 ≥ 15(过滤完全中性信号)
|
||
|
||
### 查看Gate统计
|
||
|
||
```bash
|
||
docker compose exec scheduler python -c "
|
||
from signals.llm_gate import LLMGate
|
||
gate = LLMGate()
|
||
stats = gate.get_stats()
|
||
print(f'今日调用: {stats[\"today_calls\"]}/{stats[\"max_calls_per_day\"]}')
|
||
print(f'剩余配额: {stats[\"remaining_calls_today\"]}')
|
||
print(f'距离上次: {stats[\"minutes_since_last_call\"]:.1f} 分钟' if stats['minutes_since_last_call'] else '从未调用')
|
||
"
|
||
```
|
||
|
||
---
|
||
|
||
## 🔍 监控和日志
|
||
|
||
### 查看实时日志
|
||
|
||
```bash
|
||
# 数据采集日志
|
||
docker compose logs -f ingestion
|
||
|
||
# 信号生成日志
|
||
docker compose logs -f scheduler
|
||
|
||
# 所有服务日志
|
||
docker compose logs -f
|
||
```
|
||
|
||
### 日志关键信息
|
||
|
||
**数据采集 (ingestion)**:
|
||
```
|
||
Health Check | WebSocket: ✓ | Redis: ✓ | Buffer: 0.5% | Written: 12345
|
||
```
|
||
|
||
**信号生成 (scheduler)**:
|
||
```
|
||
📊 开始生成交易信号 - 2025-11-30 13:23:24
|
||
✅ 市场分析完成 - 价格: $91,650.10, 趋势: 上涨
|
||
📈 量化信号: BUY (得分: 51.5)
|
||
✅ LLM Gate: PASSED - 信号类型: BUY, 综合得分: 51.5
|
||
🤖 LLM信号: BUY (置信度: 60.00%)
|
||
🎯 最终信号: BUY (置信度: 75.00%)
|
||
💾 信号已保存到: /app/output/latest_signal.json
|
||
```
|
||
|
||
---
|
||
|
||
## ⚙️ 常用命令
|
||
|
||
### 启动/停止服务
|
||
|
||
```bash
|
||
# 只启动数据采集
|
||
docker compose up -d
|
||
|
||
# 启动数据采集 + 信号调度
|
||
docker compose --profile scheduler up -d
|
||
|
||
# 停止所有服务
|
||
docker compose down
|
||
|
||
# 重启某个服务
|
||
docker compose restart scheduler
|
||
docker compose restart ingestion
|
||
```
|
||
|
||
### 查看状态
|
||
|
||
```bash
|
||
# 查看运行状态
|
||
docker compose ps
|
||
|
||
# 查看资源使用
|
||
docker stats tradus-ingestion tradus-scheduler
|
||
|
||
# 查看网络
|
||
docker network inspect realtime-ingestion_tradus-network
|
||
```
|
||
|
||
### 进入容器
|
||
|
||
```bash
|
||
# 进入数据采集容器
|
||
docker compose exec ingestion bash
|
||
|
||
# 进入调度器容器
|
||
docker compose exec scheduler bash
|
||
|
||
# 进入Redis
|
||
docker compose exec redis redis-cli
|
||
```
|
||
|
||
---
|
||
|
||
## 🐛 故障排查
|
||
|
||
### 问题1: scheduler未启动
|
||
|
||
**症状**: `docker compose ps` 看不到 `tradus-scheduler`
|
||
|
||
**原因**: 默认情况下scheduler是profile服务,不会自动启动
|
||
|
||
**解决**:
|
||
```bash
|
||
docker compose --profile scheduler up -d
|
||
```
|
||
|
||
### 问题2: LLM总是被Gate拦截
|
||
|
||
**症状**: 日志显示 `🚫 LLM Gate: BLOCKED`
|
||
|
||
**可能原因**:
|
||
1. 综合得分太低 (< 15)
|
||
2. 调用频率太高 (< 15分钟)
|
||
3. 今日配额用完 (≥ 12次)
|
||
|
||
**解决**:
|
||
```bash
|
||
# 查看Gate状态
|
||
docker compose exec scheduler python -c "from signals.llm_gate import LLMGate; print(LLMGate().get_stats())"
|
||
|
||
# 降低综合得分门槛 (修改 .env)
|
||
LLM_MIN_COMPOSITE_SCORE=10.0
|
||
|
||
# 增加每日配额 (修改 .env)
|
||
LLM_MAX_CALLS_PER_DAY=20
|
||
|
||
# 重启服务
|
||
docker compose --profile scheduler restart scheduler
|
||
```
|
||
|
||
### 问题3: 生成信号失败
|
||
|
||
**症状**: 日志显示 `❌ 信号生成失败`
|
||
|
||
**可能原因**:
|
||
1. Redis数据不足
|
||
2. K线数据 < 100根
|
||
|
||
**解决**:
|
||
```bash
|
||
# 检查Redis数据
|
||
docker compose exec redis redis-cli
|
||
> XLEN binance:raw:kline:5m
|
||
|
||
# 等待数据累积(至少20分钟)
|
||
# 或手动从Binance API获取历史数据
|
||
```
|
||
|
||
---
|
||
|
||
## 📈 性能优化
|
||
|
||
### 调整信号生成间隔
|
||
|
||
根据交易策略调整:
|
||
|
||
- **高频策略**: 1-5分钟
|
||
- **中频策略**: 5-15分钟(推荐)
|
||
- **低频策略**: 15-60分钟
|
||
|
||
### 调整LLM调用频率
|
||
|
||
在 `.env` 中配置:
|
||
|
||
```bash
|
||
# 保守模式(节省成本)
|
||
LLM_MAX_CALLS_PER_DAY=5
|
||
LLM_MIN_INTERVAL_MINUTES=30
|
||
LLM_MIN_COMPOSITE_SCORE=20.0
|
||
|
||
# 激进模式(更多LLM分析)
|
||
LLM_MAX_CALLS_PER_DAY=20
|
||
LLM_MIN_INTERVAL_MINUTES=10
|
||
LLM_MIN_COMPOSITE_SCORE=10.0
|
||
|
||
# 平衡模式(推荐)
|
||
LLM_MAX_CALLS_PER_DAY=12
|
||
LLM_MIN_INTERVAL_MINUTES=15
|
||
LLM_MIN_COMPOSITE_SCORE=15.0
|
||
```
|
||
|
||
---
|
||
|
||
## 🎯 推荐使用方式
|
||
|
||
### 开发/测试阶段
|
||
```bash
|
||
# 只运行数据采集,手动测试信号生成
|
||
docker compose up -d
|
||
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
|
||
```
|
||
|
||
### 生产/自动化阶段
|
||
```bash
|
||
# 运行数据采集 + 自动信号生成
|
||
docker compose --profile scheduler up -d
|
||
|
||
# 配置LLM API key(在docker-compose.yml中)
|
||
# 监控日志
|
||
docker compose logs -f scheduler
|
||
```
|
||
|
||
### 回测/分析阶段
|
||
```bash
|
||
# 只运行数据采集,积累历史数据
|
||
docker compose up -d
|
||
|
||
# 定期导出数据用于回测
|
||
# (后续可以开发专门的回测工具)
|
||
```
|