Skip to content

递归分析

本页说明如何验证策略是否因某些指标的递归问题而存在误差。

递归公式通过前一项来定义序列中的任意项。递归公式的一个例子是 an = an-1 + b。

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

例如,计算一个名为 steps 的基础指标时,第一行的值始终为 0,而后续行的值等于前一行值加 1。如果使用最新的 1000 根 K 线计算,则第一行的 steps 值为 0,最后一根已收盘 K 线的 steps 值为 999。

如果仅使用最新的 500 根 K 线计算会怎样?那么最后一根已收盘 K 线的 steps 值将是 499 而非 999。这种数值差异意味着你的回测结果可能与模拟/实盘运行结果不同。

recursive-analysis 命令需要历史数据支持。要了解如何获取感兴趣的交易对和交易所数据, 请参阅文档的数据下载部分。

该命令基于准备不同长度的数据,并据此计算指标。 它并不对策略本身进行回测,而仅计算指标。在完成不同启动蜡烛值(startup_candle_count)的指标计算后,会对比所有指定 startup_candle_count 的最后一行数值,观察它们与基准计算相比显示出多大的差异。

命令设置:

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

除了递归公式检查外,该命令还会对指标值进行简单的未来偏差检查。如需进行完整的未来数据检查,请使用 未来数据分析

递归分析命令参考

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 获取蜡烛数据时,最后一根蜡烛是机器人正在检查的当前蜡烛,其余数据则为"启动蜡烛"。

例如,币安每次 API 调用允许获取 1000 根蜡烛。当机器人收到 1000 根蜡烛时,最后一根是"当前蜡烛",前面的 999 根是"启动蜡烛"。如果将启动蜡烛数设置为 1000 而不是 999,机器人将尝试获取 1001 根蜡烛。此时交易所 API 会以分页形式发送蜡烛数据,以币安 API 为例,这将分为两组:一组长度为 1000,另一组长度为 1。这会导致机器人认为策略需要 1001 根蜡烛的数据,因此它会下载相当于 2000 根蜡烛的数据,即包含 1 根"当前蜡烛"和 1999 根"启动蜡烛"。

此外,交易所会限制连续批量API调用的次数,例如币安允许5次调用。在这种情况下,从币安API下载蜡烛图数据时,若不触发API速率限制,最多只能获取5000根蜡烛,这意味着您能设置的最大 startup_candle_count 为4999。

请注意,交易所可能在未来未经事先通知的情况下更改此蜡烛图数量限制。

该命令如何工作?

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

理解递归分析输出

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

| 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根蜡烛(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 中,则不会被计算。