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

8.6 KiB
Raw Blame History

交易信号生成指南

📊 系统架构

系统分为两个独立的服务:

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.ymlscheduler 服务:

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调用需要通过

  1. 频率检查 - 今日调用 < 12次且距上次 ≥ 15分钟
  2. 数据检查 - K线数量 ≥ 100根
  3. 质量检查 - 综合得分 ≥ 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

可能原因:

  1. 综合得分太低 (< 15)
  2. 调用频率太高 (< 15分钟)
  3. 今日配额用完 (≥ 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: 生成信号失败

症状: 日志显示 ❌ 信号生成失败

可能原因:

  1. Redis数据不足
  2. 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

# 定期导出数据用于回测
# (后续可以开发专门的回测工具)