运行 FreqAI¶
有两种训练和部署自适应机器学习模型的方法-实时部署和历史回测。在两种情况下,FreqAI都会周期性地重新训练模型,如下图所示:
实时部署¶
可以使用以下命令来进行干/live运行 FreqAI:
freqtrade trade --strategy FreqaiExampleStrategy --config config_freqai.example.json --freqaimodel LightGBMRegressor
启动FreqAI后,将根据配置设置开始训练一个新模型,具有新的“标识符”。训练完成后,模型将用于对传入的蜡烛图进行预测,直到有一个新模型可用。通常尽可能频繁地生成新模型,FreqAI管理一个内部队列,尝试保持所有模型同步更新。FreqAI始终使用最近训练的模型对传入的实时数据进行预测。如果不想让FreqAI尽可能频繁地重新训练新模型,可以设置 live_retrain_hours
,告诉FreqAI在训练新模型之前至少等待该时数。另外,可以设置 expired_hours
,告诉FreqAI避免对旧于该时数的模型进行预测。
默认情况下,训练的模型将保存到磁盘上,以便在回测或崩溃后重复使用。可以通过在配置中设置 "purge_old_models": true
来清理旧模型,以节省磁盘空间。
要从保存的回测模型(或先前崩溃的干/live会话)开始干/live运行,只需指定特定模型的 标识符
:
"freqai": {
"identifier": "example",
"live_retrain_hours": 0.5
}
在这种情况下,尽管 FreqAI 将使用一个预训练模型来初始化,但它仍会检查从模型训练结束以来经过了多长时间。如果加载的模型结束后经过了完整的 live_retrain_hours
,FreqAI 将开始训练一个新的模型。
自动数据下载¶
FreqAI 会自动下载所需的适量数据,以确保通过定义的 train_period_days
和 startup_candle_count
进行模型训练(有关这些参数的详细说明,请参见 参数表)。
保存预测数据¶
在特定的 identifier
模型的生命周期内进行的所有预测都存储在 historic_predictions.pkl
中,以便在崩溃或对配置进行更改后重新加载。
清除旧模型数据¶
FreqAI 在每次成功训练后都会存储新的模型文件。随着生成适应新的市场条件的新模型,这些文件变得过时。如果计划长时间以高频重新训练的方式运行 FreqAI,您应该在配置中启用 purge_old_models
:
"freqai": {
"purge_old_models": 4,
}
这将自动清除比最近训练的四个模型更旧的所有模型,以节省磁盘空间。输入“0”将不会清除任何模型。
回测¶
FreqAI回测模块可以通过以下命令执行:
freqtrade backtesting --strategy FreqaiExampleStrategy --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --freqaimodel LightGBMRegressor --timerange 20210501-20210701
如果此命令从未在现有配置文件上执行过,则FreqAI会为每个交易对,在扩展的 --timerange
内的每个回测窗口训练一个新模型。
回测模式在部署之前需要下载所需的数据(与在干预/实盘模式下,FreqAI会自动处理数据下载的方式不同)。请注意,下载的数据的时间范围需要覆盖回测的时间范围之外的数据。这是因为FreqAI需要在所设定的回测时间范围的第一个蜡烛图上进行预测之前,使用数据在回测时间范围之前进行模型训练。有关如何计算要下载的数据的更多详细信息,请参阅此处。
模型重用
一旦训练完成,您可以使用相同的配置文件再次执行回测,FreqAI将找到已经训练好的模型并加载它们,而不是花费时间进行训练。这对于您想要调整(甚至进行超参优化)策略的买入和卖出条件非常有用。如果您想要使用相同配置文件重新训练新模型,您只需简单地更改 "identifier"。这样,您只需指定 "identifier" 即可使用任何模型。
注意
回测调用set_freqai_targets()
,每个回测窗口调用一次(窗口的数量是完整回测时间范围除以 backtest_period_days
参数)。这样做是为了使得目标模拟干预/实盘行为,以防止前瞻性偏差。然而,在feature_engineering_*()
中定义特征是在整个训练时间范围内执行一次的。这意味着您应确保特征不会预测未来。有关前瞻性偏差的更多详细信息,请参阅常见错误。
保存预测数据¶
为了允许调整您的策略(不是特征!),FreqAI在回测过程中将自动保存预测结果,以便可以在将来的回测和实盘运行中使用相同的identifier
模型进行重复使用。这提供了一种性能优化,旨在实现对于买入/卖出条件的高级超参优化。
在 unique-id
文件夹中会创建一个名为 backtesting_predictions
的附加目录,其中包含所有以 hdf
格式保存的预测结果。要更改功能,您必须在配置中设置一个新的identifier
以通知 FreqAI 训练新模型。
要保存在特定的回测期间生成的模型,以便您可以从其中一个模型开始进行实时部署而不是训练新模型,您必须在配置中将save_backtest_models
设置为True
。
回测实时收集的预测结果¶
FreqAI通过回测参数--freqai-backtest-live-models
允许您重用实时历史预测。当您想要重复使用在干运行中生成的预测结果进行比较或其他研究时,这非常有用。
必须不指定--timerange
参数,因为它将通过历史预测文件中的数据自动计算。
下载数据以覆盖整个回测期间¶
对于实时/干运行,FreqAI将自动下载所需的数据。但是,要使用回测功能,您需要使用download-data
命令下载所需的数据(详细信息参见这里)。您需要仔细注意理解需要下载多少额外数据,以确保在回测时间范围开始之前有足够多的训练数据。可以通过将时间范围的开始日期向后移动train_period_days
和startup_candle_count
(有关这些参数的详细描述,请参见参数表)的日期来大致估计所需的额外数据量。例如,要使用示例配置对--timerange 20210501-20210701
进行回测,该配置将train_period_days
设置为30,并且startup_candle_count: 40
,最大include_timeframes
为1小时,则下载数据的开始日期需要是20210501
- 30天 - 40 * 1小时 / 24小时 = 20210330(比所需训练时间范围的开始日期提前31.7天)。
决定滑动训练窗口的大小和回测持续时间¶
回测时间范围通过配置文件中的典型--timerange
参数来定义。滑动训练窗口的持续时间由train_period_days
设置,而backtest_period_days
是滑动回测窗口的持续时间,都以天为单位(backtest_period_days
可以是小数,以表示实时/干运行中的多次日内重新训练)。在所呈现的示例配置(位于config_examples/config_freqai.example.json
中)中,用户要求 FreqAI 使用 30 天的训练期和随后 7 天的回测期。在对模型进行训练后,FreqAI 将对随后 7 天进行回测。然后,“滑动窗口”向前移动一周(模拟 FreqAI 在实时模式下每周重新训练一次),新模型使用先前 30 天的数据(包括之前模型用于回测的 7 天)进行训练。这个过程重复直到--timerange
的结束。这意味着,如果设置--timerange 20210501-20210701
,在--timerange
结束时,FreqAI 将已经训练了 8 个单独的模型(因为整个范围包括 8 周)。!!! 注意
虽然允许使用分数型的 backtest_period_days
,但请注意 --timerange
会被除以此值来确定 FreqAI 需要训练多少模型以完整回测整个时间段。例如,如果将 --timerange
设置为 10 天,backtest_period_days
设置为 0.1,那么 FreqAI 每对货币对需要训练 100 个模型来完成完整的回测。因此,对于 FreqAI 的完全回测会花费非常长的时间。完全测试模型的最佳方法是运行干运行并让其不断进行训练。在这种情况下,回测所需的时间将与干运行相同。
定义模型过期时间¶
在干运行/正式运行模式下,FreqAI 按顺序训练每个币对(与主要的 Freqtrade 机器人在不同的线程/GPU上)。这意味着模型之间总会存在年龄差异。如果您正在训练 50 对币,并且每对币需要 5 分钟来训练,那么最老的模型将超过 4 小时。如果策略的特征时间尺度(交易持续时间目标)小于 4 小时,则可能会不希望出现这种情况。您可以通过在配置文件中设置 expiration_hours
来决定仅当模型年龄小于某个特定小时数时才进行交易的录入:
"freqai": {
"expiration_hours": 0.5,
}
在上述示例配置中,用户仅允许对小于半小时的模型进行预测。
控制模型学习过程¶
模型训练参数是针对所选机器学习库的特定的。FreqAI 允许您使用配置中的 model_training_parameters
字典设置任何库的任何参数。示例配置(位于 config_examples/config_freqai.example.json
)显示了与 Catboost
和 LightGBM
关联的示例参数,但您可以添加这些库或其他任何机器学习库中的任何可用参数。
数据分割参数在 data_split_parameters
中定义,可以是与 scikit-learn 的 train_test_split()
函数相关的任何参数。train_test_split()
有一个名为 shuffle
的参数,可以指定是否对数据进行洗牌。这对于避免训练数据中存在时间上的自相关非常有用。有关这些参数的更多详细信息,请参阅 scikit-learn 网站(外部网站)。
FreqAI 特定的参数 label_period_candles
定义了用于 labels
的偏移量(未来几根 K 线的数目)。在上述示例配置中,用户要求未来 24 根 K 线作为 labels
。
持续学习¶
您可以在配置中将 "continual_learning": true
设置为启用持续学习模式。启用 continual_learning
后,将从前一个训练的最终模型状态开始进行后续训练。这使得新模型具有先前状态的"记忆"。默认情况下,该值为 False
,这意味着所有新模型都将从头开始训练,不考虑之前模型的输入。
持续学习会强制保持恒定的参数空间
因为 continual_learning
意味着模型参数空间不能在训练之间改变,所以在启用 continual_learning
时将自动禁用 principal_component_analysis
。提示:PCA 会改变参数空间和特征数量,可以在此了解有关 PCA 的更多信息 here。
实验功能
请注意,这是一种目前的增量学习方法,它很可能在市场偏离您的模型时过拟合/陷入局部最小值。我们在 FreqAI 中的机制主要用于实验目的,以备在像加密货币市场这样的混乱系统中应用更成熟的持续学习方法时使用。
Hyperopt¶
您可以使用与典型的 Freqtrade hyperopt 相同的命令进行超参数优化:
freqtrade hyperopt --hyperopt-loss SharpeHyperOptLoss --strategy FreqaiExampleStrategy --freqaimodel LightGBMRegressor --strategy-path freqtrade/templates --config config_examples/config_freqai.example.json --timerange 20220428-20220507
hyperopt
需要您以与进行回测时相同的方式预先下载数据。此外,当尝试对 FreqAI 策略进行超参数优化时,需要考虑一些限制:
--analyze-per-epoch
hyperopt 参数与 FreqAI 不兼容。- 不可能在
feature_engineering_*()
和set_freqai_targets()
函数中使用超参数优化指标。这意味着您不能使用超参数优化来优化模型参数。除此之外,可以优化其他所有的空间。 - 回测说明也适用于超参数优化。
在结合 hyperopt 和 FreqAI 进行优化时,最佳方法是专注于超参数优化入场/出场阈值/条件。您需要关注那些不在特征中使用的参数。例如,在特征创建中不应尝试优化滚动窗口长度,或者任何更改预测的 FreqAI 配置部分。为了有效地对 FreqAI 策略进行超参数优化,FreqAI 将预测结果存储为数据帧并重复使用它们。因此,仅需对入场/出场阈值/条件进行超参数优化即可。
在 FreqAI 中一个可进行超参数优化的很好的例子是 不相似性指数 (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模型,强化学习和Catboost。如果你希望在其他模型类型中看到Tensorboard集成,请在Freqtrade GitHub上提一个问题。
要求
Tensorboard日志记录需要FreqAI torch的安装/容器镜像。
使用tensorboard的最简单方法是确保在你的配置文件中将 freqai.activate_tensorboard
设置为 True
(默认设置),然后运行 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日志记录可能会减慢训练速度,因此在生产环境中应将其停用。