前瞻性分析¶
本页解释了如何验证你的策略是否存在前瞻性偏差。
前瞻性偏差是任何策略的祸根,因为有时很容易引入这种偏差,但可能很难发现。
回测会初始化所有时间戳(将整个数据框加载到内存中)并一次性计算所有指标。 这意味着如果你的指标或入场/出场信号查看未来的蜡烛图,这将使你的回测结果失真。
lookahead-analysis
命令需要历史数据可用。
要了解如何获取你感兴趣的交易对和交易所的数据,
请查看文档的数据下载部分。
lookahead-analysis
也支持 freqai 策略。
该命令在内部链接回测并探测策略以触发前瞻性偏差。 这是通过不查看策略代码本身,而是通过比较完整回测中改变的指标值和移动的入场/出场点来实现的。
lookahead-analysis
可以使用回测的典型选项,但强制使用以下选项:
--cache
强制设置为 “none”。--max-open-trades
强制至少等于交易对数量。--dry-run-wallet
强制设置为基本无限(10亿)。--stake-amount
强制设置为静态 10000(1万)。--enable-protections
强制关闭。
这些设置是为了避免用户意外产生误报。
lookahead-analysis 命令参考¶
用法: 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]
[--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]
选项:
-h, --help 显示帮助信息并退出
-i TIMEFRAME, --timeframe TIMEFRAME
指定时间周期(`1m`, `5m`, `30m`, `1h`, `1d`)。
--timerange TIMERANGE
指定要使用的数据时间范围。
--data-format-ohlcv {json,jsongz,feather,parquet}
下载的蜡烛图(OHLCV)数据的存储格式。
(默认:`feather`)。
--max-open-trades INT
覆盖配置设置中的 `max_open_trades` 值。
--stake-amount STAKE_AMOUNT
覆盖配置设置中的 `stake_amount` 值。
--fee FLOAT 指定手续费比率。将在交易入场和出场时各应用一次。
-p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
限制命令仅处理这些交易对。交易对以空格分隔。
--enable-protections, --enableprotections
为回测启用保护措施。这将显著降低回测速度,但会包含已配置的保护措施。
--dry-run-wallet DRY_RUN_WALLET, --starting-balance DRY_RUN_WALLET
起始余额,用于回测/超参数优化和模拟运行。
--timeframe-detail TIMEFRAME_DETAIL
指定回测的详细时间周期(`1m`, `5m`, `30m`, `1h`, `1d`)。
--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]
提供要回测的策略列表,以空格分隔。请注意,时间周期需要在配置中或通过命令行设置。当与 `--export trades` 一起使用时,策略名称会被注入到文件名中(因此 `backtest-data.json` 变为 `backtest-data-SampleStrategy.json`)。
--export {none,trades,signals}
导出回测结果(默认:trades)。
--backtest-filename PATH, --export-filename PATH
使用此文件名作为回测结果。示例:
`--backtest-filename=backtest_results_2020-09-27_16-20-48.json`。
假设以 `user_data/backtest_results/` 或 `--export-directory` 作为基础目录。
--backtest-directory PATH, --export-directory PATH
用于回测结果的目录。示例:
`--export-directory=user_data/backtest_results/`。
--minimum-trade-amount INT
前瞻分析的最小交易金额。
--targeted-trade-amount INT
前瞻分析的目标交易金额。
--lookahead-analysis-exportfilename LOOKAHEAD_ANALYSIS_EXPORTFILENAME
使用此 CSV 文件名存储前瞻分析结果。
通用参数:
-v, --verbose 详细模式(-vv 获取更多信息,-vvv 获取所有消息)。
--no-color 禁用超参数优化结果的着色。在将输出重定向到文件时可能有用。
--logfile FILE, --log-file FILE
记录到指定的文件。特殊值包括:
'syslog', 'journald'。有关更多详细信息,请参阅文档。
-V, --version 显示程序版本号并退出
-c PATH, --config PATH
指定配置文件(默认:`userdir/config.json` 或 `config.json`,以存在的为准)。
可以使用多个 --config 选项。可以设置为 `-` 以从标准输入读取配置。
-d PATH, --datadir PATH, --data-dir PATH
交易所历史回测数据的基本目录路径。要查看期货数据,需要额外使用 trading-mode。
--userdir PATH, --user-data-dir PATH
用户数据目录的路径。
策略参数:
-s NAME, --strategy NAME
指定机器人使用的策略类名。
--strategy-path PATH 指定额外的策略查找路径。
--recursive-strategy-search
在策略文件夹中递归搜索策略。
--freqaimodel NAME 指定自定义的 freqaimodels。
--freqaimodel-path PATH
指定 freqaimodels 的额外查找路径。
介绍¶
许多策略在程序员不知情的情况下都陷入了前瞻性偏差的陷阱。这通常会使策略回测看起来有利可图,有时甚至达到极端程度,但这并不现实,因为策略通过查看在模拟或实盘模式下无法获得的数据来"作弊"。
策略可以"作弊"的原因是因为 freqtrade 回测过程在开始时就会填充完整的数据框,包括所有蜡烛图时间戳。如果程序员不够谨慎或不了解内部工作原理(有时这真的很难发现),那么策略就会看到未来的数据。
这个命令旨在尝试验证上述前瞻性偏差的有效性。
命令如何工作?¶
它首先会对所有交易对进行回测,为指标和入场/出场生成基准。在初始回测运行后,它会检查是否满足 minimum-trade-amount
,如果不满足则取消该策略的前瞻性分析。如果发生这种情况,请使用更宽的时间范围来获取更多交易进行分析,或使用发生更多交易的时间范围。
设置基准后,它将为每个入场和出场分别进行额外的回测运行。当这些验证回测完成后,它将比较信号蜡烛图(包括入场和出场)的指标并报告偏差。在所有信号都被验证或证伪后,将为用户生成一个结果表。
如何发现和消除偏差?如何挽救有偏差的策略?¶
如果你在网上发现了一个有偏差的策略,想要获得相同的结果,只是没有偏差,那么在大多数情况下你会失望。通常策略中的偏差是"好得难以置信"的利润的主要驱动因素。移除那些因偏差而推高利润的条件或指标通常会使策略显著变差。如果偏差指标或条件不是策略的核心,或者有其他不带有偏差的入场和出场信号,你可能能够部分挽救它。
前瞻性偏差的例子¶
shift(-10)
向前看 10 个蜡烛图。- 在 populate_* 函数中使用
iloc[]
访问数据框中的特定行。 - 如果不严格控制循环的数字,for 循环很容易引入前瞻性偏差。
- 聚合函数如
.mean()
、.min()
和.max()
,如果没有滚动窗口, 将在整个数据框上计算值,因此信号蜡烛图将"看到"包含未来蜡烛图的值。 一个无偏差的例子是使用rolling()
向后看蜡烛图: 例如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
槽位,并且在回测钱包配置中有足够的资金。- 在结果表中,
biased_indicators
列会错误地将set_freqai_targets()
中定义的 FreqAI 目标指标标记为有偏差。这些不是偏差,可以安全地忽略。