Skip to content

前瞻性分析

本页说明如何在前瞻性偏差方面验证您的策略。

前瞻性偏差是任何策略的祸根,因为有时很容易引入这种偏差,但可能很难检测到。

回测会初始化所有时间戳(将整个数据帧加载到内存中)并一次性计算所有指标。 这意味着如果您的指标或入场/出场信号查看未来的K线,这将使您的回测结果失真。

lookahead-analysis 命令要求历史数据可用。 要了解如何获取您感兴趣的货币对和交易所的数据, 请转到文档的数据下载部分。 lookahead-analysis 也支持 freqai 策略。

该命令内部链接回测并探测策略,以促使其显示前瞻性偏差。 这是通过不查看策略代码本身,而是查看与完整回测相比变化的指标值和移动的入场/出场点来实现的。

lookahead-analysis 可以使用回测的典型选项,但强制使用以下选项:

  • --cache 被强制设置为 "none"。
  • --max-open-trades 被强制要求至少等于交易对的数量。
  • --dry-run-wallet 被强制设置为接近无限大(10亿)。
  • --stake-amount 被强制设置为静态的 10000(1万)。
  • --enable-protections 被强制关闭。
  • order_types 被强制设置为 "market"(延迟入场),除非设置了 --lookahead-allow-limit-orders

这些设置旨在避免用户意外生成误报。

前瞻分析命令参考

usage: freqtrade lookahead-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}]
                                    [--max-open-trades INT]
                                    [--stake-amount STAKE_AMOUNT]
                                    [--fee FLOAT] [-p PAIRS [PAIRS ...]]
                                    [--enable-protections]
                                    [--enable-dynamic-pairlist]
                                    [--dry-run-wallet DRY_RUN_WALLET]
                                    [--timeframe-detail TIMEFRAME_DETAIL]
                                    [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]]
                                    [--export {none,trades,signals}]
                                    [--backtest-filename PATH]
                                    [--backtest-directory PATH]
                                    [--freqai-backtest-live-models]
                                    [--minimum-trade-amount INT]
                                    [--targeted-trade-amount INT]
                                    [--lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME]
                                    [--allow-limit-orders]

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`).
  --max-open-trades INT
                        Override the value of the `max_open_trades`
                        configuration setting.
  --stake-amount STAKE_AMOUNT
                        Override the value of the `stake_amount` configuration
                        setting.
  --fee FLOAT           Specify fee ratio. Will be applied twice (on trade
                        entry and exit).
  -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
                        Limit command to these pairs. Pairs are space-
                        separated.
  --enable-protections, --enableprotections
                        Enable protections for backtesting. Will slow
                        backtesting down by a considerable amount, but will
                        include configured protections
  --enable-dynamic-pairlist
                        Enables dynamic pairlist refreshes in backtesting. The
                        pairlist will be generated for each new candle if
                        you're using a pairlist handler that supports this
                        feature, for example, ShuffleFilter.
  --dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
                        Starting balance, used for backtesting / hyperopt and
                        dry-runs.
  --timeframe-detail TIMEFRAME_DETAIL
                        Specify detail timeframe for backtesting (`1m`, `5m`,
                        `30m`, `1h`, `1d`).
  --strategy-list STRATEGY_LIST [STRATEGY_LIST ...]
                        Provide a space-separated list of strategies to
                        backtest. Please note that timeframe needs to be set
                        either in config or via command line. When using this
                        together with `--export trades`, the strategy-name is
                        injected into the filename (so `backtest-data.json`
                        becomes `backtest-data-SampleStrategy.json`
  --export {none,trades,signals}
                        Export backtest results (default: trades).
  --backtest-filename PATH, --export-filename PATH
                        Use this filename for backtest results.Example:
                        `--backtest-
                        filename=backtest_results_2020-09-27_16-20-48.json`.
                        Assumes either `user_data/backtest_results/` or
                        `--export-directory` as base directory.
  --backtest-directory PATH, --export-directory PATH
                        Directory to use for backtest results. Example:
                        `--export-directory=user_data/backtest_results/`.
  --freqai-backtest-live-models
                        Run backtest with ready models.
  --minimum-trade-amount INT
                        Minimum trade amount for lookahead-analysis
  --targeted-trade-amount INT
                        Targeted trade amount for lookahead analysis
  --lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME
                        Use this csv-filename to store lookahead-analysis-
                        results
  --allow-limit-orders  Allow limit orders in lookahead analysis (could cause
                        false positives in lookahead analysis results).

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.

Note

以上输出已简化为 lookahead-analysis 在常规回测命令基础上增加的选项。

简介

许多策略在程序员不知情的情况下,都受到了前瞻性偏差的影响。 这通常会使策略回测看起来盈利,有时甚至达到极端水平,但这并不现实,因为策略通过查看在模拟或实盘模式下本不应拥有的数据而"作弊"。

策略能够"作弊"的原因在于,freqtrade 的回测过程在开始时就会填充完整的数据框,包括所有蜡烛图时间戳。 如果程序员不够谨慎或不了解内部工作原理(有时确实很难发现),那么策略就会窥视未来数据。

此命令旨在尝试验证前述前瞻性偏差的有效性。

该命令如何工作?

它将首先对所有交易对进行回测,为指标和入场/出场生成基准线。 在初始回测运行后,系统将检查是否满足 minimum-trade-amount,如果不满足,则取消该策略的前瞻分析。
如果发生这种情况,请使用更宽的时间范围来获取更多交易进行分析,或使用交易发生更频繁的时间段。

设定基准线后,系统将分别对每个入场和出场信号进行额外的回测运行。
当这些验证回测完成后,系统会比较两个数据框(基准线和切片数据)中各列值的差异,并报告偏差。 在所有信号被验证或证伪后,将生成结果表格供用户查看。

如何发现并消除偏差?如何挽救有偏差的策略?

如果你在网上发现了一个有偏差的策略,并希望获得相同的结果但消除偏差, 那么大多数情况下你会失望。 通常,策略中的偏差是导致"好得不真实"利润的主要驱动因素。 移除因偏差而推高利润的条件或指标,通常会使策略表现显著变差。 如果存在偏差的指标或条件并非策略核心,或者存在其他无偏差的入场和出场信号, 或许可以部分挽救该策略。

前瞻偏差示例

  • shift(-10) 会查看未来10根K线的数据。
  • 在 populate_* 函数中使用 iloc[] 访问数据框中的特定行。
  • 如果未能严格控制循环遍历的数值范围,for循环容易引入未来偏差。
  • 诸如 .mean().min().max() 等聚合函数,若未配合滚动窗口使用, 将基于整个数据框计算数值,导致信号K线会"看到"包含未来K线的数值。 避免偏差的正确做法是使用 rolling() 回溯历史K线数据: 例如 dataframe['volume_mean_12'] = dataframe['volume'].rolling(12).mean()
  • ta.MACD(dataframe, 12, 26, 1) 在信号周期设为1时将引入偏差。

结果表中的列代表什么含义?

  • filename: 被检查的策略文件名
  • strategy: 被检查的策略类名称
  • has_bias: 未来偏差分析结果。No 表示良好,Yes 表示存在问题
  • total_signals: 已检查的信号数量(默认为20个)
  • biased_entry_signals: 存在偏差的入场信号数量
  • biased_exit_signals: 存在偏差的离场信号数量
  • biased_indicators: 显示在 populate_indicators 中定义的指标本身

如果您的偏倚入场信号与这些离场信号配对,您可能会在 biased_exit_signals 中得到误报。 然而,一个偏倚的入场通常也会导致偏倚的离场, 即使离场本身并未产生偏倚—— 特别是当您的入场和离场条件使用了相同的偏倚指标时。

首先解决入场信号的偏倚问题,然后再处理离场信号。

注意事项

  • lookahead-analysis 只能验证/证伪其计算并验证过的交易。 如果策略包含多种不同的信号/信号类型,需要您选择合适的参数以确保所有信号至少触发过一次。未触发的信号将不会被验证。
    这将导致假阴性,即策略会被报告为无前瞻性偏差。
  • lookahead-analysis 使用相同的回测选项,这可能引发问题。 请勿启用任何类似仓位叠加的选项,这会扭曲已检查信号的数量。 若执意使用,请务必确保不会耗尽 max_open_trades 限额, 且回测钱包配置中有充足资金。
  • 限价单与 custom_entry_price()custom_exit_price() 回调结合使用时,可能导致延迟入场/出场,造成假阳性。 为避免此问题,该命令强制使用市价单。这意味着 custom_entry_price()custom_exit_price() 回调不会被调用。 使用 --lookahead-allow-limit-orders 将跳过此强制设置而使用您配置的订单类型——但已证实最终会产生假阳性。
  • 结果表中的 biased_indicators 列 会错误地将 set_freqai_targets() 中定义的 FreqAI 目标指标标记为有偏差。
    这些指标实际无偏差,可安全忽略。