Freqtrade 第16章:FreqAI 强化学习与部署
本章深入介绍 FreqAI 的强化学习功能以及将模型从回测部署到实盘的全流程,涵盖模型持久化、崩溃恢复、生产者/消费者模式等关键主题。
强化学习配置
强化学习概述
FreqAI 支持基于强化学习(Reinforcement Learning, RL)的交易策略。与监督学习预测价格不同,RL 通过智能体与环境交互来学习最优交易决策,目标是最大化累积收益。
配置强化学习模型
{
"freqai": {
"enabled": true,
"rl_config": {
"train_epochs": 50,
"max_trade_duration": 20,
"max_trades_per_epoch": 1000,
"model_type": "PPO",
"policy_type": "MlpPolicy",
"continuous_actions": false
},
"model_training_parameters": {
"learning_rate": 0.0003,
"gamma": 0.99,
"batch_size": 64
}
}
}
支持的 RL 算法
| 算法 | 特点 | 适用场景 |
|---|---|---|
| PPO | 稳定、易于调参 | 通用交易场景(推荐) |
| DQN | 离散动作空间 | 简单的买卖决策 |
| A2C | 异步训练效率高 | 多交易对同时训练 |
RL 策略示例
from freqtrade.strategy import IStrategy
from pandas import DataFrame
class RLStrategy(IStrategy):
timeframe = "15m"
can_short = True
def feature_engineering_expand_basic(self, dataframe: DataFrame, **kwargs) -> DataFrame:
# RL 特征需要包含状态信息
dataframe["%-rsi"] = ta.RSI(dataframe, timeperiod=14)
dataframe["%-adx"] = ta.ADX(dataframe, timeperiod=14)
dataframe["%-close"] = dataframe["close"].pct_change(5)
dataframe["%-volume"] = dataframe["volume"].pct_change(5)
return dataframe
def set_freqai_targets(self, dataframe: DataFrame, **kwargs) -> DataFrame:
# RL 不需要显示设置标签,框架自动处理
return dataframe
def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
dataframe = self.freqai.start(dataframe, metadata, self)
# RL 动作输出
dataframe["enter_long"] = dataframe["&actions"].apply(
lambda x: 1 if x == 0 else 0
)
dataframe["enter_short"] = dataframe["&actions"].apply(
lambda x: 1 if x == 1 else 0
)
dataframe["exit_long"] = dataframe["&actions"].apply(
lambda x: 1 if x == 2 else 0
)
return dataframe
回测模拟
回测 RL 策略
freqtrade backtesting --strategy RLStrategy --freqaimodel ReinforcementLearning
回测注意事项
- RL 回测使用
backtest_period_days控制训练间隔 - 回测过程中,智能体在每个决策点根据当前状态选择动作
- 回测结果可能因随机种子不同而有差异,建议多次回测取平均
# 在策略中控制 RL 回测行为
class RLStrategy(IStrategy):
# 限制每笔交易的最长持仓时间
max_trade_duration = 20 # 20 根 K 线
# 最小收益要求
minimal_roi = {
"0": 0.01,
"10": 0.005,
"20": 0
}
实盘部署
启动实盘交易
freqtrade trade --strategy RLStrategy --freqaimodel ReinforcementLearning
热加载模型
FreqAI 在实盘中支持热加载重新训练的模型:
{
"freqai": {
"live_retrain_hours": 6,
"save_backtest_models": true
}
}
live_retrain_hours:实盘中每隔多少小时重新训练一次模型save_backtest_models:回测后保存模型文件,可直接用于实盘
模型持久化与崩溃恢复
模型文件结构
FreqAI 将模型保存到 user_data/models/ 目录:
user_data/models/
├── my_model/
│ ├── model.lgbm # 模型文件
│ ├── metadata.json # 元数据(特征列表、参数等)
│ ├── scaler.pkl # 标准化器
│ ├── pca.pkl # PCA 转换器
│ └── dictionary_data.pkl # 数据字典
崩溃恢复策略
{
"freqai": {
"identifier": "resilient_model",
"save_backtest_models": true,
"purge_old_models": false,
"model_training_parameters": {
"max_retries": 3,
"fallback_to_last_model": true
}
}
}
save_backtest_models:回测结果模型可直接用于实盘purge_old_models:设为 false 保留历史模型作为备份fallback_to_last_model:训练失败时自动回退到上一个有效模型
手动恢复
# 查看可用模型
ls user_data/models/
# 删除损坏模型后重新训练
rm -rf user_data/models/corrupted_model/
freqtrade trade --strategy MyStrategy --freqaimodel LightGBMRegressor
生产者/消费者模式
模式概述
生产者/消费者(Producer/Consumer)模式允许多个 Freqtrade 实例共享一个训练好的模型:
- 生产者(Producer):运行一个实例负责训练模型
- 消费者(Consumer):多个实例只进行推理,不参与训练
配置生产者
{
"freqai": {
"enabled": true,
"identifier": "shared_model",
"producer": true,
"consumer": false,
"live_retrain_hours": 4,
"model_training_parameters": {
"n_estimators": 100
}
}
}
配置消费者
{
"freqai": {
"enabled": true,
"identifier": "shared_model",
"producer": false,
"consumer": true,
"model_training_parameters": {
"n_estimators": 100
}
}
}
消费者的优势
| 特性 | 独立模式 | 消费者模式 |
|---|---|---|
| 训练开销 | 每个实例独立训练 | 共享训练结果 |
| 资源消耗 | CPU/内存占用高 | 仅推理,资源占用低 |
| 模型一致性 | 每个实例可能不同 | 所有实例使用相同模型 |
| 部署数量 | 受限于硬件资源 | 可大量部署 |
常见陷阱排查
训练失败
# 日志中常见的错误
# 1. 特征包含 NaN 值
# 解决方案:在特征工程中填充 NaN
dataframe = dataframe.ffill().bfill().fillna(0)
# 2. 标签分布严重不平衡
# 解决方案:调整标签定义或使用分层采样
"stratify_training_data": true
# 3. 训练数据不足
# 解决方案:增加 train_period_days
"train_period_days": 90
推理延迟过高
- 减少特征数量:降低
shift值或禁用include_corr_pairlist - 简化模型:降低
n_estimators或max_depth - 使用更快的模型:LightGBM 通常比 XGBoost 推理更快
过拟合检测
- 比较训练集和测试集的准确率差异
- 如果差异超过 10%,可能存在过拟合
- 尝试增加
train_test_split的test_size