Skip to content

回测

本页说明如何使用回测功能验证策略表现。

回测需要历史数据支持。 如需获取感兴趣的交易对和交易所的数据,请查阅文档的数据下载章节。

回测功能也可在网页服务器模式下使用,允许您通过网页界面执行回测。

回测命令参考

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

其中 SampleStrategy1AwesomeStrategy 指代策略的类名。


禁止将交易记录导出到文件

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_roistop_loss 影响。

例如,如果您的 minimal_roi 仅为 "0": 0.01,则不能期望机器人获得超过 1% 的利润(因为它会在每笔交易达到 1% 时退出)。

"minimal_roi": {
    "0":  0.01
},

另一方面,如果你设置过高的 minimal_roi"0": 0.55(55%),机器人几乎不可能达到这个盈利水平。因此请记住,你的表现是策略所有不同要素、配置以及所设加密货币交易对的综合体现。

未平仓交易表

第二个表格包含所有在回测周期结束时被机器人强制平仓(force_exit)的交易,以便呈现完整情况。这是模拟真实行为的必要操作,因为回测周期总会在某个时间点结束,而实际上你可以让机器人无限期运行。这些交易已包含在第一个表格中,但为清晰起见也会在此表格中单独显示。

入场标签统计表

第三个表格按入场标签(如 enter_longenter_short)对交易进行细分,展示每个标签的入场次数、平均盈利百分比、标价货币总利润、总盈利百分比、平均持仓时长以及胜率、平局和亏损次数。

离场原因统计表

第四个表格汇总了离场原因(如 exit_signalroistop_lossforce_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,包含 Strategy001Strategy002 的结果。 还会有一个额外的表格比较不同策略的盈利/亏损情况(与第一个表格中的"总计"行相同)。 所有策略的详细输出将依次显示,请务必向上滚动查看每个策略的详细信息。

================================================== 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 寻找最佳参数