跳至内容

高级回测分析

分析买入/入场和卖出/离场标签

了解策略在不同买入/入场标签下的行为表现可能非常有帮助,这些标签用于标记不同的买入条件。你可能希望查看比默认回测输出更复杂的每个买入和卖出条件的统计数据,也可能希望确定导致交易开仓的信号 K 线上的指标值。

注意

以下买入原因分析仅适用于回测,不适用于超参数优化(hyperopt)

我们需要使用 --export 参数并将其设置为 signals,以启用信号 交易的导出功能:

freqtrade backtesting -c <config.json> --timeframe <tf> --strategy <strategy_name> --timerange=<timerange> --export=signals

这将指示 freqtrade 输出一个包含策略、交易对以及对应导致入场和离场信号的 K 线数据框(DataFrame)的序列化字典文件。根据你的策略生成的交易数量,该文件可能会变得相当大,因此请定期检查 user_data/backtest_results 文件夹并删除旧的导出文件。

在运行下一次回测之前,请确保删除旧的回测结果,或使用 --cache none 选项运行回测,以确保不会使用任何缓存结果。

如果一切顺利,你现在应该会在 user_data/backtest_results 文件夹中看到名为 backtest-result-{timestamp}_signals.pklbacktest-result-{timestamp}_exited.pkl 的文件。

为了分析入场/离场标签,我们现在需要使用 freqtrade backtesting-analysis 命令,并通过 --analysis-groups 选项提供以空格分隔的参数:

freqtrade backtesting-analysis -c <config.json> --analysis-groups 0 1 2 3 4 5

此命令将读取最近一次的回测结果。--analysis-groups 选项用于指定各种表格输出,展示每组或每笔交易的盈利情况,范围从最简单的(0)到最详细的按交易对、按买入标签和按卖出标签划分的(4):

  • 0:按 enter_tag 分组的整体胜率和利润汇总
  • 1:按 enter_tag 分组的利润汇总
  • 2:按 enter_tag 和 exit_tag 分组的利润汇总
  • 3:按交易对和 enter_tag 分组的利润汇总
  • 4:按交易对、enter_tag 和 exit_tag 分组的利润汇总(此结果可能非常庞大)
  • 5:按 exit_tag 分组的利润汇总

通过使用 -h 选项可以查看更多可用选项。

使用回测文件名

默认情况下,backtesting-analysis 会处理 user_data/backtest_results 目录中最新的回测结果。如果你想分析更早一次回测的结果,可以使用 --backtest-filename 选项指定目标文件。这样你就可以随时重新访问并分析历史回测输出,只需提供相应回测结果的文件名即可:

freqtrade backtesting-analysis -c <config.json> --timeframe <tf> --strategy <strategy_name> --timerange <timerange> --export signals --backtest-filename backtest-result-2025-03-05_20-38-34.zip

你应该会在日志中看到类似以下内容的输出,其中包含已导出的时间戳文件名:

2022-06-14 16:28:32,698 - freqtrade.misc - INFO - dumping json to "mystrat_backtest-2022-06-14_16-28-32.json"

然后你可以在 backtesting-analysis 中使用该文件名:

freqtrade backtesting-analysis -c <config.json> --backtest-filename=mystrat_backtest-2022-06-14_16-28-32.json

若要使用来自不同结果目录的结果,可以使用 --backtest-directory 选项来指定目录。

freqtrade backtesting-analysis -c <config.json> --backtest-directory custom_results/ --backtest-filename mystrat_backtest-2022-06-14_16-28-32.json

调整要显示的买入标签和卖出标签

若要在输出中仅显示特定的买入和卖出标签,请使用以下两个选项:

--enter-reason-list : Space-separated list of enter signals to analyse. Default: "all"
--exit-reason-list : Space-separated list of exit signals to analyse. Default: "all"

例如:

freqtrade backtesting-analysis -c <config.json> --analysis-groups 0 2 --enter-reason-list enter_tag_a enter_tag_b --exit-reason-list roi custom_exit_tag_a stop_loss

输出信号 K 线的指标

freqtrade backtesting-analysis 的真正强大之处在于能够打印出信号 K 线上的指标值,从而实现对买入信号指标的精细分析和调优。要为一组给定的指标打印出对应的列,请使用 --indicator-list 选项:

freqtrade backtesting-analysis -c <config.json> --analysis-groups 0 2 --enter-reason-list enter_tag_a enter_tag_b --exit-reason-list roi custom_exit_tag_a stop_loss --indicator-list rsi rsi_1h bb_lowerband ema_9 macd macdsignal

这些指标必须存在于你的策略主 DataFrame 中(无论是主时间帧还是信息时间帧),否则脚本输出时会直接忽略它们。

指标列表

指标值将在入场点和离场点都显示。如果指定了 --indicator-list all,则仅显示入场点的指标,以避免因策略不同而导致输出列表过长。

分析中包含了一系列与 K 线和交易相关的字段,这些字段可通过添加到指标列表中直接访问,包括:

  • open_date:交易开始时间
  • close_date:交易结束时间
  • min_rate:持仓期间所见最低价格
  • max_rate:持仓期间所见最高价格
  • open:信号 K 线的开盘价
  • close:信号 K 线的收盘价
  • high:信号 K 线的最高价
  • low:信号 K 线的最低价
  • volume:信号 K 线的成交量
  • profit_ratio:交易利润率
  • profit_abs:交易的绝对收益

指标值的示例输出

freqtrade backtesting-analysis -c user_data/config.json --analysis-groups 0 --indicator-list chikou_span tenkan_sen 

在此示例中,我们的目标是在交易的入场点和离场点显示 chikou_spantenkan_sen 指标值。

指标值的示例输出可能如下所示:

交易对 开仓时间 入场原因 离场原因 chikou_span (入场) 转换线 (入场) 迟行带 (出场) 转换线 (出场)
DOGE/USDT 2024-07-06 00:35:00+00:00 出场信号 0.105 0.106 0.105 0.107
BTC/USDT 2024-08-05 14:20:00+00:00 投资回报率(roi) 54643.440 51696.400 54386.000 52072.010

如表所示,迟行带 (入场) 表示交易入场时的指标值,而 迟行带 (出场) 则反映出场时的指标值。这种对指标值的详细展示有助于增强分析效果。

(入场)(出场) 后缀用于区分指标在交易入场和出场时的取值。

全交易周期指标

某些全交易周期指标不包含 (入场)(出场) 后缀。这些指标包括:交易对投注金额最大投注金额数量开仓时间平仓时间开仓价格平仓价格开仓手续费平仓手续费持仓时长盈利比例盈利金额出场原因初始止损绝对值初始止损比例止损绝对值止损比例最低价格最高价格是否持仓入场标签杠杆是否做空开仓时间戳平仓时间戳 以及 订单

根据入场或出场信号过滤指标

--indicator-list 选项默认会显示入场和出场信号的指标值。若要仅显示入场信号的指标值,可使用 --entry-only 参数;类似地,若仅显示出场信号的指标值,则使用 --exit-only 参数。

示例:显示入场信号处的指标值:

freqtrade backtesting-analysis -c user_data/config.json --analysis-groups 0 --indicator-list chikou_span tenkan_sen --entry-only

示例:显示出场信号处的指标值:

freqtrade backtesting-analysis -c user_data/config.json --analysis-groups 0 --indicator-list chikou_span tenkan_sen --exit-only

注意

使用这些过滤器时,指标名称将不再带有 (入场)(出场) 后缀。

按日期过滤交易输出

若要仅显示回测时间段内的交易,请使用通常的 timerange 选项,格式为 YYYYMMDD-[YYYYMMDD]

--timerange : Timerange to filter output trades, start date inclusive, end date exclusive. e.g. 20220101-20221231

例如,如果您的回测时间段为 20220101-20221231,但只想输出 1 月份的交易:

freqtrade backtesting-analysis -c <config.json> --timerange 20220101-20220201

打印被拒绝的信号

使用 --rejected-signals 选项可打印出被拒绝的信号。

freqtrade backtesting-analysis -c <config.json> --rejected-signals

将表格写入 CSV

一些表格输出可能很大,因此不适合在终端中直接打印。使用 --analysis-to-csv 选项可以禁止将表格输出到标准输出,并将其写入 CSV 文件。

freqtrade backtesting-analysis -c <config.json> --analysis-to-csv

默认情况下,该选项会为你在 backtesting-analysis 命令中指定的每个输出表格生成一个文件,例如:

freqtrade backtesting-analysis -c <config.json> --analysis-to-csv --rejected-signals --analysis-groups 0 1

这将写入到 user_data/backtest_results 目录:

  • rejected_signals.csv
  • group_0.csv
  • group_1.csv

若要更改文件的写入路径,请同时指定 --analysis-csv-path 选项。

freqtrade backtesting-analysis -c <config.json> --analysis-to-csv --analysis-csv-path another/data/path/