Freqtrade 第14章:FreqAI 简介与快速入门

FreqAI 是 Freqtrade 内置的机器学习框架,旨在通过数据驱动的自适应模型来优化交易策略。本章介绍 FreqAI 的核心概念、与传统策略的区别以及快速上手指南。

FreqAI 概述

自适应性重新训练

FreqAI 的核心能力是周期性重新训练模型。与传统策略使用固定的技术指标(如 RSI、MACD)不同,FreqAI 会每隔一定数量的新数据点自动重新训练模型,使模型始终适应最新的市场状况。

  • 训练频率:通过 train_period_days 参数控制每次训练使用的历史数据天数
  • 重新训练间隔:通过 backtest_period_dayslive_retrain_hours 控制重新训练周期
  • 遗忘机制:模型会自动"遗忘"过旧的数据,避免历史模式干扰当前决策

快速特征工程

FreqAI 提供了强大的特征工程管道,用户只需定义基础特征,框架会自动完成特征生成、标准化、降维等操作。

  • 特征生成:支持自定义特征函数,框架自动计算技术指标
  • 特征标准化:内置 Z-score、MinMax 等标准化方法
  • 特征降维:支持 PCA 等降维技术

与传统策略的区别

特性传统策略FreqAI 策略
决策依据固定规则(如 RSI < 30 买入)机器学习模型预测
市场适应性需要手动调整参数自动重新训练适应市场变化
特征数量通常 5-15 个指标可扩展到数百个特征
开发复杂度中高(需理解 ML 基础)
历史回测确定性强需要考虑训练/推理分离

安装与配置

环境要求

FreqAI 需要额外安装机器学习依赖。建议使用 Docker 或 Conda 环境。

# 通过 pip 安装 FreqAI 依赖
pip install "freqtrade[freqai]"

# 或使用 Docker(推荐)
docker pull freqtradeorg/freqtrade:stable_freqai

配置文件结构

FreqAI 的配置在 config.json 的 freqai 字段中:

{
    "freqai": {
        "enabled": true,
        "train_period_days": 30,
        "backtest_period_days": 7,
        "live_retrain_hours": 4,
        "identifier": "quick_start_model",
        "feature_parameters": {
            "shift": 2,
            "include_corr_pairlist": false,
            "DI_threshold": 0.9,
            "weight_factor": 0.9,
            "principal_component_analysis": false
        },
        "data_split_parameters": {
            "test_size": 0.25,
            "shuffle": false
        },
        "model_training_parameters": {
            "n_estimators": 100,
            "learning_rate": 0.02,
            "max_depth": 6
        }
    }
}

核心术语解析

Features(特征)

特征是模型用于预测的输入变量。FreqAI 会自动从 OHLCV 数据和自定义指标中提取特征。

Labels(标签)

标签是模型要预测的目标变量。常见的标签定义方式包括:

  • 未来价格变化:预测 n 个周期后的价格涨跌
  • 分类标签:将收益分为"涨/跌/持平"三类
  • 回归目标:直接预测未来价格的百分比变化

Training(训练)

训练阶段使用历史数据拟合模型。FreqAI 支持多种模型后端:

模型库适用场景训练速度准确性
LightGBM通用分类/回归
XGBoost高精度需求很高
CatBoost类别特征较多
PyTorch深度学习/序列模型视数据量而定

Inferencing(推理)

推理阶段使用训练好的模型对最新数据进行预测。推理通常在每根新 K 线到达时触发。

# 策略中获取模型预测结果
dataframe["prediction"] = dataframe["&prediction"]
dataframe["prediction_probability"] = dataframe["&prediction_probability"]

# 使用预测值做交易决策
dataframe["enter_long"] = dataframe["prediction"] > 0.5

快速上手示例

第一步:创建 FreqAI 策略

from freqtrade.strategy import IStrategy
from pandas import DataFrame

class QuickStartFreqAIStrategy(IStrategy):
    timeframe = "5m"
    can_short = True

    def feature_engineering_expand_basic(self, dataframe: DataFrame, **kwargs) -> DataFrame:
        # 基础特征:技术指标
        dataframe["%-rsi"] = ta.RSI(dataframe, timeperiod=14)
        dataframe["%-mfi"] = ta.MFI(dataframe, timeperiod=14)
        dataframe["%-adx"] = ta.ADX(dataframe, timeperiod=14)
        dataframe["%-sma-10"] = ta.SMA(dataframe, timeperiod=10)
        dataframe["%-sma-50"] = ta.SMA(dataframe, timeperiod=50)
        return dataframe

    def feature_engineering_expand_all(self, dataframe: DataFrame, **kwargs) -> DataFrame:
        # 扩展特征:多周期指标
        dataframe["%-bb_upper"] = ta.BBANDS(dataframe, timeperiod=20)["bbupper"]
        dataframe["%-bb_lower"] = ta.BBANDS(dataframe, timeperiod=20)["bblower"]
        return dataframe

    def set_freqai_targets(self, dataframe: DataFrame, **kwargs) -> DataFrame:
        # 定义标签:未来 2 个周期的收益
        dataframe["&-label"] = dataframe["close"].pct_change(2).shift(-2)
        dataframe["&-label"] = (dataframe["&-label"] > 0).astype(int)
        return dataframe

    def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe = self.freqai.start(dataframe, metadata, self)
        return dataframe

    def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["&prediction"] == 1) &
            (dataframe["&prediction_probability"] > 0.6),
            "enter_long"
        ] = 1
        return dataframe

    def populate_exit_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
        dataframe.loc[
            (dataframe["&prediction"] == 0),
            "exit_long"
        ] = 1
        return dataframe

第二步:运行回测

freqtrade backtesting --strategy QuickStartFreqAIStrategy --freqaimodel LightGBMRegressor

第三步:实盘运行

freqtrade trade --strategy QuickStartFreqAIStrategy --freqaimodel LightGBMRegressor

参数表说明

核心参数速查

参数名类型默认值说明
train_period_daysint30每次训练使用的历史数据天数
backtest_period_daysint7回测中每次重新训练间隔天数
live_retrain_hoursint0实盘重新训练间隔小时(0 表示每轮新数据都训练)
identifierstring必填模型标识符,用于保存/加载模型文件
DI_thresholdfloat0.9特征降维阈值
principal_component_analysisboolfalse是否启用 PCA 降维

常见问题

  • 训练时间过长:减少 train_period_days 或降低 n_estimators
  • 过拟合:增加 train_test_splittest_size,减少特征数量
  • 模型加载失败:检查 identifier 是否一致,模型文件是否完整