回测¶
本页说明如何通过使用回测来验证你的策略表现。
回测需要历史数据。要了解如何获取你感兴趣的交易对和交易所的数据,请前往文档中的 数据下载 部分。
回测也可在 Web 服务器模式 下使用,允许你通过网页界面运行回测。
回测命令参考¶
usage: freqtrade backtesting [-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 ...]] [--eps]
[--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]
[--breakdown {day,week,month,year} [{day,week,month,year} ...]]
[--cache {none,day,week,month}]
[--freqai-backtest-live-models] [--notes TEXT]
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.
--eps, --enable-position-stacking
Allow buying the same pair multiple times (position
stacking).
--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/`.
--breakdown {day,week,month,year} [{day,week,month,year} ...]
Show backtesting breakdown per [day, week, month,
year].
--cache {none,day,week,month}
Load a cached backtest result no older than specified
age (default: day).
--freqai-backtest-live-models
Run backtest with ready models.
--notes TEXT Add notes to the backtest 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.
使用回测测试你的策略¶
现在你已经有了良好的入场和出场策略以及一些历史数据,你希望用真实数据来测试它。这就是我们所说的 回测。
回测将默认使用配置文件中的加密货币(交易对),并从 user_data/data/<exchange> 加载历史 K 线(OHLCV)数据。如果指定交易所/交易对/时间周期组合没有可用数据,回测会提示你先使用 freqtrade download-data 命令下载数据。有关下载的详细信息,请参阅文档中的 数据下载 部分。
回测的结果将确认你的交易机器人盈利的概率是否高于亏损的概率。
所有利润计算均已包含手续费,Freqtrade 在计算时会使用交易所的默认手续费。
在回测中使用动态交易对列表
可以使用动态交易对列表(并非所有处理器都允许在回测模式下使用),但它依赖于当前市场状况,无法反映交易对列表的历史状态。此外,当使用除 StaticPairlist 以外的交易对列表时,无法保证回测结果的可复现性。请阅读 交易对列表文档 以获取更多信息。
为了获得可复现的结果,建议通过 test-pairlist 命令生成一个交易对列表,并将其作为静态交易对列表使用。
注意
默认情况下,Freqtrade 会将回测结果导出到 user_data/backtest_results 目录。导出的交易数据可用于进一步分析,或由脚本目录中的绘图子命令(freqtrade plot-dataframe)使用。
起始余额¶
回测需要一个起始余额,可以通过命令行参数 --dry-run-wallet <balance> 或 --starting-balance <balance> 提供,也可以通过配置项 dry_run_wallet 设置。该金额必须高于 stake_amount,否则机器人将无法模拟任何交易。
动态投注金额¶
通过将 stake_amount 配置为 "unlimited",回测支持动态投注金额,这会将起始余额划分为 max_open_trades 份。早期交易的利润将导致后续投注金额增加,从而在回测期间实现利润复利增长。
回测命令示例¶
使用 5 分钟 K 线(OHLCV)数据(默认)
freqtrade backtesting --strategy AwesomeStrategy
--strategy AwesomeStrategy / -s AwesomeStrategy 指的是策略的类名,该策略位于 user_data/strategies 目录下的 Python 文件中。
使用 1 分钟 K 线(OHLCV)数据
freqtrade backtesting --strategy AwesomeStrategy --timeframe 1m
提供自定义的起始余额 1000(以投注货币计)
freqtrade backtesting --strategy AwesomeStrategy --dry-run-wallet 1000
使用不同的本地历史 K 线(OHLCV)数据源
假设你从 Binance 交易所下载了历史数据,并将其保存在 user_data/data/binance-20180101 目录中。你可以按如下方式使用此数据进行回测:
freqtrade backtesting --strategy AwesomeStrategy --datadir user_data/data/binance-20180101
比较多个策略
freqtrade backtesting --strategy-list SampleStrategy1 AwesomeStrategy --timeframe 5m
SampleStrategy1 和 AwesomeStrategy 分别指策略的类名。
阻止将交易导出到文件
freqtrade backtesting --strategy backtesting --export none --config config.json
仅当你确定不再需要绘图或进一步分析结果时才使用此选项。
导出交易数据到指定的自定义目录
freqtrade backtesting --strategy backtesting --export trades --backtest-directory=user_data/custom-backtest-results
请同时阅读关于策略启动期的说明。
提供自定义手续费数值
有时你的账户享有一定的手续费返利(例如达到一定账户规模或月交易量后手续费降低),但这些信息 ccxt 无法获取。为了在回测中考虑这一点,你可以使用 --fee 命令行选项向回测提供该手续费值。该手续费应为比率形式,并将在每次交易进出时各应用一次。
例如,如果每笔订单的手续费为 0.1%(即以比率形式表示为 0.001),则你可以按以下方式运行回测:
freqtrade backtesting --fee 0.001
注意
仅当你想尝试不同的手续费数值时,才提供此选项(或相应的配置参数)。默认情况下,回测会从交易所的交易对/市场信息中获取默认手续费。
通过使用时间范围来使用较小的测试集运行回测
使用 --timerange 参数来调整你想使用的测试集数据量。
例如,使用 --timerange=20190501- 选项运行回测时,将使用从 2019 年 5 月 1日开始的所有可用输入数据。
freqtrade backtesting --timerange=20190501-
你也可以指定特定的日期范围。
完整的时间范围说明如下:
- 使用截至 2018/01/31 的数据:
--timerange=-20180131 - 使用从 2018/01/31 开始的数据:
--timerange=20180131- - 使用从 2018/01/31 到 2018/03/01 的数据:
--timerange=20180131-20180301 - 使用 POSIX / 时间戳 1527595200 到 1527618600 之间的数据:
--timerange=1527595200-1527618600
理解回测结果¶
回测中最重要的是理解其结果。
一次回测的结果可能如下所示:
BACKTESTING REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ LTC/USDT:USDT │ 16 │ 1.0 │ 56.176 │ 5.62 │ 16:16:00 │ 16 0 0 100 │
│ ETC/USDT:USDT │ 12 │ 0.72 │ 30.936 │ 3.09 │ 9:55:00 │ 11 0 1 91.7 │
│ ETH/USDT:USDT │ 8 │ 0.66 │ 17.864 │ 1.79 │ 1 day, 13:55:00 │ 7 0 1 87.5 │
│ XLM/USDT:USDT │ 10 │ 0.31 │ 11.054 │ 1.11 │ 12:08:00 │ 9 0 1 90.0 │
│ BTC/USDT:USDT │ 8 │ 0.21 │ 7.289 │ 0.73 │ 3 days, 1:24:00 │ 6 0 2 75.0 │
│ XRP/USDT:USDT │ 9 │ -0.14 │ -7.261 │ -0.73 │ 21:18:00 │ 8 0 1 88.9 │
│ DOT/USDT:USDT │ 6 │ -0.4 │ -9.187 │ -0.92 │ 5:35:00 │ 4 0 2 66.7 │
│ ADA/USDT:USDT │ 8 │ -1.76 │ -52.098 │ -5.21 │ 11:38:00 │ 6 0 2 75.0 │
│ TOTAL │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
LEFT OPEN TRADES REPORT
┏━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Pair ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ BTC/USDT:USDT │ 1 │ -4.14 │ -9.930 │ -0.99 │ 17 days, 8:00:00 │ 0 0 1 0 │
│ ETC/USDT:USDT │ 1 │ -4.24 │ -15.365 │ -1.54 │ 10:40:00 │ 0 0 1 0 │
│ DOT/USDT:USDT │ 1 │ -5.29 │ -19.125 │ -1.91 │ 11:30:00 │ 0 0 1 0 │
│ TOTAL │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
└───────────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────────┴────────────────────────┘
ENTER TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Entries ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ OTHER │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
│ TOTAL │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┘
EXIT REASON STATS
┏━━━━━━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Exit Reason ┃ Exits ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ roi │ 67 │ 1.05 │ 242.179 │ 24.22 │ 15:49:00 │ 67 0 0 100 │
│ exit_signal │ 4 │ -2.23 │ -31.217 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ force_exit │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ stop_loss │ 3 │ -10.14 │ -111.768 │ -11.18 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└─────────────┴───────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
MIXED TAG STATS
┏━━━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Enter Tag ┃ Exit Reason ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ │ roi │ 67 │ 1.05 │ 242.179 │ 24.22 │ 15:49:00 │ 67 0 0 100 │
│ │ exit_signal │ 4 │ -2.23 │ -31.217 │ -3.12 │ 1 day, 8:38:00 │ 0 0 4 0 │
│ │ force_exit │ 3 │ -4.56 │ -44.420 │ -4.44 │ 6 days, 2:03:00 │ 0 0 3 0 │
│ │ stop_loss │ 3 │ -10.14 │ -111.768 │ -11.18 │ 1 day, 3:05:00 │ 0 0 3 0 │
│ TOTAL │ │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
└───────────┴─────────────┴────────┴──────────────┴─────────────────┴──────────────┴─────────────────┴────────────────────────┘
SUMMARY METRICS
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00 │
│ Backtesting to │ 2025-08-01 00:00:00 │
│ Trading Mode │ Isolated Futures │
│ Max open trades │ 3 │
│ │ │
│ Total/Daily Avg Trades │ 77 / 2.48 │
│ Starting balance │ 1000 USDT │
│ Final balance │ 1054.774 USDT │
│ Absolute profit │ 54.774 USDT │
│ Total profit % │ 5.48% │
│ CAGR % │ 87.36% │
│ Sortino │ 2.48 │
│ Sharpe │ 3.75 │
│ Calmar │ 40.99 │
│ SQN │ 0.69 │
│ Profit factor │ 1.29 │
│ Expectancy (Ratio) │ 0.71 (0.04) │
│ Avg. daily profit │ 1.767 USDT │
│ Avg. stake amount │ 345.016 USDT │
│ Total trade volume │ 53316.954 USDT │
│ │ │
│ Long / Short trades │ 67 / 10 │
│ Long / Short profit % │ 8.94% / -3.47% │
│ Long / Short profit USDT │ 89.425 / -34.651 │
│ │ │
│ Best Pair │ LTC/USDT:USDT 5.62% │
│ Worst Pair │ ADA/USDT:USDT -5.21% │
│ Best trade │ ETC/USDT:USDT 2.00% │
│ Worst trade │ ADA/USDT:USDT -10.17% │
│ Best day │ 26.91 USDT │
│ Worst day │ -47.741 USDT │
│ Days win/draw/lose │ 20 / 6 / 5 │
│ Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:49 │
│ Min/Max/Avg. Duration Losers │ 0d 10:40 / 17d 08:00 / 2d 17:00 │
│ Max Consecutive Wins / Loss │ 36 / 3 │
│ Rejected Entry signals │ 258 │
│ Entry/Exit Timeouts │ 0 / 0 │
│ │ │
│ Min balance │ 1003.168 USDT │
│ Max balance │ 1149.421 USDT │
│ Max % of account underwater │ 8.23% │
│ Absolute drawdown │ 94.647 USDT (8.23%) │
│ Drawdown duration │ 9 days 08:50:00 │
│ Profit at drawdown start │ 149.421 USDT │
│ Profit at drawdown end │ 54.774 USDT │
│ Drawdown start │ 2025-07-22 15:10:00 │
│ Drawdown end │ 2025-08-01 00:00:00 │
│ Market change │ 30.51% │
└───────────────────────────────┴─────────────────────────────────┘
Backtested 2025-07-01 00:00:00 -> 2025-08-01 00:00:00 | Max open trades : 3
STRATEGY SUMMARY
┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━┓
┃ Strategy ┃ Trades ┃ Avg Profit % ┃ Tot Profit USDT ┃ Tot Profit % ┃ Avg Duration ┃ Win Draw Loss Win% ┃ Drawdown ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━┩
│ SampleStrategy │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │ 94.647 USDT 8.23% │
└────────────────┴────────┴──────────────┴─────────────────┴──────────────┴──────────────┴────────────────────────┴────────────────────┘
回测报告表格¶
第一个表格包含机器人执行的所有交易,包括“未平仓的交易”。
最后一行将显示你的策略的整体表现,例如:
│ TOTAL │ 77 │ 0.22 │ 54.774 │ 5.48 │ 22:12:00 │ 67 0 10 87.0 │
该机器人共执行了 77 笔交易,平均每笔交易持续 22:12:00,收益率为 5.48%(盈利),这意味着在初始资金为 1000 USDT 的情况下,总共盈利 54.774 USDT。
列 平均盈利 % 显示所有交易的平均盈利。列 总盈利 % 则表示相对于初始资金的总盈利百分比。
在上述结果中,我们的初始资金为 1000 USDT,绝对盈利为 54.774 USDT — 因此 总盈利 % 为 (54.774 / 1000) * 100 ~= 5.48%。
你的策略表现受入场策略、出场策略,以及你设置的 minimal_roi 和 stop_loss 的影响。
例如,如果你的 minimal_roi 只有 "0": 0.01,那么你不能期望机器人盈利超过 1%(因为它会在每笔交易达到 1% 时立即退出)。
"minimal_roi": {
"0": 0.01
},
另一方面,如果你将 minimal_roi 设置得过高,比如 "0": 0.55(55%),那么机器人几乎不可能达到这一盈利目标。因此,请记住,你的策略表现是策略各个组成部分、配置以及所选加密货币交易对共同作用的结果。
未平仓交易表格¶
第二个表格列出了在回测结束时机器人被迫 force_exit 的所有交易,以便向你展示完整的画面。这是为了模拟真实行为,因为回测必须在某个时间点结束,而现实中你可以让机器人无限运行下去。这些交易也包含在第一个表格中,但为了清晰起见,此处单独列出。
入场标签统计表格¶
第三个表格按交易的进入标签(例如 enter_long、enter_short)进行分类,显示每个标签的交易次数、平均利润率、以投注货币计算的总利润、总利润率、平均持仓时间,以及盈利、持平和亏损的交易数量。
退出原因统计表¶
第四个表格汇总了退出原因(例如 exit_signal、roi、stop_loss、force_exit)。该表格可以帮助你识别哪些方面需要改进(例如,如果大量 exit_signal 退出的交易是亏损的,则应优化退出信号或考虑禁用它)。
混合标签统计表¶
第五个表格将进入标签与退出原因结合起来,详细展示不同进入标签在特定退出原因下的表现。这有助于识别哪些进出策略组合最为有效。
汇总指标¶
回测报告的最后一部分是汇总指标表格,其中包含策略在回测数据上的关键性能指标。
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Metric ┃ Value ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ Backtesting from │ 2025-07-01 00:00:00 │
│ Backtesting to │ 2025-08-01 00:00:00 │
│ Trading Mode │ Isolated Futures │
│ Max open trades │ 3 │
│ │ │
│ Total/Daily Avg Trades │ 72 / 2.32 │
│ Starting balance │ 1000 USDT │
│ Final balance │ 1106.734 USDT │
│ Absolute profit │ 106.734 USDT │
│ Total profit % │ 10.67% │
│ CAGR % │ 230.04% │
│ Sortino │ 4.99 │
│ Sharpe │ 8.00 │
│ Calmar │ 77.76 │
│ SQN │ 1.52 │
│ Profit factor │ 1.79 │
│ Expectancy (Ratio) │ 1.48 (0.07) │
│ Avg. daily profit │ 3.443 USDT │
│ Avg. stake amount │ 363.133 USDT │
│ Total trade volume │ 52466.174 USDT │
│ │ │
│ Best Pair │ LTC/USDT:USDT 4.48% │
│ Worst Pair │ ADA/USDT:USDT -1.78% │
│ Best trade │ ETC/USDT:USDT 2.00% │
│ Worst trade │ ADA/USDT:USDT -10.17% │
│ Best day │ 23.535 USDT │
│ Worst day │ -49.813 USDT │
│ Days win/draw/lose │ 21 / 6 / 4 │
│ Min/Max/Avg. Duration Winners │ 0d 00:35 / 5d 18:15 / 0d 15:30 │
│ Min/Max/Avg. Duration Losers │ 0d 12:00 / 17d 08:00 / 3d 23:28 │
│ Max Consecutive Wins / Loss │ 58 / 4 │
│ Rejected Entry signals │ 254 │
│ Entry/Exit Timeouts │ 0 / 0 │
│ │ │
│ Min balance │ 1003.168 USDT │
│ Max balance │ 1209 USDT │
│ Max % of account underwater │ 8.46% │
│ Absolute drawdown │ 102.266 USDT (8.46%) │
│ Drawdown duration │ 9 days 08:50:00 │
│ Profit at drawdown start │ 209 USDT │
│ Profit at drawdown end │ 106.734 USDT │
│ Drawdown start │ 2025-07-22 15:10:00 │
│ Drawdown end │ 2025-08-01 00:00:00 │
│ Market change │ 30.51% │
└───────────────────────────────┴─────────────────────────────────┘
回测起始/回测结束:回测的时间范围(通常由--timerange选项定义)。交易模式:现货或期货交易。最大同时开仓数:max_open_trades设置值(或--max-open-trades),取该值与交易对列表中交易对数量的较小者。总交易数/日均交易数:与回测输出表中的总交易数相同 / 总交易数除以回测天数(可帮助预估该策略的交易频率)。初始余额:起始资金,来自 dry-run-wallet 设置(配置文件或命令行参数)。最终余额:最终资金,等于初始余额加上绝对利润。绝对利润:以投注货币计算的利润。总利润率 %:总利润率。与第一个表格中TOTAL行的Tot Profit %一致。计算公式为:(最终资金 − 初始资金) / 初始资金。CAGR %:年均复合增长率。索提诺比率 (Sortino):年化索提诺比率。夏普比率 (Sharpe):年化夏普比率。卡尔玛比率 (Calmar):年化卡尔玛比率。SQN:系统质量数值(SQN),由 Van Tharp 提出。利润因子:所有盈利交易的利润总和除以所有亏损交易的损失总和。期望值(比率):每笔交易的平均盈亏比率。若期望值为负,说明该策略不盈利。日均利润:每日平均利润,计算公式为总利润 / 回测天数。平均投注金额:平均投注金额,可能是固定的stake_amount,或使用动态投注金额时的平均值。总交易量:为实现上述利润在交易所产生的交易量。多头 / 空头交易:多头与空头交易数量的分布(仅在存在空头交易时显示)。多头 / 空头利润率:多头和空头交易的利润率(仅在存在空头交易时显示)。多头/空头利润 USDT:以质押货币计算的多头和空头交易利润(仅当存在空头交易时显示)。最佳交易对/最差交易对:表现最好和最差的交易对(基于总利润百分比),及其对应的总利润%。最佳交易/最差交易:单笔盈利最多的交易和单笔亏损最多的交易。最佳日期/最差日期:基于每日利润表现最好和最差的一天。盈利/平盘/亏损天数:盈利天数与亏损天数(平盘通常指无已平仓交易的天数)。胜率交易最短/最长/平均持仓时间:盈利交易的最短、最长及平均持仓时间。亏损交易最短/最长/平均持仓时间:亏损交易的最短、最长及平均持仓时间。最大连续盈利/亏损次数:连续盈利或连续亏损的最大次数。被拒绝的入场信号:由于已达max_open_trades上限而未能执行的交易入场信号。入场/出场超时:未成交的入场/出场委托(仅在使用自定义定价时适用)。最低余额/最高余额:回测期间钱包余额的最低值和最高值。账户最大回撤百分比:自模拟开始以来,账户从峰值下降的最大百分比。计算方式为:(最高余额 - 当前余额) / 最高余额的最大值。绝对回撤:经历的最大绝对回撤金额,包含相对于账户的百分比,计算公式为:绝对回撤 / (回撤高点 + 起始资金)。回撤持续时间:最长回撤期的持续时间。回撤开始时的利润/回撤结束时的利润:最长回撤期开始和结束时的利润。回撤开始时间/回撤结束时间:最长回撤期的起止时间(也可通过plot-dataframe子命令进行可视化)。市场变化:回测期间市场的整体变化。计算方式为所有交易对从第一根 K 线到最后一个 K 线“收盘价”的变化率的平均值。
日度 / 周度 / 月度 / 年度统计¶
可通过使用--breakdown <>参数来查看日度、周度、月度或年度的结果概览。
要可视化月度和年度统计结果,可使用以下方法:
freqtrade backtesting --strategy MyAwesomeStrategy --breakdown month year
MONTH BREAKDOWN
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Month ┃ Trades ┃ Tot Profit USDT ┃ Profit Factor ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 31/01/2020 │ 12 │ 44.451 │ 7.28 │ 10 0 2 83.3 │
│ 29/02/2020 │ 30 │ 45.41 │ 2.36 │ 17 0 13 56.7 │
│ 31/03/2020 │ 35 │ 142.024 │ 2.42 │ 14 0 21 40.0 │
│ 30/04/2020 │ 67 │ -23.692 │ 0.81 │ 24 0 43 35.8 │
...
...
│ 30/04/2025 │ 203 │ -63.43 │ 0.81 │ 73 0 130 36.0 │
│ 31/05/2025 │ 142 │ 104.675 │ 1.28 │ 59 0 83 41.5 │
│ 30/06/2025 │ 177 │ -1.014 │ 1.0 │ 85 0 92 48.0 │
│ 31/07/2025 │ 155 │ 232.762 │ 1.6 │ 63 0 92 40.6 │
└────────────┴────────┴─────────────────┴───────────────┴────────────────────────┘
YEAR BREAKDOWN
┏━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ Year ┃ Trades ┃ Tot Profit USDT ┃ Profit Factor ┃ Win Draw Loss Win% ┃
┡━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 31/12/2020 │ 896 │ 868.889 │ 1.46 │ 351 0 545 39.2 │
│ 31/12/2021 │ 1778 │ 4487.163 │ 1.93 │ 745 0 1033 41.9 │
│ 31/12/2022 │ 1736 │ 938.27 │ 1.27 │ 698 0 1038 40.2 │
│ 31/12/2023 │ 1712 │ 1677.126 │ 1.68 │ 670 0 1042 39.1 │
│ 31/12/2024 │ 1609 │ 3198.424 │ 2.22 │ 773 0 836 48.0 │
│ 31/12/2025 │ 1042 │ 716.174 │ 1.33 │ 420 0 622 40.3 │
└────────────┴────────┴─────────────────┴───────────────┴────────────────────────┘
输出将显示所选时间段内实现的绝对利润(以质押货币计)表格,以及额外的统计数据,如交易数量、盈利因子,以及该时间段内实现(已平仓)的盈利、平盘和亏损交易的分布情况。
回测结果缓存¶
为了节省时间,默认情况下,如果当前策略和配置与过去 24 小时内某次回测相同,则回测将重用缓存的结果。若希望强制重新运行回测(即使已有相同设置的结果),请指定--cache none参数。
警告
对于开放式的日期范围(--timerange 20210101-),缓存会自动禁用,因为 freqtrade 无法确保底层数据未发生变化。如果原始回测在末尾缺少数据,而后续通过下载更多数据进行了修复,则缓存可能会在不应使用时被误用。此时,请使用一次 --cache none 来强制进行全新的回测。
进一步分析回测结果¶
为了进一步分析您的回测结果,freqtrade 默认会将交易记录导出到文件中。然后您可以加载这些交易记录以进行进一步分析,具体方法请参见数据分析回测章节。
此外,您还可以将 freqtrade 以Web 服务器模式运行,通过网页界面可视化回测结果。此模式还允许您加载现有的回测结果,从而无需重新运行回测即可进行分析。
在此模式下,可以使用 --notes "<notes>" 为回测结果添加备注,这些备注将在网页界面中显示。
回测输出文件¶
freqtrade 生成的输出文件是一个 ZIP 压缩包,其中包含以下文件:
- 以 JSON 格式保存的回测报告
- 以 feather 格式保存的市场变动数据
- 策略文件的副本
- 策略参数的副本(如果使用了参数文件)
- 经过清理的配置文件副本
这将确保结果可复现——前提是使用相同的数据。
ZIP 文件中仅包含策略文件和配置文件,不包括任何外部依赖项。
回测所作的假设¶
由于回测缺乏关于蜡烛图内部发生情况的详细信息,因此需要做出一些假设:
- 遵守交易所的交易限制
- 入场发生在开盘价,除非已指定自定义价格逻辑
- 只要价格在蜡烛图的最高价/最低价范围内,所有订单都会按请求价格成交(无滑点)
- 卖出信号的出场发生在下一根蜡烛图的开盘价
- 卖出信号释放交易仓位,允许不同交易对的新交易进入
- 卖出信号优先于止损,因为卖出信号假定在蜡烛图开盘时触发
- ROI
- 出场与最高价比较——但使用的是 ROI 设定值(例如 ROI = 2%,最高价=5% —— 那么出场价格为 2%)
- 出场价格不会“低于蜡烛图”,因此若 ROI 为 2% 而最低利润为 2.4%,则实际出场价格可能是 2.4%
- 在触发蜡烛图生效的 ROI 条目(例如 1 小时蜡烛图的
120: 0.02,来自60: 0.05)将使用该蜡烛图的开盘价作为出场价格 - 由
<N>=-1的 ROI 条目引起的强制出场使用最低价作为出场值,除非 N 正好落在蜡烛图开盘时(例如 1 小时蜡烛图的120: -1)
- 止损出场精确发生在止损价格,即使最低价更低,但损失将比止损价格高出
2 * 手续费 - 在同一根蜡烛图内,止损的评估优先于 ROI。因此,您经常会看到更多以
stoploss作为退出原因的交易,相比在模拟运行/实盘交易模式下使用相同策略得到的结果。 - 对于止损,最低价先于最高价发生,以优先保护资金
- 移动止损(Trailing stoploss)
- 只有当移动止损低于蜡烛图的最低价时才会调整(否则会被触发)
- 对于触发移动止损的入场 K 线,采用“最小偏移量”(
stop_positive_offset)作为基准点(而非最高价),并从此点计算止损。此规则不适用于自定义止损场景,因为无法获取其止损逻辑信息。 - 先发生最高价——此时调整止损位
- 再出现最低价——使用已调整的止损位(从而在高低差较大的情况下也能正确回测退出)
- ROI 在移动止损之前生效,确保当 ROI 和移动止损同时满足时,收益以 ROI 设定的上限为准
- 退出原因并不能说明交易是盈利还是亏损,仅表示是什么触发了退出(如果使用负的 ROI 值,这可能看起来有些奇怪)
- 评估顺序(如果同一根 K 线上出现多个信号)
- 退出信号
- 止损
- ROI
- 移动止损
- 持仓反向操作(仅限期货):当现有交易平仓的 K 线上,出现了相反方向的新建仓信号时,将执行反向开仓。
基于这些假设,回测会尽可能贴近真实交易情况。然而,回测永远无法替代模拟实盘运行策略的效果。同时请记住,过去的表现并不能保证未来的成功。
除了上述假设外,策略编写者还应仔细阅读常见错误部分,避免在回测中使用现实中无法获取的数据。
回测中的交易限额¶
交易所通常设有某些交易限制,例如基础货币的最小(或最大)交易量,或报价货币(即投入资金)的最小/最大金额。这些限制通常在交易所文档中以“交易规则”等形式列出,并且不同交易对之间可能存在显著差异。
回测(以及实盘和模拟运行)都会遵守这些限制,并确保可以在此数值下方设置止损单,因此该值会略高于交易所标明的最低限额。但 Freqtrade 并没有历史交易限制的相关数据。
这可能导致在使用历史价格进行回测时,交易限额被高估,从而导致最低交易金额超过 50 美元。
例如:
BTC 的最小可交易数量为 0.001。当前 BTC 价格为 22,000 美元(0.001 BTC 对应此金额)——但回测周期内曾包含高达 50,000 美元的历史价格。按当前价格计算,最低交易额为 0.001 * 22_000 = 22 美元。
但在某些历史设定下,该限额也可能是 50 美元,即基于 0.001 * 50_000 计算得出。
交易精度限制¶
大多数交易所对价格和交易数量都有精度限制,因此你不能以 1.0020401 的数量买入某个交易对,也不能以 1.24567123123 的价格成交。
相反,这些价格和数量将根据交易所的规定被四舍五入或截断至规定的交易精度。例如,上述数值可能会被处理为数量 1.002 和价格 1.24567。
这些精度值基于当前交易所的限制(如上文所述),因为历史精度限制数据不可用。
提高回测准确性¶
回测的一大局限在于无法知晓 K 线内的价格变动顺序(比如最高价是在收盘前还是之后出现?)。因此,假设你使用 1 小时时间框架进行回测,每根 K 线将包含四个价格(开盘价、最高价、最低价、收盘价)。
尽管回测确实需要做一些假设(见上文),但这些假设不可能完美,总会以某种方式产生偏差。为了缓解这一问题,freqtrade 可以使用更小(更快)的时间周期来模拟 K 线内的价格波动。
要使用此功能,可以在常规的回测命令后添加 --timeframe-detail 5m。
freqtrade backtesting --strategy AwesomeStrategy --timeframe 1h --timeframe-detail 5m
这将为所选时间段加载 1 小时数据(主时间周期)以及 5 分钟数据(详细时间周期)。策略仍基于 1 小时时间周期进行分析。但对于可能发生交易活动的 K 线(存在有效信号,或该交易对正处于交易中),会进一步使用 5 分钟时间周期进行评估。这将实现对 K 线内价格变动更精确的模拟,并可能导致不同的结果,尤其是在较高时间周期上。
通常情况下,入场仍会发生在主 K 线的开盘时刻,但如果在 5 分钟 K 线上触发了退出信号,则交易仓位可能更早释放,从而为其他交易对的新交易腾出空间。
所有回调函数(如 custom_exit()、custom_stoploss() 等)在交易开启后,将针对每个 5 分钟 K 线运行一次(在上述 1 小时主周期与 5 分钟细节周期的例子中,每根主 K 线会运行 12 次)。
--timeframe-detail 必须小于原始时间周期,否则回测将无法启动。
显然,这将需要更多内存(5 分钟数据比 1 小时数据更大),并会影响运行时间(取决于交易数量和持仓时长)。此外,相关数据必须已存在或已下载。
提示
你可以在策略开发的最后阶段使用此功能,以确保你的策略没有过度依赖某一回测假设。在此模式下表现依然稳定的策略,有很大可能在模拟盘/实盘中也表现良好(尽管只有前向测试(模拟模式)才能真正验证一个策略的有效性)。
极端差异示例
在一个极端示例中使用 --timeframe-detail(所有交易对都在 10:00 的 K 线出现入场信号),在最大同时开仓数为 1 的情况下,可能产生如下回测交易序列:
| 交易对 | 入场时间 | 出场时间 | 持续时间 |
|---|---|---|---|
| BTC/USDT | 2024-01-01 10:00:00 | 2021-01-01 10:05:00 | 5m |
| ETH/USDT | 2024-01-01 10:05:00 | 2021-01-01 10:15:00 | 10 分钟 |
| XRP/USDT | 2024-01-01 10:15:00 | 2021-01-01 10:30:00 | 15 分钟 |
| SOL/USDT | 2024-01-01 10:15:00 | 2021-01-01 11:05:00 | 50 分钟 |
| BTC/USDT | 2024-01-01 11:05:00 | 2021-01-01 12:00:00 | 55 分钟 |
如果没有时间框架细节,结果将如下所示:
| 交易对 | 入场时间 | 出场时间 | 持续时间 |
|---|---|---|---|
| BTC/USDT | 2024-01-01 10:00:00 | 2021-01-01 11:00:00 | 1h |
| BTC/USDT | 2024-01-01 11:00:00 | 2021-01-01 12:00:00 | 1h |
这一差异非常显著。因为在没有详细数据的情况下,每个 K 线仅会评估前 max_open_trades 个信号,并且交易仓位只有在 K 线结束时才会释放,从而允许在下一个 K 线开始时开新交易。
回测多个策略¶
为了比较多个策略,可以向回测功能提供一个策略列表。
每次运行仅支持一个时间框架值。但数据只需从磁盘加载一次,因此如果你有多个想要比较的策略,这将显著提升运行速度。
所有列出的策略必须位于同一目录下,除非同时指定了 --recursive-strategy-search 参数,此时策略目录下的子目录也会被纳入搜索范围。
freqtrade backtesting --timerange 20180401-20180410 --timeframe 5m --strategy-list Strategy001 Strategy002 --export trades
结果将保存到 user_data/backtest_results/backtest-result-<datetime>.json 文件中,包含 Strategy001 和 Strategy002 的回测结果。此外还会生成一个表格,用于比较不同策略的盈亏情况(与第一个表格中的“总计”行相同)。所有策略的详细输出将依次显示,请向上滚动以查看每个策略的具体信息。
================================================== STRATEGY SUMMARY ===================================================================
| Strategy | Trades | Avg Profit % | Tot Profit BTC | Tot Profit % | Avg Duration | Wins | Draws | Losses | Drawdown % |
|-------------+---------+----------------+------------------+----------------+----------------+-------+--------+--------+------------|
| Strategy1 | 429 | 0.36 | 0.00762792 | 76.20 | 4:12:00 | 186 | 0 | 243 | 45.2 |
| Strategy2 | 1487 | -0.13 | -0.00988917 | -98.79 | 4:43:00 | 662 | 0 | 825 | 241.68 |
下一步¶
很好,你的策略是盈利的。但如果机器人能为你提供该策略的最佳参数呢?你的下一步是学习如何使用 Hyperopt 寻找最优参数