生产环境优化
本章详细介绍 Freqtrade 在生产环境中的优化策略,涵盖性能调优、内存管理、数据库优化、多机器人管理以及监控告警体系搭建,帮助读者构建高效稳定的量化交易系统。
性能调优
CPU 优化
{
"internals": {
"process_throttle_secs": 5
}
}
| 配置项 | 说明 | 推荐值 | 影响 |
|---|---|---|---|
process_throttle_secs | 处理间隔(秒) | 3-10 | 越大 CPU 越低 |
max_open_trades | 最大持仓数 | 2-5 | 越多消耗越大 |
timeframe | K 线周期 | 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 错误率过高"