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_estimatorsmax_depth
  • 使用更快的模型:LightGBM 通常比 XGBoost 推理更快

过拟合检测

  • 比较训练集和测试集的准确率差异
  • 如果差异超过 10%,可能存在过拟合
  • 尝试增加 train_test_splittest_size