Freqtrade 第14章:FreqAI 简介与快速入门
FreqAI 是 Freqtrade 内置的机器学习框架,旨在通过数据驱动的自适应模型来优化交易策略。本章介绍 FreqAI 的核心概念、与传统策略的区别以及快速上手指南。
FreqAI 概述
自适应性重新训练
FreqAI 的核心能力是周期性重新训练模型。与传统策略使用固定的技术指标(如 RSI、MACD)不同,FreqAI 会每隔一定数量的新数据点自动重新训练模型,使模型始终适应最新的市场状况。
- 训练频率:通过
train_period_days参数控制每次训练使用的历史数据天数 - 重新训练间隔:通过
backtest_period_days或live_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_days | int | 30 | 每次训练使用的历史数据天数 |
backtest_period_days | int | 7 | 回测中每次重新训练间隔天数 |
live_retrain_hours | int | 0 | 实盘重新训练间隔小时(0 表示每轮新数据都训练) |
identifier | string | 必填 | 模型标识符,用于保存/加载模型文件 |
DI_threshold | float | 0.9 | 特征降维阈值 |
principal_component_analysis | bool | false | 是否启用 PCA 降维 |
常见问题
- 训练时间过长:减少
train_period_days或降低n_estimators - 过拟合:增加
train_test_split的test_size,减少特征数量 - 模型加载失败:检查
identifier是否一致,模型文件是否完整