11. FreqAI 人工智能交易

11.FreqAI 人工智能交易

本文将详细介绍 FreqAI 人工智能交易系统的核心概念、配置方法、模型选择策略、特征工程实践以及模型训练与部署流程。通过本章内容,将能够理解如何利用 FreqAI 将机器学习技术集成到量化交易策略中,构建自适应的智能交易系统。

AI 配置基础

FreqAI 的配置主要通过 JSON 格式的配置文件和 Python 策略代码实现。一个基础的 FreqAI 配置需要包含启用开关、数据周期设置、特征参数和模型参数等核心部分。以下是一个典型的 FreqAI 配置示例:

"freqai": {
    "enabled": true,
    "purge_old_models": 2,
    "train_period_days": 30,
    "backtest_period_days": 7,
    "identifier": "unique-id",
    "feature_parameters": {
        "include_timeframes": ["5m","15m","4h"],
        "include_corr_pairlist": ["ETH/USD", "LINK/USD", "BNB/USD"],
        "label_period_candles": 24,
        "include_shifted_candles": 2,
        "indicator_periods_candles": [10, 20]
    },
    "data_split_parameters": {
        "test_size": 0.25
    }
}

这个配置中,identifier 是一个容易被忽视但非常重要的参数。它作为模型的唯一标识,相同的标识可以保持崩溃恢复能力和加速回测。当想要尝试新的特征或模型时,应该更改这个值或删除对应的模型文件夹。

在策略代码中,需要继承 FreqAI 的基础策略类并实现特定的方法。最核心的是 populate_indicators 方法,它是 FreqAI 与策略交互的入口点:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # 调用FreqAI开始处理数据和预测
    dataframe = self.freqai.start(dataframe, metadata, self)
    return dataframe

这段代码会触发 FreqAI 的数据处理流程,包括特征工程、模型训练和预测,最终返回带有预测结果的数据框。

模型选择

FreqAI 支持多种机器学习模型,每种模型都有其适用场景和特点。选择合适的模型是构建有效 AI 交易策略的关键步骤。目前 FreqAI 已集成的模型包括:

  1. LightGBM:一种高效的梯度提升框架,适用于处理高维特征和大规模数据集,训练速度快,泛化能力强
  2. XGBoost:另一种流行的梯度提升模型,以其预测准确性和正则化能力著称
  3. CatBoost:对类别特征有良好支持的梯度提升模型,减少了特征工程的工作量
  4. RandomForest:基于决策树的集成模型,可解释性强,不易过拟合
  5. SVM:支持向量机,在小样本数据集上表现良好
  6. MLPClassifier/Regressor:多层感知器,一种基础的神经网络模型
  7. CNNClassifier/Regressor:卷积神经网络,适用于处理具有空间结构的特征

选择模型时需要考虑多个因素:数据量大小、特征维度、训练速度要求以及策略的风险偏好。例如,对于高频交易策略,LightGBM 可能是更好的选择,因为它训练速度快且预测延迟低;而对于需要高度可解释性的场景,RandomForest 可能更合适。

使用特定模型的方法很简单,只需在启动命令中指定 --freqaimodel 参数:

freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.json --freqaimodel LightGBMRegressor

此外,还可以通过配置文件中的 model_training_parameters 来自定义模型的超参数:

"model_training_parameters": {
    "n_estimators": 100,
    "learning_rate": 0.05,
    "max_depth": 10
}

这些参数会直接传递给底层的机器学习库,允许根据具体需求调整模型性能。

特征工程

特征工程是决定 AI 交易策略性能的关键因素之一。FreqAI 提供了强大的特征工程工具,能够基于基础指标快速生成大规模的特征集。在 FreqAI 策略中,特征工程主要通过三个特殊的方法实现:

基础特征定义

feature_engineering_expand_all 方法用于定义需要在多个时间周期上扩展的基础指标:

def feature_engineering_expand_all(self, dataframe: DataFrame, period, metadata, **kwargs) -> DataFrame:
    # RSI指标
    dataframe["%-rsi-period"] = ta.RSI(dataframe, timeperiod=period)
    # 移动平均收敛散度
    dataframe["%-macd-period"] = ta.MACD(dataframe, fastperiod=period, slowperiod=period*2, signalperiod=period//2)[0]
    # 布林带宽度
    bollinger = qtpylib.bollinger_bands(qtpylib.typical_price(dataframe), window=period, stds=2)
    dataframe["%-bb_width-period"] = (bollinger["upper"] - bollinger["lower"]) / bollinger["mid"]
    return dataframe

所有以 % 开头的列都会被 FreqAI 识别为特征。这个方法中的指标会根据配置文件中 indicator_periods_candles 参数自动扩展到多个周期,例如配置为 [10, 20] 时,每个指标都会生成 10 周期和 20 周期两个版本。

时间特征与扩展

feature_engineering_standard 方法用于定义不需要多周期扩展的特征,如时间特征:

def feature_engineering_standard(self, dataframe: DataFrame, metadata, **kwargs) -> DataFrame:
    # 星期几特征(归一化到0-1)
    dataframe["%-day_of_week"] = (dataframe["date"].dt.dayofweek + 1) / 7
    # 小时特征(归一化到0-1)
    dataframe["%-hour_of_day"] = (dataframe["date"].dt.hour + 1) / 25
    # 价格变化率
    dataframe["%-price_change"] = dataframe["close"].pct_change()
    return dataframe

这些特征不会被自动扩展到多个周期,适合表示时间模式或其他不需要多周期比较的信息。

目标值定义

set_freqai_targets 方法用于定义模型要预测的目标值(标签),所有以 & 开头的列会被识别为目标:

def set_freqai_targets(self, dataframe: DataFrame, metadata, **kwargs) -> DataFrame:
    # 预测未来24根K线的平均收益率
    label_period = self.freqai_info["feature_parameters"]["label_period_candles"]
    dataframe["&-s_close"] = (
        dataframe["close"]
        .shift(-label_period)
        .rolling(label_period)
        .mean()
        / dataframe["close"]
        - 1
    )
    return dataframe

这里定义的目标是未来 24 根 K 线的平均收益率,模型将学习从特征预测这个值。

特征扩展配置

通过配置文件中的 feature_parameters,可以实现特征的自动扩展:

"feature_parameters": {
    "include_timeframes": ["5m","15m","4h"],
    "include_corr_pairlist": ["ETH/USD", "LINK/USD"],
    "include_shifted_candles": 2
}
  • include_timeframes:将特征扩展到指定的时间框架
  • include_corr_pairlist:包含相关交易对的特征
  • include_shifted_candles:包含过去 N 根 K 线的特征值

这些配置会使基础特征呈指数级扩展,快速构建大规模特征集。例如,10 个基础指标在 3 个时间框架、2 个相关交易对和 2 个偏移蜡烛的配置下,会生成 10×3×2×2=120 个特征。

训练与部署

FreqAI 模型的训练与部署是一个动态过程,支持回测和实盘两种模式,并且能够自适应市场变化进行持续学习。

模型训练流程

FreqAI 的训练流程可以分为以下几个步骤:

  1. 数据准备:根据配置的时间范围下载并预处理历史数据
  2. 特征生成:应用策略中定义的特征工程方法生成特征集
  3. 数据清洗:处理缺失值和异常值,确保数据质量
  4. 数据分割:将数据集分为训练集和测试集
  5. 模型训练:使用指定的算法训练模型
  6. 模型评估:在测试集上评估模型性能
  7. 模型保存:将训练好的模型保存到磁盘

这个流程会根据配置的 live_retrain_hours 参数定期执行,使模型能够适应市场变化。

回测模式

在回测模式下,FreqAI 会模拟实盘环境中的模型训练和预测过程:

freqtrade backtesting --strategy FreqaiExampleStrategy --config config_freqai.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701

回测时需要注意数据的完整性,需要下载比回测时间范围更早的数据以确保模型有足够的训练样本。一般建议下载的时间范围为回测时间加上 train_period_days 再加上最大指标周期所需的时间。

FreqAI 的回测采用滑动窗口的方式,每个窗口包含训练期和测试期:

gantt
dateFormat  YYYY-MM-DD
section 训练窗口
训练期1: 2021-05-01, 30d
测试期1: 2021-05-31, 7d
训练期2: 2021-05-08, 30d
测试期2: 2021-06-07, 7d
训练期3: 2021-05-15, 30d
测试期3: 2021-06-14, 7d

这种方式更接近实盘环境,因为每个测试期使用的模型只基于之前的历史数据训练得到。

实盘部署

实盘部署时,FreqAI 会在后台线程中定期训练模型,同时使用最新模型进行交易决策:

freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.json --freqaimodel LightGBMRegressor --dry-run

关键的实盘配置参数包括:

  • live_retrain_hours:模型重训练的时间间隔
  • expiration_hours:模型过期时间,超过此时长的模型不再用于预测
  • purge_old_models:保留的模型数量,自动清理旧模型

实盘运行时,FreqAI 会自动管理模型的生命周期,包括训练、评估、部署和清理,使交易系统能够持续适应市场变化。

性能监控

FreqAI 集成了 TensorBoard 用于模型性能监控。启用后,可以通过浏览器查看训练过程中的指标变化:

tensorboard --logdir user_data/models/unique-id

TensorBoard 提供了损失函数曲线、特征重要性、模型结构图等可视化工具,帮助分析和优化模型性能。

策略集成

将 FreqAI 预测结果集成到交易策略中需要在 populate_entry_trend 和 populate_exit_trend 方法中使用模型输出:

def populate_entry_trend(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    # 当预测收益率为正且置信度高时买入
    dataframe.loc[
        (
            (dataframe["do_predict"] == 1) &  # 预测有效
            (dataframe["&-s_close"] > dataframe["target_roi"]) &  # 预测收益率高于目标
            (dataframe["volume"] > 0)  # 有成交量
        ),
        "enter_long"
    ] = 1
    return dataframe

这里 do_predict 字段表示预测是否有效,&-s_close 是模型预测的未来收益率。通过结合这些预测结果和其他市场条件,可以构建强大的交易策略。

为了使策略更加稳健,通常会使用动态阈值,结合预测值的均值和标准差:

def populate_indicators(self, dataframe: DataFrame, metadata: dict) -> DataFrame:
    dataframe = self.freqai.start(dataframe, metadata, self)
    # 计算动态目标阈值(1.25个标准差)
    dataframe["target_roi"] = dataframe["&-s_close_mean"] + dataframe["&-s_close_std"] * 1.25
    dataframe["sell_roi"] = dataframe["&-s_close_mean"] - dataframe["&-s_close_std"] * 1.25
    return dataframe

这种方法可以根据市场波动性自动调整交易阈值,在不同的市场环境下保持策略的适应性。

常见问题与解决方案

过拟合问题

过拟合是机器学习中的常见问题,表现为模型在训练数据上表现良好但在新数据上表现不佳。解决方法包括:

  1. 增加正则化:通过 model_training_parameters 添加正则化参数
  2. 特征选择:减少特征数量或使用 PCA 降维
  3. 增加数据量:延长训练周期或增加交易对
  4. 早停法:监控验证集性能,及时停止训练

特征共线性

当特征之间高度相关时,会影响模型的稳定性和可解释性。可以通过以下方法解决:

  1. 相关性分析:计算特征间的相关系数,移除高度相关的特征
  2. 主成分分析:在配置中启用 PCA 降维
"feature_parameters": {
    "principal_component_analysis": true,
    "pca_components": 0.95
}
  1. 特征重要性评估:使用模型的特征重要性评分选择关键特征

模型漂移

市场状态变化可能导致模型性能下降,称为模型漂移。FreqAI 提供了多种机制应对:

  1. 定期重训练:通过 live_retrain_hours 设置自动重训练频率
  2. 模型过期:expiration_hours 确保不使用过时模型
  3. 持续学习:启用 continual_learning 参数,让新模型基于旧模型继续训练
"freqai": {
    "continual_learning": true
}

高级应用

多模型组合

可以通过组合多个不同类型的模型来提高预测稳定性:

# 在策略中定义多个模型
freqaimodels = ["LightGBMRegressor", "XGBoostRegressor", "CatBoostRegressor"]

# 综合多个模型的预测结果
dataframe["ensemble_prediction"] = dataframe[[f"&-s_close_{m}" for m in freqaimodels]].mean(axis=1)

这种集成方法可以降低单一模型的风险,提高预测的稳健性。

特征重要性分析

FreqAI 可以输出特征重要性评分,帮助优化特征集:

# 在策略中获取特征重要性
feature_importance = self.freqai.get_feature_importance()
# 打印前10个最重要的特征
for feature, importance in sorted(feature_importance.items(), key=lambda x: x[1], reverse=True)[:10]:
    logger.info(f"Feature importance: {feature}: {importance}")

通过分析特征重要性,可以移除无用特征,简化模型并提高训练效率。

自定义模型开发

FreqAI 支持集成自定义模型,只需继承 IFreqaiModel 接口并实现必要的方法:

class CustomModel(IFreqaiModel):
    def train(self, unfiltered_df: DataFrame, pair: str, timeframe: str, metadata: dict)
        # 自定义训练逻辑
        ...
    def predict(self, dataframe: DataFrame, pair: str, timeframe: str)
        # 自定义预测逻辑
        ...

这种灵活性能够尝试最前沿的机器学习算法,打造独特的交易策略。

FreqAI 为量化交易打开了机器学习的大门,使普通交易者也能利用先进的 AI 技术构建智能交易系统。通过合理配置、精心设计特征和选择合适的模型,可以开发出适应市场变化的稳健策略。记住,AI 不是魔法,它需要结合扎实的交易知识和持续的优化才能发挥最大潜力。在实际应用中,建议从简单模型开始,逐步迭代优化,同时密切监控模型性能,确保策略在实盘环境中的可靠性和稳定性。