跳至内容

前瞻分析

本页面解释了如何从前瞻偏差的角度验证你的策略。

前瞻偏差是任何策略的大敌,因为有时很容易无意中引入这种偏差,但却很难察觉。

回测会初始化所有时间戳(将整个数据帧加载到内存中),并一次性计算所有指标。这意味着如果你的指标或进出场信号引用了未来的 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.

注意

上述输出仅包含 lookahead-analysis 在常规回测命令基础上新增的选项。

简介

许多策略在程序员不知情的情况下陷入了前瞻偏差。这通常会使策略回测看起来非常盈利,甚至达到极端程度,但这并不现实,因为该策略实际上是在“作弊”,使用了实盘或模拟交易中无法获得的未来数据。

策略能够“作弊”的原因是,Freqtrade 的回测过程在开始时就填充了完整的数据帧,包括所有 K 线的时间戳。如果程序员不够谨慎,或者不了解系统内部的工作机制(而这一点有时确实很难察觉),那么策略就可能窥探到未来数据。

此命令旨在验证策略的有效性,特别是检测上述的前瞻偏差问题。

该命令如何工作?

它首先对所有交易对进行一次回测,以生成指标和进出场点的基准线。初始回测完成后,会检查是否满足 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:前视分析的结果。表示正常,表示存在问题。
  • total_signals:已检查的信号数量(默认为 20 个)
  • biased_entry_signals:在入场信号中发现偏差的数量
  • biased_exit_signals:在出场信号中发现偏差的数量
  • biased_indicators:显示在 populate_indicators 中定义的、存在偏差的指标本身

如果你的出场信号与有偏差的入场信号配对,可能会在 biased_exit_signals 中出现误报。然而,即使出场条件本身不产生偏差,一个有偏差的入场通常也会导致出场信号也被污染——特别是当入场和出场条件使用了相同的有偏差指标时。

应优先处理入场信号的偏差,然后再处理出场信号。

注意事项

  • 前视分析 只能验证它实际计算并触发过的交易。如果策略包含多种不同的信号或信号类型,你需要自行选择合适的参数,确保所有类型的信号至少触发过一次。未被触发的信号将不会被验证。
    这会导致假阴性结果,即策略会被错误地标记为无偏差。
  • 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 目标指标标记为有偏。
    这些指标并无偏差,可以安全忽略。