回测¶
本页说明如何使用回测功能验证策略表现。
回测需要历史数据支持。 如需获取感兴趣的交易对和交易所的数据,请查阅文档的数据下载章节。
回测功能也可在网页服务器模式下使用,允许您通过网页界面执行回测。
回测命令参考¶
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 将使用交易所的默认费率进行计算。
在回测中使用动态交易对列表
使用动态交易对列表是可行的(并非所有处理器都允许在回测模式下使用),但这依赖于当前市场状况——无法反映交易对列表的历史状态。 此外,当使用除静态交易对列表之外的其他列表时,无法保证回测结果的可重现性。 请查阅交易对列表文档获取更多信息。
To achieve reproducible results, best generate a pairlist via the test-pairlist command and use that as static pairlist.
Note
默认情况下,Freqtrade 会将回测结果导出至 user_data/backtest_results。
导出的交易记录可用于进一步分析,也可被脚本目录中的绘图子命令(freqtrade plot-dataframe)使用。
初始余额¶
回测需要初始余额,可通过 --dry-run-wallet <余额> 或 --starting-balance <余额> 命令行参数提供,或通过 dry_run_wallet 配置项设置。
该金额必须高于 stake_amount,否则机器人将无法模拟任何交易。
动态持仓金额¶
回测支持通过将 stake_amount 配置为 "unlimited" 来实现动态仓位金额,这将把起始资金分成 max_open_trades 等份。
早期交易的利润将导致后续更高的仓位金额,从而在回测期间实现利润复利效应。
回测命令示例¶
使用 5 分钟蜡烛线(OHLCV)数据(默认设置)
freqtrade backtesting --strategy AwesomeStrategy
其中 --strategy AwesomeStrategy / -s AwesomeStrategy 指代策略的类名,该类位于 user_data/strategies 目录下的 Python 文件中。
使用 1 分钟蜡烛线(OHLCV)数据
freqtrade backtesting --strategy AwesomeStrategy --timeframe 1m
提供 1000 的自定义起始资金(以标的货币计)
freqtrade backtesting --strategy AwesomeStrategy --dry-run-wallet 1000
使用不同的磁盘历史蜡烛线(OHLCV)数据源
假设您已从币安交易所下载历史数据并保存在 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
Note
仅当您希望尝试不同费用值时,才提供此选项(或相应的配置参数)。默认情况下,回测会从交易所交易对/市场信息中获取默认费用。
通过使用时间范围运行较小测试集的回测
使用 --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。
列 Avg Profit % 显示所有交易的平均利润率。
列 Tot Profit % 则显示相对于初始资金的总利润率。
在上述结果中,初始资金为 1000 USDT,绝对利润为 54.774 USDT - 因此 Tot Profit % 为 (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% │
└───────────────────────────────┴─────────────────────────────────┘
Backtesting from/Backtesting to: 回测时间范围(通常通过--timerange选项定义)。Trading Mode: 现货或期货交易模式。Max open trades:max_open_trades(或--max-open-trades)的设置值 - 或交易对列表中的交易对数量(取两者中较小值)。Total/Daily Avg Trades: 与回测输出表格中的总交易数相同 / 总交易数除以回测天数(这将提供关于策略预期交易频率的信息)。Starting balance: 初始余额 - 由模拟钱包(配置文件或命令行)给出。Final balance: 最终余额 - 初始余额 + 绝对利润。Absolute profit: 以标的货币计算的利润额。Total profit %: 总利润率。与第一个表格中TOTAL行的Tot Profit %对齐。计算公式为(最终资本 − 初始资本) / 初始资本。CAGR %: 年复合增长率。Sortino: 年化索提诺比率。Sharpe: 年化夏普比率。Calmar: 年化卡尔玛比率。SQN: 系统品质指标(SQN)- 由范·撒普提出。Profit factor: 所有盈利交易的总利润除以所有亏损交易的总亏损。Expectancy (Ratio): 期望比率,即每笔交易的平均盈亏。负期望比率意味着策略不盈利。Avg. daily profit: 日均利润,计算公式为(总利润 / 回测天数)。Avg. stake amount: 平均投入金额,可以是固定stake_amount或使用动态投入金额时的平均值。Total trade volume: 为实现上述利润在交易所产生的总交易量。Long / Short trades: 多头/空头交易数量拆分(仅当进行了空头交易时显示)。Long / Short profit %: 多头和空头交易的利润率(仅当进行了空头交易时显示)。Long / Short profit USDT: 多头和空头交易的标的货币利润(仅当进行了空头交易时显示)。Best Pair/Worst Pair: 表现最佳/最差的交易对(基于总利润率)及其对应的Tot Profit %。Best trade/Worst trade: 最大的单笔盈利交易和最大的单笔亏损交易。Best day/Worst day: 基于日利润的最佳和最差交易日。Days win/draw/lose: 盈利/持平/亏损的天数(持平通常指没有交易平仓的日期)。Min/Max/Avg. Duration Winners: 盈利交易的最小、最大和平均持仓时长。Min/Max/Avg. Duration Losers: 亏损交易的最小、最大和平均持仓时长。Max Consecutive Wins / Loss: 最大连续盈利/亏损次数。Rejected Entry signals: 由于达到max_open_trades限制而无法执行的交易入场信号。Entry/Exit Timeouts: 未成交的入场/出场订单(仅在使用自定义定价时适用)。Min balance/Max balance: 回测期间钱包余额的最低值和最高值。Max % of account underwater: 自模拟开始以来账户从峰值下跌的最大百分比。计算公式为(最高余额 - 当前余额) / (最高余额)的最大值。Absolute drawdown: 经历的最大绝对回撤,包括相对于账户的百分比,计算公式为(绝对回撤) / (回撤高点 + 初始余额)。Drawdown duration: 最大回撤期的持续时间。Profit at drawdown start/Profit at drawdown end: 最大回撤期开始和结束时的利润。Drawdown start/Drawdown end: 最大回撤的开始和结束时间(也可通过plot-dataframe子命令可视化)。Market change: 回测期间市场的整体变化。使用"收盘价"列计算所有交易对从第一根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 │
└────────────┴────────┴─────────────────┴───────────────┴────────────────────────┘
输出将展示选定周期内已实现绝对利润(以标的货币计)的表格,同时附带额外统计数据,例如交易笔数、盈利因子以及在该周期内已实现(平仓)的盈利、持平与亏损交易分布。
回测结果缓存¶
为节省时间,默认情况下当回测策略与配置与先前回测匹配时,系统将复用最近一天内的缓存结果。若需强制对完全相同的回测运行重新执行(忽略现有结果),请指定 --cache none 参数。
Warning
对于开放式时间范围(--timerange 20210101-),缓存功能会自动禁用,因为 freqtrade 无法确保底层数据未发生变化。若原始回测因末尾数据缺失(后通过下载更多数据修复)导致系统错误使用缓存结果,也可能引发问题。
此类情况下,请使用 --cache none 参数强制执行全新回测。
深入分析回测结果¶
为了进一步分析您的回测结果,freqtrade 默认会将交易记录导出到文件。 您随后可以加载这些交易记录进行更深入的分析,具体操作请参考数据分析回测章节。
此外,您可以使用 freqtrade 的网页服务器模式在网页界面中可视化回测结果。
该模式还支持加载已有的回测结果,因此您无需重新运行回测即可进行分析。
在此模式下,可使用 --notes "<notes>" 参数为回测结果添加注释,这些注释将在网页界面中显示。
回测输出文件¶
freqtrade 生成的输出文件为压缩包,包含以下文件:
- JSON 格式的回测报告
- Feather 格式的市场变动数据
- 策略文件副本
- 策略参数副本(若使用了参数文件)
- 经过脱敏处理的配置文件副本
这将确保结果的可复现性——前提是使用相同的数据。
压缩包中仅包含策略文件和配置文件,不包含任何依赖项。
回测的基本假设¶
由于回测无法获取蜡烛图内部的详细波动信息,需要基于以下假设进行:
- 回测中遵守交易限制
- 除非指定了自定义价格逻辑,否则入场以开盘价执行
- 只要价格在蜡烛线的高低范围内,所有订单均按请求价格成交(无滑点)
- 退出信号触发的平仓在下一根蜡烛线的开盘价执行
- 平仓会释放交易仓位,以便进行不同交易对的新交易
- 退出信号优先于止损,因为假定退出信号在蜡烛线开盘时触发
- ROI
- 退出价与最高价比较,但实际使用ROI值(例如ROI=2%,最高价涨幅=5%——则退出价按2%执行)
- 退出价永远不会"低于蜡烛线",因此2%的ROI可能在实际盈利2.4%时退出(如果最低价对应盈利2.4%)
- 在触发蜡烛线生效的ROI设置(例如1小时蜡烛线中
120: 0.02对应60: 0.05)将使用蜡烛线开盘价作为退出汇率 - 由
<N>=-1类ROI设置触发的强制退出使用最低价作为退出值,除非N值恰好在蜡烛线开盘时生效(例如1小时蜡烛线的120: -1)
- 止损平仓严格按止损价执行,即使最低价更低,但实际损失将比止损价高出
2 * 手续费 - 同一蜡烛线内止损评估优先于ROI。因此相比相同策略在模拟/实盘模式下的结果,回测中可能看到更多因
stoploss退出的交易 - 价格波动中最低价先于最高价出现,优先保障资金安全
- 移动止损
- 仅当移动止损低于蜡烛线最低价时进行调整(否则会触发止损)
- 在触发移动止损的入场蜡烛线上,采用"最小偏移量"(
stop_positive_offset)替代最高价作为计算基准。该规则不适用于自定义止损场景(因无法获取止损逻辑信息) - 最高价先出现——调整止损位
- 最低价使用调整后的止损位(确保高-低差价较大的退出能正确回测)
- ROI优先于移动止损生效,保证当ROI和移动止损同时适用时,利润以ROI为上限
- 退出原因不说明交易盈亏,仅表明触发退出的条件(使用负ROI值时可能看似异常)
- 评估顺序(同一蜡烛线出现多个信号时)
- 退出信号
- 止损
- ROI
- 移动止损
- 头寸反转(仅限期货)发生在平仓蜡烛线上出现与平仓交易方向相反的新入场信号时
基于这些假设,回测试图尽可能贴近真实交易。然而,回测永远无法替代在模拟运行模式下执行策略。 同时请牢记,过往表现并不能保证未来成功。
除上述假设外,策略作者应仔细阅读常见错误章节,以避免在回测中使用真实市场条件下不可用的数据。
回测中的交易限制¶
交易所设有特定交易限制,例如最小(和最大)基准货币量,或最小/最大质押(报价)货币量。 这些限制通常以"交易规则"或类似名称列在交易所文档中,且不同交易对之间的限制可能差异很大。
回测(以及实盘和模拟运行)确实会遵循这些限制,并确保止损设置可低于该值——因此实际值会略高于交易所规定的数值。 但 Freqtrade 并不掌握历史限制数据。
这可能导致使用历史价格时交易限制被放大,造成最小金额超过50美元的情况。
例如:
BTC 的最小交易量为 0.001。
BTC 今日交易价格为 22,000 美元(0.001 BTC 与此相关)——但回测期间包含高达 50,000 美元的价格。
当前的最小交易额将是 0.001 * 22_000——即 22 美元。
然而,在某些历史设定中,基于 0.001 * 50_000,限制也可能为 50 美元。
交易精度限制¶
大多数交易所对价格和数量都设置了精度限制,因此你无法交易 1.0020401 个交易对,或以 1.24567123123 的价格进行交易。
相反,这些价格和数量将根据交易所的定义,四舍五入或截断至指定的交易精度。
例如,上述数值可能被四舍五入为数量 1.002 和价格 1.24567。
这些精度值基于当前交易所的限制(如上文所述),因为历史精度限制不可用。
提升回测准确性¶
回测的一个主要局限是无法获知蜡烛图内部的价格走势(最高价出现在收盘前还是相反?)。 假设你使用 1 小时时间框架进行回测,该蜡烛图将有 4 个价格(开盘价、最高价、最低价、收盘价)。
虽然回测会对此做出一些假设(见上文)——但这永远无法完美,总会存在某种偏差。 为了缓解这一问题,freqtrade 可以使用更低(更快)的时间框架来模拟蜡烛图内部的价格变动。
要使用此功能,您可以在常规回测命令后附加 --timeframe-detail 5m。
freqtrade backtesting --strategy AwesomeStrategy --timeframe 1h --timeframe-detail 5m
这将加载选定时间范围内的1小时数据(主时间框架)以及5分钟数据(详细时间框架)。 策略将使用1小时时间框架进行分析。 可能发生交易活动的蜡烛(存在活跃信号、交易对处于持仓状态)将在5分钟时间框架下进行评估。 这将允许更精确地模拟蜡烛内价格变动——并可能导致不同的结果,尤其是在较高时间框架上。
入场通常仍会在主蜡烛开盘时发生,但空闲的交易槽位可能更早释放(如果在5分钟蜡烛上触发离场信号),这些槽位随后可用于其他交易对的新交易。
所有回调函数(custom_exit()、custom_stoploss()等)将在交易开启后为每个5分钟蜡烛运行(在上述1小时主时间框架和5分钟详细时间框架的示例中会运行12次)。
--timeframe-detail 必须小于原始时间框架,否则回测将无法启动。
显然这将需要更多内存(5分钟数据比1小时数据更大),同时也会影响运行时间(取决于交易数量和持仓时长)。 此外,必须确保数据已可用/已下载。
Tip
您可以将此功能作为策略开发的最后一步,以确保您的策略没有利用回测假设中的任何一条。在此模式下表现同样出色的策略,有很大概率在模拟/实盘模式中也能表现良好(尽管只有正向测试(模拟模式)才能真正确认策略的有效性)。
极端差异示例
在极端案例上使用 --timeframe-detail(以下所有货币对在10:00的K线均出现入场信号)可能导致以下回测交易序列(最大开仓数为1):
| Pair | Entry Time | Exit Time | Duration |
|---|---|---|---|
| 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 | 10m |
| XRP/USDT | 2024-01-01 10:15:00 | 2021-01-01 10:30:00 | 15m |
| SOL/USDT | 2024-01-01 10:15:00 | 2021-01-01 11:05:00 | 50m |
| BTC/USDT | 2024-01-01 11:05:00 | 2021-01-01 12:00:00 | 55m |
Without timeframe-detail, this would look like:
| Pair | Entry Time | Exit Time | Duration |
|---|---|---|---|
| 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 |
The difference is significant, as without detail data, only the first max_open_trades signals per candle are evaluated, and the trade slots are only freed at the end of the candle, allowing for a new trade to be opened at the next candle.
回测多个策略¶
要比较多个策略,可以向回测功能提供一个策略列表。
每次运行仅限于一个时间框架值。但数据仅从磁盘加载一次,因此如果您需要比较多个策略,这将显著提升运行效率。
所有列出的策略必须位于同一目录中,除非同时指定 --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 寻找最佳参数