FreqAI 运行实战指南:实盘/回测/超参调优的模型训练与部署全流程
2026/9/8 16:29:54 网站建设 项目流程

FreqAI 运行实战指南:实盘/回测/超参调优的模型训练与部署全流程

【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade

本篇技术指南围绕 freqtrade 开源交易机器人内置的自适应机器学习模块FreqAI展开,系统讲解在 dry/live(模拟/实盘)与 backtesting(回测)两种模式下,如何启动周期性重训练的模型、如何通过identifier复用与清理模型、如何配置live_retrain_hours/expiration_hours控制重训与过期策略,以及如何使用 Continual Learning、Hyperopt 与 Tensorboard 提升调优效率。读完本文,你将掌握基于 docs/freqai-running.md 的全部实操命令与配置参数,并理解它们背后在 freqtrade/freqai 源码中的实现逻辑。

两种运行模式的总体工作方式

FreqAI 的训练与部署方式分为两种:实盘部署(Live deployments)历史回测(Backtesting)。无论哪种模式,FreqAI 都会周期性地对模型进行重新训练,从而让模型持续适应不断变化的市场状态,整体流程如下:

从该流程可以看到,FreqAI 的本质是一个"边训练边推理"的滚动系统:模型总在最新一段历史数据上被重训,随后立即用于对后续到达的 K 线进行预测。关于两种模式的差异,一句话可以概括:实盘模式由 FreqAI 自动完成数据下载与重训调度;回测模式则需要你先手动下载足够的历史数据,再按固定周期"模拟重训"。

实盘部署(Dry/Live)

启动命令与首个模型的训练

使用如下命令即可启动一次 dry/live 运行(dry_run: true即为模拟盘):

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

FreqAI 启动后会立即基于配置开始训练一个全新模型(新的identifier),训练完成后即用该模型对后续到达的 K 线进行预测,直到新模型可用为止。典型情况下新模型会"尽可能频繁地"生成,因为 FreqAI 内部维护了一个交易对训练队列(见源码 freqai_interface.py 中的train_queue),会尽量让队列里的所有币对模型保持同样的新旧程度。

推理时,FreqAI 始终使用最近训练完成的模型对实时数据进行预测。源码 data_kitchen.py 中的check_if_new_training_required()实现了这一调度逻辑:以小时为单位计算距离上次训练的时间,超过live_retrain_hours即触发重训。

控制重训频率:live_retrain_hours 与过期控制

如果你不希望 FreqAI 无节制地频繁重训,可在freqai配置中设置:

参数作用默认值
live_retrain_hours距离上次训练结束至少等待的小时数,避免过频重训0(尽可能频繁重训)
expiration_hours模型超过该小时数即视为过期,FreqAI 将避免用其产生新预测0(模型永不过期)

它们的实现分别对应源码 data_kitchen.py 的check_if_model_expired()expiration_hours)与 data_kitchen.py 的check_if_new_training_required()live_retrain_hours),二者均以模型的时间戳与当前时间差除以 3600 秒换算为小时后再比较。

从已保存的模型续跑(崩溃恢复与复用)

训练好的模型默认会保存到磁盘,便于回测复用或崩溃后恢复。若要从回测模型(或之前崩溃的 dry/live 会话)直接启动,只需在配置中指定相同identifier

"freqai": { "identifier": "example", "live_retrain_hours": 0.5 }

此时 FreqAI 虽然以预训练模型起步,但仍会检查该模型训练完成至今经过的时间;若距模型训练结束已满一个live_retrain_hours,它依然会启动新一轮训练。换言之,identifier决定"模型从哪来",而live_retrain_hours决定"何时必须更新"。模型文件的落盘路径为user_data/models/<identifier>,由 freqai_interface.py 的set_full_path()创建并指定。

自动数据下载

dry/live 模式下,FreqAI 会根据train_period_daysstartup_candle_count(参数含义详见 docs/freqai-parameter-table.md)自动判断并下载足量数据,确保训练窗口内没有 NaN 数据点。从源码 data_kitchen.py 可以看到,它还会以startup_candle_count * 2作为安全系数、乘以include_timeframes中的最大时间周期,在训练起始点之前额外多拉取一段数据用于指标计算。

保存预测数据

某个identifier生命周期内产生的全部预测都会被存入historic_predictions.pkl,用于在崩溃后或修改配置后重新加载。这一机制对应源码 freqai_interface.py 的set_initial_historic_predictions():当磁盘上不存在历史预测时,它会先以首轮训练数据构建结构并置空统计量;之后每次推理产生的新预测会持续追加到该集合。基于这些历史预测,FreqAI 还能在策略中提供&*_mean/&*_std等实时统计特征,用于评估预测的稀有程度。

清理旧模型:purge_old_models

FreqAI 每次成功训练都会在磁盘写入新模型文件,随着市场变化这些旧文件会逐渐过期。若计划长时间高频重训,建议在配置中开启清理:

"freqai": { "purge_old_models": 4 }

其含义是:磁盘上每个币对只保留最近训练的 4 个模型,更早的一律自动删除以节省磁盘空间;设为0则永不清理。该参数默认值为2,也兼容布尔写法(true等价于 2)。清理逻辑位于源码 data_drawer.py 的purge_old_models():它按sub-train-<COIN>_<10位时间戳>目录命名模式(data_kitchen.pyset_new_model_names())正则匹配每个币对的子训练目录,按时间戳排序后仅保留最新的num_keep个。注意回测场景下默认不执行此清理(见参数表说明)。每次训练完成后,freqai_interface.py 都会调用该清理方法。

回测(Backtesting)

启动回测命令

FreqAI 的回测模块可用如下命令执行:

freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701

若该配置文件此前从未执行过,FreqAI 会在扩展后的--timerange内,为每个币对、每个回测窗口分别训练一个新模型

与 dry/live 不同,回测模式要求你在部署前先手动下载足够的数据(详见下节"数据下载"),因为 FreqAI 需要回测起始时间点之前的数据来训练出能在首根 K 线上做预测的模型。

模型复用与 identifier 语义

  • 首次训练完成后,再次用相同配置文件执行回测时,FreqAI 会直接发现并加载已训练的模型,省去重复训练时间。若只想调整(甚至 hyperopt)策略内部的买卖条件,这种复用非常高效。
  • 若你希望用相同配置重新训练新模型,只需更换identifier
  • 想回到任意一个历史模型,也只需把配置中的identifier指回它对应的名字。

关于"无前视偏差"还有一个重要约束:回测会对每个回测窗口调用一次set_freqai_targets()(窗口数 = 完整回测时间范围 ÷backtest_period_days),从而保证 targets 的构造模拟 dry/live 行为、不引入前视偏差;但feature_engineering_*()中的特征定义是在整个训练时间范围上一次性完成的,因此你必须自行确认特征不会"看到未来"。前视偏差的更多讨论见 docs/strategy-customization.md#common-mistakes-when-developing-strategies,也可借助项目提供的 lookahead-analysis 与 recursive-analysis 工具辅助检测。

保存回测预测数据(面向高层级超参优化)

为了允许你反复调整策略(注意:不是特征),FreqAI 在回测时会自动保存预测数据,供后续使用同一identifier的回测与实盘直接复用——这为针对入场/离场条件的 hyperopt提供了性能支撑。

具体而言,在unique-id(即 identifier)文件夹下会额外生成一个backtesting_predictions目录,其中以feather格式存放全部预测。两条重要规则:

  • 想修改特征(features),必须更换新的identifier,以通知 FreqAI 重新训练模型;
  • 想把某次回测产生的模型保存下来、日后从其中一个直接启动实盘(省去重新训练),则需在配置中把save_backtest_models设为True。该参数在参数表中默认值为False,即回测默认只保存轻量元数据而非完整模型(对应源码 data_drawer.py 的save_metadata()路径)。

另有两点使用约束需要特别注意:

  1. 模型可复用性校验:为保证模型能被复用,FreqAI 会用长度为 1 的 dataframe调用你的策略。若你的策略需要多于 1 根 K 线的数据才能生成相同特征,那么回测预测将无法复用于实盘,你必须为每次新回测更新identifier
  2. 安全警告:从磁盘加载已保存模型可能带来安全隐患——加载过程必须使用weights_only=False,因此若使用从互联网下载或不可信来源获取的远端模型文件会存在安全风险。只要只加载你自己训练的模型,就完全没有风险。

回测实盘阶段收集的预测:--freqai-backtest-live-models

FreqAI 还允许通过回测参数--freqai-backtest-live-models复用 dry/live 运行期间产生的历史预测,例如当你想对照/研究实盘阶段生成的预测时:

freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --freqai-backtest-live-models

使用该参数时不能再传入--timerange,因为时间范围会根据历史预测文件中的数据自动推算。该参数在命令行定义于 cli_options.py(--freqai-backtest-live-models,帮助信息为 "Run backtest with ready models."),其与--timerange的互斥关系由 config_validation.py 校验。以 docker 镜像运行需注意使用包含所需 ML 库依赖的镜像(如Dockerfile.freqai)。

下载覆盖完整回测周期的数据

dry/live 部署中 FreqAI 会自动下载所需数据;而回测功能需要你先用download-data命令自行下载(下载方式详见 docs/data-download.md#data-downloading)。你必须仔细估算需额外下载多少数据,以保证回测起始点之前有足够的训练数据。

估算方法:把回测时间范围的起点向前平移train_period_days天,再减去startup_candle_count(该参数在 FreqaiExampleStrategy.py 示例中取 40;具体定义见 docs/freqai-parameter-table.md)。两个参数的精确含义可查阅 docs/freqai-parameter-table.md。

参考 config_examples/config_freqai.example.json 的示例配置——其train_period_days为 30,若再叠加startup_candle_count: 40、最大include_timeframes为 1h,那么要回测--timerange 20210501-20210701,数据下载起始日应为:

20210501 - 30天 - 40 × 1h / 24h = 20210330

即比目标回测起始日提前约 31.7 天开始下载数据。

确定滑动训练窗口与回测时长

回测时间范围由常见的--timerange参数定义,其中涉及两个关键参数:

参数含义
train_period_days滑动训练窗口宽度(天数),即每次用多少天历史数据训练模型
backtest_period_days滑动回测窗口宽度(天数),即训练完成后连续回测多少天再滑窗重训;允许浮点值,以便在 dry/live 模式下表示亚日级重训

仍以 config_examples/config_freqai.example.json 为例(训练 30 天、随后回测 7 天):FreqAI 训练完模型后回测随后的 7 天;随后"滑动窗口"向前推进一周(相当于模拟实盘每周重训一次),新模型使用前 30 天(包含上一个模型回测过的 7 天)的数据训练,如此反复直到--timerange结束。因此,若设置--timerange 20210501-20210701(约 8 周),FreqAI 在该范围内将依次训练出8 个独立模型(8 周 × 每周期 1 个)。

特别注意:虽然backtest_period_days允许为小数,但--timerange会被它相除来决定需要训练的模型数量。例如 10 天的 timerange 配合 0.1 天的backtest_period_days,意味着每个币对要训练100 个模型才能完成整段回测。因此,真正全量地回测 FreqAI 自适应训练会极其耗时。想完整检验一个模型的最佳方式是让它 dry run 持续训练——这种情况下回测所需时间与 dry run 完全相同。

定义模型过期:expiration_hours

dry/live 模式下,FreqAI 逐个币对顺序训练(在独立于主机器人进程的线程/GPU 上运行)。这意味着各币对模型之间必然存在新旧差异:假如你在 50 个币对上训练、每个币对需 5 分钟,最"老"的模型将超过 4 小时。如果策略的特征时间尺度(如目标持仓时长)小于 4 小时,这种差距可能不可接受。

此时可通过expiration_hours决定:仅当模型年龄小于该小时数时才允许开仓

"freqai": { "expiration_hours": 0.5 }

上例表示只允许对年龄不足 0.5 小时的模型做预测。参数表中该参数默认值为0(模型永不过期)。其判断逻辑见源码 data_kitchen.py 的check_if_model_expired()

控制模型学习过程

模型训练参数:model_training_parameters

模型训练参数因所选 ML 库而异。FreqAI 允许你在配置的model_training_parameters字典里,为任意库设置任意参数。参考配置 config_examples/config_freqai.example.json 展示了部分与 Catboost、LightGBM 相关的示例参数,你可以按需加入这两个库或其他任何你选用 ML 库所支持的全部参数。常见条目包括n_estimators(提升树数量)、learning_rate(学习率)以及n_jobs/thread_count/task_type(并行线程与gpu/cpu设备,不同库命名不同)等,完整清单见 docs/freqai-parameter-table.md#model-training-parameters。注意,model_training_parameters的解析入口位于 freqai_interface.py。

数据切分参数:data_split_parameters

数据切分参数定义在data_split_parameters中,可取 scikit-learntrain_test_split()函数支持的任何参数,例如:

  • test_size:用于测试而非训练的数据占比(小于 1 的正浮点数);
  • shuffle:是否打乱训练数据。默认False,即保持时序数据的时间先后顺序,避免训练被时间自相关的数据引入偏差;
  • 在示例配置中还会看到random_state用于固定随机种子保证可复现。

关于这些参数的更多说明可参考 scikit-learn 官方文档中train_test_split()的条目。参数表的完整描述见 docs/freqai-parameter-table.md#data-split-parameters。

标签偏移:label_period_candles

FreqAI 特有参数label_period_candles定义了labels的偏移量(即向未来看多少根 K 线)。参考配置(见 docs/freqai-configuration.md#setting-up-the-configuration-file)中将其设为 24,即要求 24 根 K 线之后的 labels。该参数的典型用法见 freqtrade/templates/FreqaiExampleStrategy.py:在set_freqai_targets()中通过.shift(-label_period_candles).rolling(label_period_candles)构造未来窗口的目标值。注意该参数并非强制——你完全可以自定义 labels,选择是否使用它。

持续学习:Continual Learning

在配置中设置"continual_learning": true即可启用持续学习(增量学习)方案:首次模型从零训练后,后续每次训练都会以上一次训练的最终模型状态为起点,相当于给新模型保留了上一状态的"记忆"。默认值为False,即所有新模型均从头训练、不参考历史模型。相关实现见 freqai_interface.py 的get_init_model():只有启用continual_learning时才会从model_dictionary取出上一模型作为初始状态传给新一轮训练。

启用持续学习时有两点必须知晓:

  • 强制恒定参数空间:由于持续学习要求模型参数空间在两次训练之间不可变化,启用后principal_component_analysis会被自动关闭(因为 PCA 会改变参数空间与特征数量)。这一强制逻辑见源码 freqai_interface.py。PCA 的详细原理见 docs/freqai-feature-engineering.md#data-dimensionality-reduction-with-principal-component-analysis。
  • 实验性功能警告:这目前仍是一种朴素的增量学习实现,很可能会过拟合/陷入局部最优,尤其是在市场走势偏离模型时。FreqAI 提供该机制主要是为了实验目的,并为加密货币这类混沌系统中更成熟的持续学习方案预留基础。

使用 Hyperopt 调优 FreqAI 策略

Hyperopt 命令与常规 Freqtrade hyperopt 一致(常规用法见 docs/hyperopt.md):

freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507

hyperopt要求你像回测一样预先下载好数据,并额外注意以下约束:

  • --analyze-per-epoch参数与 FreqAI不兼容
  • 无法对feature_engineering_*()set_freqai_targets()中的指标做 hyperopt,即不能通过 hyperopt 直接优化模型参数;除此之外,其他所有 空间 均可优化;
  • 回测部分的注意事项同样适用于 hyperopt。

最佳实践:将 hyperopt 与 FreqAI 结合时,应聚焦于优化入场/离场的阈值与条件。你需要优化那些不会进入特征的参数——例如不应去 hyperopt 特征构造中的滚动窗口长度,也不应改动任何会影响预测结果的 FreqAI 配置。原因在于:为了高效 hyperopt FreqAI 策略,FreqAI 会把预测存储为 dataframe 并反复复用,因此只适合对入场/离场阈值或条件做搜索。

一个典型的可 hyperopt 参数示例,是 Dissimilarity Index (DI) 的判定阈值DI_values(超过该值即视为离群点):

di_max = IntParameter(low=1, high=20, default=10, space='buy', optimize=True, load=True) dataframe['outlier'] = np.where(dataframe['DI_values'] > self.di_max.value/10, 1, 0)

这个具体例子能帮你找到最适合自身参数空间的DI_values取值。

使用 Tensorboard 观察训练过程

FreqAI 为多种模型内置了 Tensorboard 支持,包括 XGBoost、全部 PyTorch 模型、强化学习(Reinforcement Learning)与 Catboost。前提是:

  • 依赖要求:Tensorboard 日志记录需要 FreqAI 的 torch 安装包或对应 docker 镜像(如 Dockerfile.freqai、Dockerfile.freqai_rl)。

最简用法:确保配置中freqai.activate_tensorboardTrue(默认即开启),运行 FreqAI,然后在另一个 shell中执行:

cd freqtrade tensorboard --logdir user_data/models/unique-id

其中unique-id即配置freqai中设置的identifier。命令必须在单独 shell 中运行,才能在你的浏览器中访问127.0.0.1:6060(6060 是 Tensorboard 默认端口)查看输出:

性能提示:Tensorboard 日志记录会拖慢训练速度,生产环境建议关闭它。另外在代码层,Tensorboard logger 的创建/关闭逻辑位于 freqai_interface.py 的训练主流程extract_data_and_train_model()中,受activate_tensorboard开关控制。

关键参数速查与参考资源

为便于实战对照,下表汇总了本文涉及的核心运行参数(更多参数见 docs/freqai-parameter-table.md):

参数作用域作用默认值
train_period_daysfreqai训练数据天数(滑动窗口宽度)必填
backtest_period_daysfreqai回测滑动窗口天数(可小数)必填
identifierfreqai当前模型的唯一 ID,用于复用/清理/恢复必填
live_retrain_hoursfreqaidry/live 重训最小间隔(小时)0
expiration_hoursfreqai模型过期时间,过期后不做预测0
purge_old_modelsfreqai每币对在磁盘保留的模型数量(回测不适用)2
save_backtest_modelsfreqai回测时是否保存完整模型到磁盘False
continual_learningfreqai是否以上一模型终态为新模型起点False
activate_tensorboardfreqai是否开启 Tensorboard 日志True

可进一步延伸阅读的相关文档与示例均位于仓库内:

  • FreqAI 参数总表:docs/freqai-parameter-table.md
  • FreqAI 配置说明:docs/freqai-configuration.md
  • 特征工程与降维/去离群:docs/freqai-feature-engineering.md
  • 可运行示例配置:config_examples/config_freqai.example.json
  • 示例策略模板:freqtrade/templates/FreqaiExampleStrategy.py
  • 运行调度与训练核心源码:freqtrade/freqai/freqai_interface.py、freqtrade/freqai/data_kitchen.py、freqtrade/freqai/data_drawer.py

综上所述,dry/live 与 backtesting 是 FreqAI 的两条主运行链路:前者强调自动数据供给、按live_retrain_hours驱动的持续重训与按expiration_hours驱动的模型可信度管理;后者强调手动数据准备、滑动窗口重训模拟以及基于identifier的预测/模型复用。把握住identifier这条贯穿始终的主线,再配合purge_old_modelscontinual_learning、Hyperopt 与 Tensorboard 等辅助能力,即可在生产环境中稳定、高效地驾驭 FreqAI 的自适应机器学习交易流程。

【免费下载链接】freqtradeFree, open source crypto trading bot项目地址: https://gitcode.com/GitHub_Trending/fr/freqtrade

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询