Skip to content

递归分析

本页面解释了如何验证由于某些指标的递归问题而导致的策略不准确性。

递归公式是相对于其前续项而定义序列的任何项的公式。递归公式的一个示例是 an = an-1 + b。

为什么这对 Freqtrade 很重要呢?在回测中,机器人将根据指定的时间范围获取交易对的完整数据。但在实际运行中,机器人将受到交易所提供数据量的限制。

例如,要计算一个非常基本的指标称为 steps,第一行的值始终为0,而后续行的值等于前一行的值加1。如果我使用最新的1000个蜡烛来计算它,那么第一行的 steps 值为0,并且最后一个关闭蜡烛的 steps 值为999。

如果计算只使用最新的500个蜡烛会发生什么?然后,最后一个关闭蜡烛的 steps 值为499,与999的差值意味着您的回测结果可能与您的实际运行结果不同。

递归分析 命令需要有历史数据可用。要了解如何获取您感兴趣的交易对和交易所的数据,请转到文档的 数据下载 部分。

该命令基于准备不同的数据长度,并根据这些数据计算指标。 这不是对策略本身进行回测,而只是计算指标。在完成对不同的启动蜡烛数值 (startup_candle_count) 计算指标后,将比较所有指定的 startup_candle_count 上的最后行的值,以查看它们与基本计算相比显示多大的差异。

命令设置:

  • 使用 -p 选项设置要分析的交易对。由于我们只关注指标值,使用多个交易对是多余的。最好使用价格相对较高且至少具有适度波动性的交易对,例如 BTC 或 ETH,以避免会导致结果不准确的舍入问题。如果命令中没有设置交易对,则此分析使用白名单中的第一个交易对。
  • 建议设置一个较长的时间范围(至少为5000个蜡烛),以便作为基准的初始指标计算本身具有非常小或没有递归问题。例如,对于5分钟时间框架,5000个蜡烛的时间范围相当于18天。
  • 强制使用 --cache 选项设置为 "none",以避免自动加载先前的指标计算。除了递归公式检查之外,此命令还对指标值进行了简单的前瞻偏差检查。要进行完整的前瞻检查,请使用前瞻分析

递归分析命令参考

usage: freqtrade recursive-analysis [-h] [-v] [--logfile FILE] [-V] [-c PATH]
                                    [-d PATH] [--userdir PATH] [-s NAME]
                                    [--strategy-path PATH]
                                    [--recursive-strategy-search]
                                    [--freqaimodel NAME]
                                    [--freqaimodel-path PATH] [-i TIMEFRAME]
                                    [--timerange TIMERANGE]
                                    [--data-format-ohlcv {json,jsongz,hdf5,feather,parquet}]
                                    [-p PAIR]
                                    [--freqai-backtest-live-models]
                                    [--startup-candle STARTUP_CANDLES [STARTUP_CANDLES ...]]

optional arguments:
  -h, --help            显示帮助信息并退出
  -i TIMEFRAME, --timeframe TIMEFRAME
                        指定时间框架(`1m`、`5m`、`30m`、`1h`、`1d`)。
  --data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
                        存储下载的蜡烛(OHLCV)数据的格式。
                        (默认值:`feather`)。
  -p PAIR, --pairs PAIR
                        限制此命令的交易对。
  --startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]
                        提供以空格分隔的要检查的`startup_candle_count`列表。默认值:`199 399 499 999 1999`。

常用参数:
  -v, --verbose         详细模式(-vv更详细,-vvv获取所有消息)。
  --logfile FILE        记录到指定的文件中。特殊值包括:`syslog`、`journald`。有关更多详细信息,请参见文档。
  -V, --version         显示程序的版本号并退出
  -c PATH, --config PATH
                        指定配置文件(默认值:`userdir/config.json`或`config.json`,以存在的文件为准)。可以多次使用--config选项。可以设置为`-`从stdin读取配置。
  -d PATH, --datadir PATH
                        具有历史回测数据的目录路径。
  --userdir PATH, --user-data-dir PATH
                        用户数据目录路径。

策略参数:
  -s NAME, --strategy NAME
                        指定机器人使用的策略类名。
  --strategy-path PATH  指定附加策略查找路径。
  --timerange TIMERANGE
                        指定要使用的数据的时间范围。

为什么默认的startup candles使用奇数?

启动蜡烛的默认值是奇数。当机器人从交易所的API获取蜡烛数据时,最后一根蜡烛是机器人检查的蜡烛,而其余的数据是“启动蜡烛”。

例如,币安允许每个API调用获取1000根蜡烛。当机器人接收到1000根蜡烛时,最后一根蜡烛是“当前蜡烛”,前面的999根蜡烛是“启动蜡烛”。将启动蜡烛数量设置为1000而不是999,机器人将尝试获取1001根蜡烛。然后,交易所API将以分页形式发送蜡烛数据,例如币安API的情况下,将分为一个长度为1000的组和一个长度为1的组。这导致机器人认为策略需要1001根蜡烛的数据,因此它将下载2000根蜡烛的数据,其中包括1根“当前蜡烛”和1999根“启动蜡烛”。

此外,交易所限制连续批量API调用的数量,例如币安允许5次调用。在这种情况下,从币安API中只能下载5000根蜡烛而不会触发API速率限制,这意味着最大的startup_candle_count可以是4999。请注意,交易所可能会在未经事先通知的情况下更改此蜡烛限制。

命令是如何工作的?

  • 首先,使用提供的时间范围进行初始指标计算,生成指标值的基准。
  • 设置基准后,将为每个不同的启动蜡烛计数值进行额外的运行。
  • 然后,命令将比较最后一根蜡烛行处的指标值,并在表格中报告差异。

理解递归分析输出

以下是一个输出结果表格的示例,其中至少有一个指标存在递归公式问题:

| 指标       | 20      | 40      | 80     | 100    | 150     | 300     | 999    |
|-----------+---------+---------+--------+--------+---------+---------+--------|
| rsi_30    | nan%    | -6.025% | 0.612% | 0.828% | -0.140% | 0.000%  | 0.000% |
| rsi_14    | 24.141% | -0.876% | 0.070% | 0.007% | -0.000% | -0.000% | -      |

列标题表示分析中使用的不同 startup_candle_count。表中的值表示计算的指标与基准值相比的差异。

nan% 表示该指标的值无法计算,因为数据不足。在这个例子中,你无法使用只有21根蜡烛(1根当前蜡烛+20根启动蜡烛)的情况下计算长度为30的 RSI。

用户应该根据每个指标来评估表格,以决定指定的 startup_candle_count 是否会导致方差足够小,从而指标对于入场和/或出场没有任何影响。

因此,追求绝对零方差(用 - 值表示)可能不是最佳选择,因为某些指标可能需要您使用如此长的 startup_candle_count 才能达到零方差。## 注意事项

  • recursive-analysis 只会计算和比较最后一行的指标值。输出表格报告了不同启动蜡烛计算与原始基准计算之间的百分比差异。但其中是否对你的进出场有实际影响并不包括在内。
  • 理想情况下,指标不会有任何差异(或者至少非常接近0%),尽管启动蜡烛数量有所变化。实际上,指标(如 EMA)使用递归公式来计算指标值,因此目标并不一定是零百分比差异,而是要使差异足够小(因此 startup_candle_count 足够大),以至于指标中存在的递归不会对交易决策产生任何真正的影响。
  • recursive-analysis 只会在 populate_indicators@informative 装饰器的计算中运行。如果你将任何指标计算放在 populate_entry_trendpopulate_exit_trend 中,它将不会被计算。