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

424 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 交易信号生成指南
## 📊 系统架构
系统分为两个独立的服务:
### 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
# 定期导出数据用于回测
# (后续可以开发专门的回测工具)
```