
如何创建自定义 FreqAI 预测模型类并用 --freqaimodel 加载【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade当你已经搭好了 FreqAI 策略但内置的 LightGBM、XGBoost 或 PyTorch 模型无法满足自定义训练流程比如想换损失处理方式、加自己的数据清洗逻辑时需要自己写一个预测模型类并通过--freqaimodel参数让 freqtrade 加载它。FreqAI 的架构把模型逻辑集中在IFreqaiModel基类中内置模型位于freqtrade/freqai/prediction_models/都继承自它自定义模型也是同样的机制freqtrade 会根据--freqaimodel提供的类名从user_data/freqaimodels/目录中查找并加载对应的类。1. 准备条件FreqAI 依赖、配置与策略自定义模型不会绕过 FreqAI 的常规运行要求先确认三件事依赖。FreqAI 依赖不在默认安装中安装流程会询问是否安装 FreqAI 依赖如果当时没有选 yes可以手动执行见 docs/freqai.mdpip install -r requirements-freqai.txt配置文件。FreqAI 通过标准 freqtrade 配置文件的freqai段启用最小必需参数如下参数值仅为文档示例完整示例在 config_examples/config_freqai.example.jsonfreqai: { 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容易被新手忽略它是标识一次运行的唯一 ID数据会保存在user_data/models/identifier/下。保持同一identifier可以保留崩溃恢复能力和更快的回测换用新模型、新特征等开启新实验时应更换identifier或删除对应的user_data/models/unique-id目录。策略。策略必须是 FreqAI 策略在populate_indicators()中调用self.freqai.start(dataframe, metadata, self)该方法不能在此之外调用在feature_engineering_*()中定义%前缀的特征并在set_freqai_targets()中定义前缀的标签。可直接从仓库示例 freqtrade/templates/FreqaiExampleStrategy.py 起步注意该示例策略文档明确说明仅用于展示/测试不建议直接用于生产。2. 创建自定义模型类自定义模型文件放在user_data/freqaimodels/目录下--freqaimodel传入的名字必须与类名一致。文档同时提醒使用唯一的名字避免覆盖内置模型。IFreqaiModel声明了三个抽象方法train、fit、predict。最省事的路线是继承已实现train()与predict()的BaseRegressionModel只实现fit()——该基类的文档字符串要求用户继承它并设置fit()并指明可参考prediction_models/下的示例脚本。以下示例基于仓库中 freqtrade/freqai/prediction_models/LightGBMRegressor.py 改写仅保留核心训练逻辑原文件中还包含eval_set构造与 Tensorboard 回调LightGBMCallback的处理from typing import Any from lightgbm import LGBMRegressor from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel from freqtrade.freqai.data_kitchen import FreqaiDataKitchen class MyLGBMRegressor(BaseRegressionModel): 自定义 FreqAI 回归模型只实现 fit()train()/predict() 由基类提供。 def fit(self, data_dictionary: dict, dk: FreqaiDataKitchen, **kwargs) - Any: User sets up the training and test data to fit their desired model here :param data_dictionary: the dictionary holding all data for train, test, labels, weights :param dk: The datakitchen object for the current coin/model X data_dictionary[train_features] y data_dictionary[train_labels] train_weights data_dictionary[train_weights] init_model self.get_init_model(dk.pair) model LGBMRegressor(**self.model_training_parameters) model.fit( XX, yy, sample_weighttrain_weights, init_modelinit_model, ) return model要点说明返回值就是训练产物模型对象或 trainerFreqAI 会用它做推理并按 freqtrade/freqai/base_models/BaseRegressionModel.py 中predict()的约定调用其.predict()方法所以返回的对象必须支持这一调用。self.model_training_parameters来自配置文件中freqai段下的model_training_parameters用于传入模型超参self.get_init_model(dk.pair)用于增量训练时加载已有模型。基类train()会先经过FreqaiDataKitchen完成特征过滤、NaN 处理、train/test 切分与特征流水线PCA/SVM/DI 等由配置控制然后才调用你的fit()所以fit()拿到的data_dictionary中train_features、train_labels、test_features、test_weights等键已经准备好了。分类任务则继承BaseClassifierModel见 freqtrade/freqai/base_models/BaseClassifierModel.py注意文档对分类目标的额外要求类别必须用字符串设置例如up/down并且需要在策略的set_freqai_targets()中通过self.freqai.class_names声明类别名例如def set_freqai_targets(self, dataframe: DataFrame, metadata: dict, **kwargs) - DataFrame: self.freqai.class_names [down, up] dataframe[s-up_or_down] np.where(dataframe[close].shift(-100) dataframe[close], up, down) return dataframe3. 用 --freqaimodel 加载加载逻辑由 freqtrade/resolvers/freqaimodel_resolver.py 中的FreqaiModelResolver实现内置模型从freqtrade/freqai/prediction_models/查找用户模型从user_data/freqaimodels/查找--freqaimodel NAME指定类名--freqaimodel-path PATH可追加额外的查找路径。backtesting、trade、hyperopt 等命令都接受这两个参数见 docs/commands/trade.md、docs/commands/backtesting.md。把类名MyLGBMRegressor放入user_data/freqaimodels/MyLGBMRegressor.py后回测命令形如config 与策略沿用文档示例路径--freqaimodel的值替换为你的类名freqtrade backtesting --config config_examples/config_freqai.example.json \ --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates \ --freqaimodel MyLGBMRegressor正式跑交易时同样在freqtrade trade命令上追加--freqaimodel MyLGBMRegressor文档给出的完整示例即freqtrade trade ... --freqaimodel PyTorchMLPRegressor --strategy-path freqtrade/templates的形式。4. 验证模型可用第一步确认类能被发现。freqtrade 提供list-freqaimodels子命令打印所有可用的 FreqAI 模型见 docs/commands/main.mdfreqtrade list-freqaimodels输出中应同时出现内置模型如LightGBMRegressor和你新增的MyLGBMRegressor。如果新类没出现检查文件是否在user_data/freqaimodels/下、类名与文件名/--freqaimodel值是否一致。第二步观察加载与训练日志。resolver 的行为在源码中有明确报错可据此判断失败位置未传--freqaimodel时抛出OperationalExceptionNo freqaimodel set. Please use --freqaimodel to specify the FreqaiModel class to use.传入基类名BaseRegressionModel时抛出BaseRegressionModel is a baseclass and cannot be used directly. Please choose an existing child class or inherit from this baseclass.训练开始后BaseRegressionModel.train()会输出pair 为交易对-------------------- Starting training BTC/USDT -------------------- -------------------- Training on data from 2022-08-01 to 2022-08-31 --------------------以及结尾的Done training pair (耗时 secs)可作为训练完成的判断依据以上为源码日志格式示例日期与时长随数据不同。5. 限制与注意--freqaimodel的名字必须与类名完全对应且自定义类名要与内置模型错开否则会覆盖内置模型。回归模型必须配连续值目标如df[s-close_price] df[close].shift(-100)分类模型必须配字符串类别目标两者不能混用见 docs/freqai-configuration.md 的 Setting model targets 一节。换用新的自定义模型实验时建议同步更换配置中的identifier旧identifier下的历史模型与预测数据不会自动迁移。如果自定义的是 PyTorch 神经网络模型路线不同在自定义IFreqaiModel文件中定义nn.Module继承BasePyTorchClassifier/BasePyTorchRegressor等并使用PyTorchModelTrainer且 PyTorch 依赖torch等需在./setup.sh -i时回答 yes 安装Docker 用户需使用带_freqaitorch后缀的镜像这是文档明确给出的可选分支非 PyTorch 方案不需要。从磁盘加载模型文件存在安全边界只加载自己训练的模型不要加载来自不可信来源的远程模型文件。完成以上步骤后你的自定义模型就和内置模型一样参与 FreqAI 的训练、预测与user_data/models/下的持久化流程后续调特征工程、数据拆分等参数参考 docs/freqai-configuration.md 与 docs/freqai-developers.md。【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考