8.6 KiB
8.6 KiB
交易信号生成指南
📊 系统架构
系统分为两个独立的服务:
1. 数据采集服务 (ingestion) - 持续运行
- 功能: WebSocket实时数据采集
- 数据源: Binance期货WebSocket (K线、订单簿、交易流)
- 存储: Redis Streams
- 状态: 24/7持续运行
2. 信号生成服务 (scheduler) - 可选运行
- 功能: 定时执行量化分析 + LLM决策
- 数据源: 从Redis读取历史数据
- 输出: 交易信号JSON文件
- 运行模式: 定时自动 或 手动执行
🚀 运行方式
方式一:只运行数据采集(默认)
适用场景: 只需要采集数据,手动生成信号
# 启动数据采集服务
docker compose up -d
# 查看状态
docker compose ps
# 查看日志
docker compose logs -f ingestion
运行的服务:
- ✅
redis- 数据存储 - ✅
ingestion- WebSocket数据采集 - ❌
scheduler- 未启动
手动生成信号:
# 随时可以手动执行
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
方式二:数据采集 + 自动信号生成(推荐)
适用场景: 完全自动化,定时生成交易信号
# 启动数据采集 + 信号调度器
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 修改环境变量:
scheduler:
environment:
- SIGNAL_INTERVAL_MINUTES=5 # 改为你想要的间隔(分钟)
支持的间隔:
1- 每1分钟(高频,适合测试)5- 每5分钟(推荐,平衡频率和成本)15- 每15分钟(低频,节省LLM调用)60- 每1小时(很低频)
方式三:手动执行单次信号生成
适用场景: 测试、调试、手动判断
# 确保数据采集服务在运行
docker compose up -d
# 手动执行一次信号生成
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
📁 信号输出
输出文件位置
./output/latest_signal.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": {...}
}
查看最新信号
# 直接查看
cat output/latest_signal.json
# 格式化查看
cat output/latest_signal.json | jq .
🔧 配置LLM API(可选)
如果需要LLM深度分析,配置API key:
方法1: 修改 docker-compose.yml
编辑 docker-compose.yml 的 scheduler 服务:
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 文件:
OPENAI_API_KEY=sk-your-key
OPENAI_BASE_URL=https://api.deepseek.com
修改 docker-compose.yml:
scheduler:
env_file:
- .env.local
📊 LLM Gate 控制
当前配置(极简模式)
LLM Gate 确保合理使用LLM API:
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调用需要通过:
- ✅ 频率检查 - 今日调用 < 12次,且距上次 ≥ 15分钟
- ✅ 数据检查 - K线数量 ≥ 100根
- ✅ 质量检查 - 综合得分 ≥ 15(过滤完全中性信号)
查看Gate统计
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 '从未调用')
"
🔍 监控和日志
查看实时日志
# 数据采集日志
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
⚙️ 常用命令
启动/停止服务
# 只启动数据采集
docker compose up -d
# 启动数据采集 + 信号调度
docker compose --profile scheduler up -d
# 停止所有服务
docker compose down
# 重启某个服务
docker compose restart scheduler
docker compose restart ingestion
查看状态
# 查看运行状态
docker compose ps
# 查看资源使用
docker stats tradus-ingestion tradus-scheduler
# 查看网络
docker network inspect realtime-ingestion_tradus-network
进入容器
# 进入数据采集容器
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服务,不会自动启动
解决:
docker compose --profile scheduler up -d
问题2: LLM总是被Gate拦截
症状: 日志显示 🚫 LLM Gate: BLOCKED
可能原因:
- 综合得分太低 (< 15)
- 调用频率太高 (< 15分钟)
- 今日配额用完 (≥ 12次)
解决:
# 查看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: 生成信号失败
症状: 日志显示 ❌ 信号生成失败
可能原因:
- Redis数据不足
- K线数据 < 100根
解决:
# 检查Redis数据
docker compose exec redis redis-cli
> XLEN binance:raw:kline:5m
# 等待数据累积(至少20分钟)
# 或手动从Binance API获取历史数据
📈 性能优化
调整信号生成间隔
根据交易策略调整:
- 高频策略: 1-5分钟
- 中频策略: 5-15分钟(推荐)
- 低频策略: 15-60分钟
调整LLM调用频率
在 .env 中配置:
# 保守模式(节省成本)
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
🎯 推荐使用方式
开发/测试阶段
# 只运行数据采集,手动测试信号生成
docker compose up -d
docker compose exec ingestion python /app/scripts/generate_trading_signal.py
生产/自动化阶段
# 运行数据采集 + 自动信号生成
docker compose --profile scheduler up -d
# 配置LLM API key(在docker-compose.yml中)
# 监控日志
docker compose logs -f scheduler
回测/分析阶段
# 只运行数据采集,积累历史数据
docker compose up -d
# 定期导出数据用于回测
# (后续可以开发专门的回测工具)