前瞻性分析¶
本页说明如何在前瞻性偏差方面验证您的策略。
前瞻性偏差是任何策略的祸根,因为有时很容易引入这种偏差,但可能很难检测到。
回测会初始化所有时间戳(将整个数据帧加载到内存中)并一次性计算所有指标。 这意味着如果您的指标或入场/出场信号查看未来的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 目标指标标记为有偏差。
这些指标实际无偏差,可安全忽略。