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 已集成的模型包括:
- LightGBM:一种高效的梯度提升框架,适用于处理高维特征和大规模数据集,训练速度快,泛化能力强
- XGBoost:另一种流行的梯度提升模型,以其预测准确性和正则化能力著称
- CatBoost:对类别特征有良好支持的梯度提升模型,减少了特征工程的工作量
- RandomForest:基于决策树的集成模型,可解释性强,不易过拟合
- SVM:支持向量机,在小样本数据集上表现良好
- MLPClassifier/Regressor:多层感知器,一种基础的神经网络模型
- 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 的训练流程可以分为以下几个步骤:
- 数据准备:根据配置的时间范围下载并预处理历史数据
- 特征生成:应用策略中定义的特征工程方法生成特征集
- 数据清洗:处理缺失值和异常值,确保数据质量
- 数据分割:将数据集分为训练集和测试集
- 模型训练:使用指定的算法训练模型
- 模型评估:在测试集上评估模型性能
- 模型保存:将训练好的模型保存到磁盘
这个流程会根据配置的 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
这种方法可以根据市场波动性自动调整交易阈值,在不同的市场环境下保持策略的适应性。
常见问题与解决方案
过拟合问题
过拟合是机器学习中的常见问题,表现为模型在训练数据上表现良好但在新数据上表现不佳。解决方法包括:
- 增加正则化:通过
model_training_parameters添加正则化参数 - 特征选择:减少特征数量或使用 PCA 降维
- 增加数据量:延长训练周期或增加交易对
- 早停法:监控验证集性能,及时停止训练
特征共线性
当特征之间高度相关时,会影响模型的稳定性和可解释性。可以通过以下方法解决:
- 相关性分析:计算特征间的相关系数,移除高度相关的特征
- 主成分分析:在配置中启用 PCA 降维
"feature_parameters": {
"principal_component_analysis": true,
"pca_components": 0.95
}
- 特征重要性评估:使用模型的特征重要性评分选择关键特征
模型漂移
市场状态变化可能导致模型性能下降,称为模型漂移。FreqAI 提供了多种机制应对:
- 定期重训练:通过
live_retrain_hours设置自动重训练频率 - 模型过期:
expiration_hours确保不使用过时模型 - 持续学习:启用
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 不是魔法,它需要结合扎实的交易知识和持续的优化才能发挥最大潜力。在实际应用中,建议从简单模型开始,逐步迭代优化,同时密切监控模型性能,确保策略在实盘环境中的可靠性和稳定性。