Skip to article frontmatterSkip to article content
回测指南

回测

策略回测和性能验证

回测(Backtesting)

本页将介绍如何通过回测验证你的策略表现。

回测需要有历史数据。

如何获取你关注的交易对和交易所的数据,请参阅文档的数据下载部分。

回测命令参考

用法: 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]
                             [--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]

选项:
  -h, --help            显示帮助信息并退出
  -i TIMEFRAME, --timeframe TIMEFRAME
                        指定时间框架 (`1m`, `5m`, `30m`, `1h`, `1d`)。
  --timerange TIMERANGE
                        指定要使用的数据时间范围。
  --data-format-ohlcv {json,jsongz,feather,parquet}
                        下载的K线(OHLCV)数据的存储格式。
                        (默认:`feather`)。
  --max-open-trades INT
                        覆盖配置设置中的 `max_open_trades` 值。
  --stake-amount STAKE_AMOUNT
                        覆盖配置设置中的 `stake_amount` 值。
  --fee FLOAT           指定手续费比率。将应用两次(在交易进入和退出时)。
  -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
                        限制命令仅用于这些交易对。交易对之间用空格分隔。
  --eps, --enable-position-stacking
                        允许多次购买同一交易对(仓位叠加)。
  --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/`。
  --breakdown {day,week,month,year} [{day,week,month,year} ...]
                        显示按[日、周、月、年]的回测明细。
  --cache {none,day,week,month}
                        加载不超过指定时间的缓存回测结果(默认:day)。
  --freqai-backtest-live-models
                        使用已准备好的模型运行回测。

通用参数:
  -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 指定额外的查找路径。

用回测测试你的策略

现在你已经有了完善的入场和出场策略,并准备了一些历史数据,你就可以用真实数据来测试它了。这就是我们所说的回测

回测会使用你配置文件中的加密货币(交易对),并默认从 user_data/data/<exchange> 加载历史K线(OHLCV)数据。

如果没有该交易所/交易对/周期的数据,回测会提示你先用 freqtrade download-data 下载。详情请参阅数据下载部分。

回测结果可以帮助你判断机器人获利的概率是否大于亏损。

所有收益计算都包含手续费,freqtrade 会用交易所的默认手续费进行计算。

起始余额

回测需要一个起始余额,可通过命令行参数 --dry-run-wallet <余额>--starting-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(以 stake 货币计)

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

其中 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

用 timerange 缩小测试集

--timerange 参数可指定测试集时间范围。

如用 --timerange=20190501-,则从 2019 年 5 月 1 日起用所有可用数据:

freqtrade backtesting --timerange=20190501-

也可指定具体日期区间。

完整 timerange 语法:

理解回测结果

回测最重要的是理解结果。

回测结果大致如下:

                                                 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 仅为:

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

则每次盈利 1% 就会平仓,无法获得更高收益。

反之,若 minimal_roi 过高,如 "0": 0.55(55%),几乎不可能达到。 因此,策略表现是多种因素的综合结果,包括配置和交易对选择。

未平仓交易表

第二张表为回测期结束时被"强制平仓"的所有交易,便于完整展示。 这些交易也包含在第一张表中,但单独列出便于分析。

进入标签统计表

第三个表格提供按进入标签(例如 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%                          │
└───────────────────────────────┴─────────────────────────────────┘

日/周/月/年分解

可用 --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 参数。

进一步分析回测结果

freqtrade 默认会导出交易到文件,便于后续分析。 你可以用 pandas 加载这些交易,具体见数据分析部分。

回测输出文件

freqtrade 生成的输出文件为 zip 包,包含:

这样可保证结果可复现(前提是数据一致)。

仅包含策略和配置文件,不包含依赖。

回测的假设

由于回测无法获知K线内的详细价格变化,因此需做如下假设:

基于上述假设,回测尽量贴近真实交易。但回测永远无法替代 dry-run。 请牢记,历史表现不代表未来。

此外,策略作者应仔细阅读开发策略时的常见错误部分,避免回测用到实际不可用的数据。

回测中的交易限制

交易所有最小/最大下单量、最小/最大持仓金额等限制,通常在交易所文档"交易规则"部分列出,不同交易对差异很大。

回测(以及实盘和 dry-run)会遵守这些限制,并确保止损价低于最小下单金额,因此实际下单金额会略高于交易所要求。 但 freqtrade 无法获知历史限制。

这可能导致用历史价格计算的最小下单金额被高估(如历史高价时),出现最小金额 > 50 美元的情况。

例如:

BTC 最小可交易量为 0.001。 BTC 当前价格 22,000 美元(0.001 BTC = 22 美元),但回测区间内最高价为 50,000 美元。 此时最小金额可能为 0.001 * 50_000 = 50 美元。

交易精度限制

大多数交易所对价格和数量有精度限制,不能买 1.0020401 个,或以 1.24567123123 的价格成交。 实际会按交易所定义四舍五入或截断,如数量 1.002,价格 1.24567。

这些精度值基于当前交易所限制(如上文所述),历史精度不可用。

提高回测精度

回测最大局限是无法获知K线内价格变化(高点先于收盘还是反之?)。 假设用 1 小时K线回测,则每根K线有 4 个价格(开、高、低、收)。

虽然回测会做一些假设(见上文),但永远无法完美,始终有偏差。 为缓解此问题,freqtrade 支持用更小周期模拟K线内波动。

只需在回测命令后加 --timeframe-detail 5m

freqtrade backtesting --strategy AwesomeStrategy 
    --timeframe 1h --timeframe-detail 5m

这会加载 1 小时主周期和 5 分钟细节周期的数据。 策略分析仍用 1 小时周期。 但有信号或持仓时,会用 5 分钟周期分析细节。 这样能更准确模拟K线内波动,尤其在高周期下结果差异明显。

入场仍以主K线开盘价为准,但释放持仓位可能提前(如 5 分钟K线触发出场信号),可用于新交易。

所有回调函数(如 custom_exit()custom_stoploss() 等)在持仓后会对每根 5 分钟K线运行一次(如 1 小时主周期、5 分钟细节周期,则每单 12 次)。

--timeframe-detail 必须小于主周期,否则回测无法启动。

显然,这会占用更多内存(5 分钟数据量大于 1 小时),也会影响运行时间(取决于交易数量和持仓时长)。数据需提前下载好。

回测多策略

如需对比多个策略,可用策略列表进行回测。

每次仅支持一个周期,但数据只加载一次,适合对比多策略时节省时间。

所有策略需在同一目录,或用 --recursive-strategy-search 支持子目录。

freqtrade backtesting --timerange 20180401-20180410 
    --timeframe 5m 
    --strategy-list Strategy001 Strategy002 
    --export trades

结果会保存到 user_data/backtest_results/backtest-result-<datetime>.json,包含所有策略结果。 会有一张表对比各策略胜率/亏损(同第一张表 TOTAL 行)。 详细输出会依次展示每个策略,注意向上滚动查看。

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