跳至内容

递归分析

本页面解释了如何验证你的策略是否存在因某些指标递归问题导致的不准确性。

递归公式是指用序列中前一项或前几项来定义该序列的任意一项。一个递归公式的例子是 an = an-1 + b。

这对 Freqtrade 为什么重要?在回测中,机器人会根据指定的时间范围获得交易对的完整数据。但在模拟或实盘运行中,机器人获取的数据量受限于各个交易所提供的数据量。

例如,要计算一个名为 steps 的非常基础的指标,第一行的值始终为 0,而后续每一行的值等于前一行的值加 1。如果我使用最近的 1000 根蜡烛来计算,那么第一行的 steps 值为 0,最后一根已收盘蜡烛的 steps 值为 999。

如果仅使用最近的 500 根蜡烛进行计算会发生什么?那么最后一根已收盘蜡烛的 steps 值将不是 999,而是 499。这种数值差异意味着你的回测结果可能与模拟/实盘运行结果不同。

recursive-analysis 命令需要历史数据可用。要了解如何获取你感兴趣的交易对和交易所的数据,请前往文档中的 数据下载 部分。

该命令基于准备不同长度的数据,并据此计算指标。它并不对策略本身进行回测,而只是计算指标。在完成对不同启动蜡烛数量(startup_candle_count)的指标计算后,会比较所有指定 startup_candle_count 的最后一行数值,以查看它们相对于基准计算的差异程度。

命令设置:

  • 使用 -p 选项设置你想要分析的交易对。由于我们只关注指标值,分析多个交易对是多余的。建议选择价格相对较高且至少有一定波动性的交易对(如 BTC 或 ETH),以避免因四舍五入问题导致结果不准确。如果命令中未设置交易对,则用于分析的交易对将是白名单中的第一个交易对。
  • 建议设置较长的时间范围(至少 5000 根蜡烛),以便作为基准的初始指标计算本身几乎没有或完全没有递归问题。例如,对于 5 分钟时间周期,5000 根蜡烛的时间范围相当于 18 天。
  • --cache 被强制设为 "none",以防止自动加载之前的指标计算结果。

除了递归公式检查外,该命令还会仅对指标值进行简单的眼前偏差(lookahead bias)检查。如需完整的前瞻检查,请使用 前瞻分析(Lookahead-analysis)

递归分析命令参考

usage: freqtrade recursive-analysis [-h] [-v] [--no-color] [--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,feather,parquet}]
                                    [-p PAIRS [PAIRS ...]]
                                    [--startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]]

options:
  -h, --help            show this help message and exit
  -i TIMEFRAME, --timeframe TIMEFRAME
                        Specify timeframe (`1m`, `5m`, `30m`, `1h`, `1d`).
  --timerange TIMERANGE
                        Specify what timerange of data to use.
  --data-format-ohlcv {json,jsongz,feather,parquet}
                        Storage format for downloaded candle (OHLCV) data.
                        (default: `feather`).
  -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
                        Limit command to these pairs. Pairs are space-
                        separated.
  --startup-candle STARTUP_CANDLE [STARTUP_CANDLE ...]
                        Specify startup candles to be checked (`199`, `499`,
                        `999`, `1999`).

Common arguments:
  -v, --verbose         Verbose mode (-vv for more, -vvv to get all messages).
  --no-color            Disable colorization of hyperopt results. May be
                        useful if you are redirecting output to a file.
  --logfile FILE, --log-file FILE
                        Log to the file specified. Special values are:
                        'syslog', 'journald'. See the documentation for more
                        details.
  -V, --version         show program's version number and exit
  -c PATH, --config PATH
                        Specify configuration file (default:
                        `userdir/config.json` or `config.json` whichever
                        exists). Multiple --config options may be used. Can be
                        set to `-` to read config from stdin.
  -d PATH, --datadir PATH, --data-dir PATH
                        Path to the base directory of the exchange with
                        historical backtesting data. To see futures data, use
                        trading-mode additionally.
  --userdir PATH, --user-data-dir PATH
                        Path to userdata directory.

Strategy arguments:
  -s NAME, --strategy NAME
                        Specify strategy class name which will be used by the
                        bot.
  --strategy-path PATH  Specify additional strategy lookup path.
  --recursive-strategy-search
                        Recursively search for a strategy in the strategies
                        folder.
  --freqaimodel NAME    Specify a custom freqaimodels.
  --freqaimodel-path PATH
                        Specify additional lookup path for freqaimodels.

为什么默认的启动蜡烛数量是奇数?

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

例如,币安(Binance)允许每次 API 调用获取 1000 根 K 线。当机器人接收到 1000 根 K 线时,最后一根是“当前 K 线”,前面的 999 根则是“启动 K 线”。如果将启动 K 线数量设置为 1000 而不是 999,机器人会尝试获取 1001 根 K 线。此时交易所 API 将以分页形式返回数据,以币安 API 为例,这将分为两组:一组长度为 1000,另一组长度为 1。结果导致机器人认为策略需要 1001 根 K 线的数据,因此它会下载总共 2000 根 K 线的数据,即包含 1 根“当前 K 线”和 1999 根“启动 K 线”。

此外,交易所对连续批量 API 调用次数有限制,例如币安允许最多 5 次调用。在这种情况下,在不触发 API 速率限制的前提下,只能从币安 API 下载 5000 根 K 线,这意味着你可设置的最大 startup_candle_count 为 4999。

请注意,交易所未来可能会在没有任何预先通知的情况下更改此 K 线数量限制。

该命令如何工作?

  • 首先,使用提供的时间范围进行初始指标计算,以生成指标值的基准。
  • 设定基准后,系统将针对各个不同的启动 K 线数量值进行额外的多次运行。
  • 该命令随后会比较最后一行 K 线处的指标值,并在表格中报告差异。

理解递归分析输出

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

| indicators   | 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 根 K 线(1 根当前 K 线 + 20 根启动 K 线)时,无法计算长度为 30 的 RSI 指标。

用户应逐个评估每个指标对应的表格数据,判断指定的 startup_candle_count 是否导致足够小的偏差,从而确保该指标不会影响入场和/或出场决策。

因此,追求绝对零偏差(由 - 表示)可能并非最佳选择,因为某些指标可能需要极长的 startup_candle_count 才能达到零偏差。

注意事项

  • recursive-analysis 仅计算并比较最后一行 K 线处的指标值。输出表格报告的是不同启动 K 线数量计算结果与原始基准计算之间的百分比差异。但它并不包含这些差异是否实际影响你的买卖信号。
  • 理想情况是,无论启动 K 线数量如何变化,指标均无偏差(或至少非常接近 0%)。实际上,像 EMA 这类指标使用递归公式来计算其值,因此目标不一定是实现零百分比偏差,而是使偏差足够低(相应地,startup_candle_count 足够高),以确保指标内部的递归逻辑不会对交易决策产生实质性影响。
  • recursive-analysis 仅会对 populate_indicators@informative 装饰器内的计算进行运算。如果你将任何指标计算放在 populate_entry_trendpopulate_exit_trend 中,则这些计算不会被执行。