生产环境优化

本章详细介绍 Freqtrade 在生产环境中的优化策略,涵盖性能调优、内存管理、数据库优化、多机器人管理以及监控告警体系搭建,帮助读者构建高效稳定的量化交易系统。

性能调优

CPU 优化

{
    "internals": {
        "process_throttle_secs": 5
    }
}
配置项说明推荐值影响
process_throttle_secs处理间隔(秒)3-10越大 CPU 越低
max_open_trades最大持仓数2-5越多消耗越大
timeframeK 线周期5m-1h越短消耗越大
pairlist交易对数量5-20越多消耗越大

启动参数优化

# 使用更快的启动参数
freqtrade trade --strategy MyStrategy \
    --db-url sqlite:///user_data/tradesv3.sqlite?check_same_thread=false

# 减少日志 I/O 开销
freqtrade trade --strategy MyStrategy --loglevel warning

多线程配置

Freqtrade 在以下场景使用多线程:

  • 数据下载:多线程下载不同交易对数据
  • API 请求:通过 CCXT 的异步接口实现并发请求
  • 指标计算:Pandas 操作自动利用多核 CPU

性能瓶颈排查

# 查看进程资源占用
top -p $(pgrep -f freqtrade)

# 查看 CPU 和内存详细信息
ps aux | grep freqtrade

# Python 性能分析
python -m cProfile -o profile.stats $(which freqtrade) trade ...

内存管理

内存使用监控

Freqtrade 的内存占用主要来自:

# 内存占用分析
1. K 线数据缓存        ~200-500 MB(10 个交易对,30 天数据)
2. DataFrame 对象      ~100-300 MB(指标计算)
3. FreqAI 模型文件     ~50-500 MB(根据模型复杂度)
4. SQLite 数据库缓存   ~50-200 MB
5. Python 运行时       ~50-100 MB

内存优化策略

{
    "dataformat_ohlcv": "json",
    "dataformat_trades": "json",
    "backtest_cache": "day",
    "max_open_trades": 3
}
优化策略操作预期效果
减少交易对白名单控制在 5-10 个减少 50% 内存
使用较短的时间范围缩小回测时间窗口减少数据载入量
选择轻量数据格式使用 json 替代 feather减少序列化内存
定期重启每日凌晨重启机器人释放内存碎片
精简指标只保留策略需要的指标减少 DataFrame 大小

内存泄漏排查

# 安装 memory_profiler
pip install memory_profiler

# 监控内存使用
python -m memory_profiler $(which freqtrade) trade ...

# 使用 tracemalloc 跟踪内存分配
python -X tracemalloc $(which freqtrade) trade ...

数据库优化

Freqtrade 默认使用 SQLite 存储交易记录和性能数据:

# 指定数据库位置
freqtrade trade --db-url sqlite:///user_data/tradesv3.sqlite

# 使用 PostgreSQL(高性能场景)
freqtrade trade --db-url postgresql://user:pass@localhost:5432/freqtrade

SQLite 优化

# 手动执行 VACUUM 回收空间
sqlite3 user_data/tradesv3.sqlite "VACUUM;"

# 重建索引
sqlite3 user_data/tradesv3.sqlite "REINDEX;"

# 查看数据库大小
ls -lh user_data/tradesv3.sqlite

# 定期清理旧数据
sqlite3 user_data/tradesv3.sqlite \
    "DELETE FROM trades WHERE close_date < date('now', '-6 months');"

数据库迁移到 PostgreSQL

# 安装 PostgreSQL 支持
pip install "freqtrade[postgres]"

# 配置 PostgreSQL 连接
export DATABASE_URL=postgresql://freqtrade:password@localhost:5432/freqtrade

# 启动时指定数据库
freqtrade trade --db-url postgresql://freqtrade:password@localhost:5432/freqtrade
数据库优势劣势适用场景
SQLite无需额外服务,配置简单并发性能弱,不支持网络访问单实例部署
PostgreSQL并发强,支持网络访问需要额外部署服务多实例/多机器人

多机器人管理

多实例运行

在同一台服务器上运行多个 Freqtrade 实例:

version: '3'
services:
  freqtrade-bot1:
    image: freqtradeorg/freqtrade:stable
    container_name: freqtrade-bot1
    volumes:
      - "./bot1_user_data:/freqtrade/user_data"
    ports:
      - "8081:8080"
    command: trade --strategy StrategyA

  freqtrade-bot2:
    image: freqtradeorg/freqtrade:stable
    container_name: freqtrade-bot2
    volumes:
      - "./bot2_user_data:/freqtrade/user_data"
    ports:
      - "8082:8080"
    command: trade --strategy StrategyB

配置文件隔离

// bot1_config.json
{
    "bot_name": "Bot-趋势跟踪",
    "max_open_trades": 3,
    "stake_amount": 50,
    "timeframe": "1h",
    "strategy": "TrendFollowingStrategy"
}

// bot2_config.json
{
    "bot_name": "Bot-高频回归",
    "max_open_trades": 2,
    "stake_amount": 30,
    "timeframe": "5m",
    "strategy": "MeanReversionStrategy"
}

多机器人设计模式

模式说明适用场景
策略分离不同机器人运行不同策略分散风险,多策略并行
资金分离不同机器人管理不同资金池风险隔离
交易对分离不同机器人交易不同币种专注特定赛道
时间周期分离不同机器人使用不同时间周期捕捉多周期机会
交易所分离不同机器人对接不同交易所套利/分散交易所风险

监控告警链

系统监控指标

# 系统资源监控
# CPU 使用率
top -bn1 | grep "Cpu(s)"

# 内存使用
free -h

# 磁盘空间
df -h user_data/

# 网络连接数
netstat -an | grep ESTABLISHED | wc -l

Freqtrade 健康检查

# 检查机器人是否运行
curl -s http://127.0.0.1:8080/api/v1/ping

# 检查 API 服务状态
curl -u username:password http://127.0.0.1:8080/api/v1/status

# 检查进程是否存活
pgrep -f "freqtrade trade"

健康检查脚本

#!/bin/bash
# health_check.sh
# 每分钟检查 Freqtrade 运行状态

API_URL="http://127.0.0.1:8080/api/v1"
API_USER="admin"
API_PASS="your_password"

# 检查 API 响应
response=$(curl -s -o /dev/null -w "%{http_code}" \
    -u "$API_USER:$API_PASS" "$API_URL/ping")

if [ "$response" != "200" ]; then
    echo "[$(date)] API 无响应,正在重启..."
    cd /opt/freqtrade && docker compose restart
    # 发送告警
    curl -s -X POST "https://api.telegram.org/bot${TOKEN}/sendMessage" \
        -d "chat_id=${CHAT_ID}" \
        -d "text=🚨 Freqtrade API 无响应,已执行重启"
fi

# 检查最近一次交易时间
latest_trade=$(sqlite3 user_data/tradesv3.sqlite \
    "SELECT MAX(close_date) FROM trades;")
echo "最近交易时间: $latest_trade"

# 检查数据更新时间
latest_data=$(ls -t user_data/data/binance/*.json | head -1)
echo "最新数据文件: $latest_data"

Prometheus + Grafana 监控

Freqtrade API 提供了 Prometheus 兼容的 metrics 端点:

# prometheus.yml
scrape_configs:
  - job_name: 'freqtrade'
    scrape_interval: 60s
    metrics_path: '/api/v1/metrics'
    basic_auth:
      username: admin
      password: your_password
    static_configs:
      - targets: ['localhost:8080']

告警规则

# alert-rules.yml
groups:
  - name: freqtrade
    rules:
      - alert: 机器人离线
        expr: up{job="freqtrade"} == 0
        for: 5m
        annotations:
          summary: "Freqtrade 机器人已离线 5 分钟"

      - alert: 最大回撤超标
        expr: freqtrade_drawdown > 15
        annotations:
          summary: "回撤超过 15%"

      - alert: 连续亏损
        expr: rate(freqtrade_loss_trades_total[1h]) > 3
        annotations:
          summary: "1 小时内连续亏损超过 3 笔"

      - alert: API 错误率过高
        expr: rate(freqtrade_api_errors_total[5m]) > 10
        annotations:
          summary: "API 错误率过高"