Skip to content

回测

本页面解释了如何通过使用回测来验证策略的表现。

回测需要历史数据可用。要了解如何获取你感兴趣的交易对和交易所的数据,请前往数据下载部分查看文档。

回测命令参考

usage: freqtrade backtesting [-h] [-v] [--logfile FILE] [-V] [-c PATH]
                             [-d PATH] [--userdir PATH] [-s NAME]
                             [--strategy-path PATH] [-i TIMEFRAME]
                             [--timerange TIMERANGE]
                             [--data-format-ohlcv {json,jsongz,hdf5}]
                             [--max-open-trades INT]
                             [--stake-amount STAKE_AMOUNT] [--fee FLOAT]
                             [-p PAIRS [PAIRS ...]] [--eps] [--dmmp]
                             [--enable-protections]
                             [--dry-run-wallet DRY_RUN_WALLET]
                             [--timeframe-detail TIMEFRAME_DETAIL]
                             [--strategy-list STRATEGY_LIST [STRATEGY_LIST ...]]
                             [--export {none,trades,signals}]
                             [--export-filename PATH]
                             [--breakdown {day,week,month} [{day,week,month} ...]]
                             [--cache {none,day,week,month}]

可选参数:
  -h, --help            显示帮助信息并退出
  -i TIMEFRAME, --timeframe TIMEFRAME
                        指定时间框架(`1m`、`5m`、`30m`、`1h`、`1d`)。
  --timerange TIMERANGE
                        指定要使用的数据范围。
  --data-format-ohlcv {json,jsongz,hdf5,feather,parquet}
                        存储下载蜡烛图(OHLCV)数据的格式(默认为`feather`)。
  --max-open-trades INT
                        重写`max_open_trades`配置设置的值。
  --stake-amount STAKE_AMOUNT
                        重写`stake_amount`配置设置的值。
  --fee FLOAT           指定费率。将会应用在交易的进入和退出两次。
  -p PAIRS [PAIRS ...], --pairs PAIRS [PAIRS ...]
                        限制命令仅适用于这些交易对。交易对之间用空格分隔。
  --eps, --enable-position-stacking
                        允许多次购买同一交易对(位置堆叠)。
  --dmmp, --disable-max-market-positions
                        在回测期间禁用`max_open_trades`(相当于将`max_open_trades`设置为非常大的数字)。
  --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)。
  --export-filename PATH, --backtest-filename PATH
                        使用此文件名作为回测结果。需要设置`--export`选项。例如:`--export-filename=user_data/backtest_results/backtest_today.json`。
  --breakdown {day,week,month} [{day,week,month} ...]
                        按[day, week, month]显示回测的分解。
  --cache {none,day,week,month}
                        加载指定的缓存回测结果,不能超过指定的年龄(默认为当天)。

通用参数:
  -v, --verbose         详细模式(-vv以获取更多信息,-vvv获取所有消息)。
  --logfile FILE        记录到指定的文件中。特殊值:'syslog'、'journald'。详细信息请参阅文档。
  -V, --version         显示程序的版本号并退出
  -c PATH, --config PATH
                        指定配置文件(默认为`userdir/config.json`或`config.json`,以存在的文件为准)。可以使用多个--config选项。可以设置为`-`以从标准输入读取配置。
  -d PATH, --datadir PATH
                        具有历史回测数据的目录路径。
  --userdir PATH, --user-data-dir PATH
                        用户数据目录路径。

策略参数:
  -s NAME, --strategy NAME
                        指定机器人使用的策略类名。
  --strategy-path PATH  指定附加的策略查找路径。

使用回测测试你的策略

现在你已经有了良好的入场和退出策略,并且有一些历史数据,你希望对其进行真实数据测试。这就是我们所称的回测

回测将使用配置文件中的加密货币对,并默认从user_data/data/<exchange>加载历史蜡烛(OHLCV)数据。如果对于交易所/交易对/时间框架组合没有可用的数据,回测将要求您首先使用freqtrade download-data下载它们。有关下载的详细信息,请参阅文档中的数据下载部分。

回测的结果将确认您的机器人在盈利与亏损方面的胜率。

所有盈利计算都包括手续费,而freqtrade将使用交易所的默认手续费进行计算。

对于回测使用动态交易对列表

使用动态交易对列表是可能的(并非所有的处理程序都允许在回测模式下使用),但它依赖于当前的市场情况 - 这将不反映交易对列表的历史状态。 另外,当使用除StaticPairlist以外的交易对列表时,无法保证回测结果的可重现性。 请阅读交易对列表文档以获取更多信息。

为了实现可重现的结果,最好通过test-pairlist命令生成一个交易对列表,并将其用作静态交易对列表。

Note

默认情况下,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分钟的蜡烛图(OHLCV数据)(默认情况下)

freqtrade backtesting --strategy AwesomeStrategy

其中--strategy AwesomeStrategy / -s AwesomeStrategy指的是策略的类名,该类名位于user_data/strategies目录下的一个python文件中。


使用1分钟的蜡烛图(OHLCV数据)

freqtrade backtesting --strategy AwesomeStrategy --timeframe 1m

提供自定义的初始余额为1000(以投注货币计)

freqtrade回测 --strategy AwesomeStrategy --dry-run-wallet 1000

使用另一个存储在磁盘上的历史蜡烛(OHLCV)数据源

假设您从Binance交易所下载了历史数据,并将其保存在 user_data/data/binance-20180101 目录中。您可以按照以下方式将此数据用于回测:

freqtrade回测 --strategy AwesomeStrategy --datadir user_data/data/binance-20180101

比较多个策略

freqtrade回测 --strategy-list SampleStrategy1 AwesomeStrategy --timeframe 5m

其中 SampleStrategy1AwesomeStrategy 是策略的类名。防止将交易导出到文件中

freqtrade backtesting --strategy backtesting --export none --config config.json 

只有在确定不想进一步绘制或分析结果时才使用此选项。


将交易导出到文件,指定自定义的文件名

freqtrade backtesting --strategy backtesting --export trades --export-filename=backtest_samplestrategy.json

请还阅读有关策略启动期的内容。


提供自定义手续费值

有时您的帐户具有一定的手续费折扣(从特定帐户大小或每月交易量开始的手续费减免),这对 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/epoch 时间戳 1527595200 和 1527618600 之间的数据:--timerange=1527595200-1527618600

理解回测结果

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

一个回测结果如下所示:

========================================================= 回测报告 =========================================================
| 交易对   | 成交数量 | 平均利润% | 总利润%  | 总利润BTC  | 总利润% | 平均持续时间  | 胜仓 平仓 负仓   胜率  |
|:---------|--------:|---------:|--------:|-----------:|-------:|:-------------|------------------:|
| ADA/BTC  |      35 |    -0.11 |   -3.88 | -0.00019428 |  -1.94 | 4小时35分钟   |   14     0    21   40.0 |
| ARK/BTC  |      11 |    -0.41 |   -4.52 | -0.00022647 |  -2.26 | 2小时3分钟    |    3     0     8   27.3 |
| BTS/BTC  |      32 |     0.31 |    9.78 |  0.00048938 |   4.89 | 5小时5分钟    |   18     0    14   56.2 |
| DASH/BTC |      13 |    -0.08 |   -1.07 | -0.00005343 |  -0.53 | 4小时39分钟   |    6     0     7   46.2 |
| ENG/BTC  |      18 |     1.36 |   24.54 |  0.00122807 |  12.27 | 2小时50分钟   |    8     0    10   44.4 |
| EOS/BTC  |      36 |     0.08 |    3.06 |  0.00015304 |   1.53 | 3小时34分钟   |   16     0    20   44.4 |
| ETC/BTC  |      26 |     0.37 |    9.51 |  0.00047576 |   4.75 | 6小时14分钟   |   11     0    15   42.3 |
| ETH/BTC  |      33 |     0.30 |    9.96 |  0.00049856 |   4.98 | 7小时31分钟   |   16     0    17   48.5 |
| IOTA/BTC |      32 |     0.03 |    1.09 |  0.00005444 |   0.54 | 3小时12分钟   |   14     0    18   43.8 |
| LSK/BTC  |      15 |     1.75 |   26.26 |  0.00131413 |  13.13 | 2小时58分钟   |    6     0     9   40.0 |
| LTC/BTC  |      32 |    -0.04 |   -1.38 | -0.00006886 |  -0.69 | 4小时49分钟   |   11     0    21   34.4 |
| NANO/BTC |      17 |     1.26 |   21.39 |  0.00107058 |  10.70 | 1小时55分钟   |   10     0     7   58.5 |
| NEO/BTC  |      23 |     0.82 |   18.97 |  0.00094936 |   9.48 | 2小时59分钟   |   10     0    13   43.5 |
| REQ/BTC  |       9 |     1.17 |   10.54 |  0.00052734 |   5.27 | 3小时47分钟   |    4     0     5   44.4 |
| XLM/BTC  |      16 |     1.22 |   19.54 |  0.00097800 |   9.77 | 3小时15分钟   |    7     0     9   43.8 |
| XMR/BTC  |      23 |    -0.18 |   -4.13 | -0.00020696 |  -2.07 | 5小时30分钟   |   12     0    11   52.2 |
| XRP/BTC  |      35 |     0.66 |   22.96 |  0.00114897 |  11.48 | 3小时49分钟   |   12     0    23   34.3 |
| ZEC/BTC  |      22 |    -0.46 |  -10.18 | -0.00050971 |  -5.09 | 2小时22分钟   |    7     0    15   31.8 |
| TOTAL    |     429 |     0.36 |  152.41 |  0.00762792 |  76.20 | 4小时12分钟   |  186     0   243   43.4 |
====================================================== 未平仓交易报告 ======================================================
| 交易对   | 成交数量 | 平均利润% | 总利润%  | 总利润BTC  | 总利润% | 平均持续时间   | 胜仓 平仓 负仓 胜率 |
|:---------|--------:|---------:|--------:|-----------:|-------:|:---------------|-------------------:|
| ADA/BTC  |        1 |     0.89 |    0.89 |  0.00004434 |   0.44 | 6小时00分钟     |   1    0    0  100 |
| LTC/BTC  |        1 |     0.68 |    0.68 |  0.00003421 |   0.34 | 2小时00分钟     |   1    0    0  100 |
| TOTAL    |        2 |     0.78 |    1.57 |  0.00007855 |   0.78 | 4小时00分钟     |   2    0    0  100 |
==================== 退出原因统计 ====================
| 退出原因          |   退出次数 |  胜利次数 |  平局次数 |  输掉次数 |
|:-----------------|----------:|----------:|---------:|----------:|
| trailing_stop_loss |      205 |       150 |        0 |         55 |
| stop_loss          |      166 |         0 |        0 |        166 |
| exit_signal        |       56 |        36 |        0 |         20 |
| force_exit         |        2 |         0 |        0 |          2 |

================== 总结指标 ==================
| 指标                      | 值                   |
|-------------------------|---------------------|
| 回测开始时间               | 2019-01-01 00:00:00 |
| 回测结束时间               | 2019-05-01 00:00:00 |
| 最大未平仓交易             | 3                   |
|                         |                     |
| 总交易次数/每日平均交易次数   | 429 / 3.575         |
| 起始余额                  | 0.01000000 BTC      |
| 最终余额                  | 0.01762792 BTC      |
| 绝对利润                  | 0.00762792 BTC      |
| 总利润%                  | 76.2%               |
| 年均复合增长率%              | 460.87%             |
| Sortino比率               | 1.88                |
| 夏普比率                  | 2.97                |
| Calmar比率               | 6.29                |
| 盈亏比                     | 1.11                |
| 期望值 (比率)              | -0.15 (-0.05)       |
| 平均投入金额               | 0.001      BTC      |
| 总交易量                  | 0.429      BTC      |
|                         |                     |
| 做多 / 做空                | 352 / 77            |
| 做多总利润%               | 1250.58%            |
| 做空总利润%               | -15.02%             |
| 做多绝对利润               | 0.00838792 BTC      |
| 做空绝对利润               | -0.00076 BTC        |
|                         |                     |
| 最佳交易对                 | LSK/BTC 26.26%      |
| 最差交易对                 | ZEC/BTC -10.18%     |
| 最佳交易                   | LSK/BTC 4.25%       |
| 最差交易                   | ZEC/BTC -10.25%     |
| 最佳交易日                 | 0.00076 BTC         |
| 最差交易日                 | -0.00036 BTC        |
| 胜平负天数                 | 12 / 82 / 25        |
| 胜利交易平均持续时间         | 4小时23分钟        |
| 输掉交易平均持续时间         | 6小时55分钟        |
| 最大连续胜利次数 / 输掉次数 | 3 / 4               |
| 被忽略的入场信号数          | 3089                |
| 入场/退出超时次数            | 0 / 0               |
| 被取消的交易入场次数         | 34                  |
| 被取消的入场指令次数         | 123                 |
| 被替换的入场指令次数         | 89                  |
|                         |                     |
| 最低余额                  | 0.00945123 BTC      |
| 最高余额                  | 0.01846651 BTC      |
| 最大资金亏损比例            | 25.19%              |
| 绝对回撤 / 最近回撤 / 最大回撤 | 13.33%              |
| 回撤                      | 0.0015 BTC          |
| 最大回撤时期开始时间         | 2019-02-15 14:10:00 |
| 最大回撤时期结束时间         | 2019-04-11 18:15:00 |
| 市场变化                   | -5.88%              |
=====================================================

回测报告表格

第一个表格包含了机器人进行的所有交易,包括“未平仓交易”。

最后一行给出了您策略的整体表现,本例中为:

| TOTAL    |    429 |     0.36 |  152.41 |  0.00762792 |  76.20 | 4小时12分钟   |  186     0   243   43.4 |

该机器人已进行了429笔交易,平均持续时间为4小时12分钟,投资回报率为76.20%(利润),这意味着从0.01 BTC的初始资本开始赚取了总共0.00762792 BTC。

“Avg Profit %”列显示了所有交易的平均利润,而“Cum Profit %”列则总结了所有的利润/亏损。而“Tot Profit %”列则显示了相对于初始资金的总利润百分比。 在上述结果中,我们从0.01 BTC的初始资金开始,获得了0.00762792 BTC的绝对利润,所以“Tot Profit %”将会是(0.00762792 / 0.01) * 100 ≈ 76.2%

您的策略绩效受到入市策略、出市策略以及您所设置的“minimal_roi”和“stop_loss”的影响。

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

另一方面,如果您设置了一个过高的“minimal_roi”,比如"0": 0.55(55%),则机器人几乎不可能达到这个利润。因此,请记住您的绩效是策略的各个不同元素、配置和您设置的加密货币交易对的综合体现。

出市原因表

第二个表格是出市原因的总结。这个表格可以告诉您哪个方面需要进一步改进(例如,所有或者许多“exit_signal”交易都是亏损的,因此您应该改进出市信号,或者考虑禁用它)。

未完成交易表

第三个表格包含机器人在回测期结束时被迫“force_exit”的所有交易,以便为您呈现全面的图片。这是为了模拟实际行为的必要部分,因为回测期必须在某一时刻结束,而在现实情况下,您可以让机器人一直运行下去。这些交易也包括在第一个表格中,但在本表格中也单独显示,以增加清晰度。

总结指标

回测报告的最后一个元素是总结指标表。它包含有关回测数据上策略表现的一些有用的关键指标。

================== 总结指标 ==================
| 指标                        | 值                  |
|-----------------------------+---------------------|
| 回测开始时间                | 2019-01-01 00:00:00 |
| 回测结束时间                | 2019-05-01 00:00:00 |
| 最大持仓交易对数            | 3                   |
|                             |                     |
| 总交易次数 / 每日平均交易次数| 429 / 3.575         |
| 起始余额                    | 0.01000000 BTC      |
| 最终余额                    | 0.01762792 BTC      |
| 绝对利润                    | 0.00762792 BTC      |
| 总利润百分比                | 76.2%               |
| 年化复合增长率              | 460.87%             |
| Sortino比率                 | 1.88                |
| Sharpe比率                  | 2.97                |
| Calmar比率                  | 6.29                |
| 盈亏比                       | 1.11                |
| 期望值(比例)              | -0.15 (-0.05)       |
| 平均持仓金额                 | 0.001      BTC      |
| 总交易量                     | 0.429      BTC      |
|                             |                     |
| 多头 / 空头                | 352 / 77            |
| 多头总利润百分比            | 1250.58%            |
| 空头总利润百分比            | -15.02%             |
| 多头绝对利润                | 0.00838792 BTC      |
| 空头绝对利润                | -0.00076 BTC        |
|                             |                     |
| 最佳交易对                  | LSK/BTC 26.26%      |
| 最差交易对                  | ZEC/BTC -10.18%     |
| 最佳交易                    | LSK/BTC 4.25%       |
| 最差交易                    | ZEC/BTC -10.25%     |
| 最佳交易日                  | 0.00076 BTC         |
| 最差交易日                  | -0.00036 BTC        |
| 胜/平/负天数                | 12 / 82 / 25        |
| 平均获胜持续时间             | 4:23:00             |
| 平均亏损持续时间             | 6:55:00             |
| 最大连续获胜/亏损次数        | 3 / 4               |
| 被拒绝的入场信号数量        | 3089                |
| 入场/退出超时数量           | 0 / 0               |
| 取消的交易入场数量          | 34                  |
| 取消的入场订单数量          | 123                 |
| 替换的入场订单数量          | 89                  |
|                             |                     |
| 最低账户余额                | 0.00945123 BTC      |
| 最高账户余额                | 0.01846651 BTC      |
| 最大回撤比例                | 25.19%              |
| 绝对回撤(以账户为基准)    | 13.33%              |
| 回撤金额                    | 0.0015 BTC          |
| 回撤高点                    | 0.0013 BTC          |
| 回撤低点                    | -0.0002 BTC         |
| 回撤开始时间                | 2019-02-15 14:10:00 |
| 回撤结束时间                | 2019-04-11 18:15:00 |
| 市场变化                    | -5.88%              |
=====================================================
  • 回测开始时间 / 回测结束时间: 回测范围(通常使用 --timerange 选项定义)。
  • 最大持仓交易对数: max_open_trades 设置(或 --max-open-trades)— 或交易对列表中的交易对数(以较小者为准)。
  • 总交易次数 / 每日平均交易次数: 与回测输出表中的总交易次数相同 / 总交易次数除以回测持续时间(以天为单位)(这将为您提供有关策略预期交易次数的信息)。
  • 起始余额: 起始余额 — 来自 dry-run-wallet(配置或命令行)。
  • 最终余额: 最终余额 — 起始余额 + 绝对利润。
  • 绝对利润: 以投注货币计算的利润。
  • 总利润百分比: 总利润。对齐第一个表格TOTAL行的Tot Profit %。计算公式为:(End capital − Starting capital) / Starting capital
  • 年化复合增长率: 复合年增长率。
  • Sortino比率: 年化 Sortino 比率。
  • Sharpe比率: 年化 Sharpe 比率。
  • Calmar比率: 年化 Calmar 比率。
  • 盈亏比: 盈利 / 亏损。
  • 平均持仓金额: 平均持仓金额,可以是 stake_amount 或者动态持仓金额的平均值。
  • 总交易量: 实现上述利润所需的交易量。
  • 最佳交易对 / 最差交易对: 最佳和最差的交易对及其相应的累积利润百分比
  • 最佳交易 / 最差交易: 最大单笔盈利交易和最大单笔亏损交易。
  • 最佳交易日 / 最差交易日: 基于每日利润的最佳和最差交易日。
  • 胜/平/负天数: 获胜 / 输掉的天数(平局通常是没有完成交易的天数)。
  • 平均获胜持续时间 / 平均亏损持续时间: 获胜交易和亏损交易的平均持续时间。
  • 最大连续获胜/亏损次数: 连续获胜 / 亏损次数最大的次数。
  • 被拒绝的入场信号数量: 由于达到 max_open_trades 上限而无法操作的交易入场信号数量。
  • 入场/退出超时数量: 未执行的入场/退出订单(仅适用于使用自定义定价时)。
  • 取消的交易入场数量: 根据用户请求通过 adjust_entry_price 取消的交易数量。
  • 取消的入场订单数量: 根据用户请求通过 adjust_entry_price 取消的入场订单数量。
  • 替换的入场订单数量: 根据用户请求通过 adjust_entry_price 替换的入场订单数量。
  • 最低账户余额 / 最高账户余额: 回测期间最低和最高的钱包余额。
  • 最大回撤比例: 自模拟开始以来,账户下跌的最大百分比。计算公式为:(Max Balance - Current Balance) / (Max Balance)
  • 绝对回撤(以账户为基准): 所经历的最大账户回撤。计算公式为:(绝对回撤) / (回撤高点 + 起始余额)
  • 回撤金额: 所经历的最大、绝对回撤。回撤高点和随后的低点之间的差值。
  • 回撤高点 / 回撤低点: 最大回撤期间的起始利润和结束利润。负的低点意味着初始资本损失。
  • 回撤开始时间 / 回撤结束时间: 此最大回撤的开始和结束日期时间(也可以通过 plot-dataframe 子命令可视化)。
  • 市场变化: 回测期间市场的变化。计算公式为:所有交易对的首个和最后一个蜡烛的“close”列的平均变化。
  • 多头 / 空头: 多头和空头的交易数量分割(仅当进行了空头交易时显示)。
  • 多头总利润百分比 / 多头绝对利润: 仅多头交易的利润(仅当进行了空头交易时显示)。
  • 空头总利润百分比 / 空头绝对利润: 仅空头交易的利润(仅当进行了空头交易时显示)。

每日/每周/每月细分

您可以使用 --breakdown <> 参数获取每日/每周或每月的结果概览。

要可视化每日和每周细分,请使用以下命令:

freqtrade backtesting --strategy MyAwesomeStrategy --breakdown day week
======================== 每日细分 =========================
|        日期 |   总利润 USDT |   胜利次数 |   平局次数 |   失败次数 |
|------------+-----------------+---------+-----------+----------|
| 2021-07-03 |           200.0   |      2 |       0 |        0 |
| 2021-07-04 |           -50.31  |      0 |       0 |        2 |
| 2021-07-05 |           220.611 |      3 |       2 |        0 |
| 2021-07-06 |           150.974 |      3 |       0 |        2 |
| 2021-07-07 |           -70.193 |      1 |       0 |        2 |
| 2021-07-08 |           212.413 |      2 |       0 |        3 |

输出将显示一个包含给定时间段内实际获利的绝对金额(以投注货币计)的表格,以及在这一天实现的(关闭的)赢局、平局和输局数量。在下面将有一个第二个表格,用于由本周的结束日期指示的周汇总值。同样的方式适用于由月底日期指示的月份细分。

回测结果缓存

为了节省时间,默认情况下,当回测的策略和配置与先前的回测的策略和配置匹配时,回测将重复使用来自前一天的缓存结果。如果要强制进行新的回测,即使存在相同运行的现有结果,请指定 --cache none 参数。

警告

对于没有结束时间的时间范围(--timerange 20210101-),缓存被自动禁用了,因为 freqtrade 无法特别确保底层数据没有发生变化。如果原始回测在结尾处缺少数据,并通过下载更多数据进行了修复,缓存结果也可能在不应该使用缓存结果的情况下使用。 在这种情况下,请使用 --cache none 一次,以强制进行新的回测。

进一步分析回测结果

要进一步分析您的回测结果,您可以导出交易记录。然后,您可以加载这些交易记录进行进一步分析,如数据分析回测部分所示。

回测所做的假设

由于回测缺乏有关蜡烛内部发生的详细信息,因此需要进行一些假设:

  • 遵守交易所的交易限制
  • 条目发生在开盘价
  • 所有订单以请求的价格成交(无滑点,无未成交订单)
  • 退出信号的退出事情发生在连续蜡烛的开盘价
  • 退出信号优先于止损,因为假设退出信号在蜡烛的开盘价上触发
  • 投资回报率(ROI)
    • 与最高价比较退出 - 但使用ROI值(例如,ROI = 2%,最高值=5% - 因此退出将在2%处)
    • 退出从未“低于蜡烛”,因此2%的ROI可能导致2.4%利润时的退出
    • ROI输入在触发蜡烛上生效(例如,对于1小时的蜡烛,120: 0.02-从60: 0.05进入)将使用蜡烛的开盘价作为退出率
    • <N>=-1 ROI输入引起的强制退出使用低点作为退出值,除非N落在蜡烛开盘价上(例如,对于1小时的蜡烛,120: -1
  • 止损退出确切发生在止损价格上,即使最低价更低,但亏损金额将比止损价格高 2 * fees
  • 停损在一个蜡烛内在进行ROI之前进行评估。因此,与相同策略在模拟运行/实盘交易模式下获得的结果相比,您通常会看到具有stoploss退出原因的更多交易
  • 最低价先于最高价进行止损,首先保护资本
  • 移动止损
    • 仅当移动止损低于蜡烛的最低价时才进行调整(否则将被触发)
    • 在触发移动止损的交易开始蜡烛上,假设使用“最小偏移量”(stop_positive_offset)(而不是最高价) - 并从此点计算止损。对于自定义止损情况,此规则不适用,因为没有关于止损逻辑的信息可用。
    • 最高价先发生 - 调整止损
    • 最低价使用调整后的止损(因此正确回测高低差异较大的退出)
    • ROI在移动止损之前应用,以确保利润在ROI处“顶部封顶”,如果ROI和移动止损都适用,则先应用ROI
  • 退出原因不解释交易是盈利还是亏损,只是解释触发了退出的原因(如果使用了负的ROI值,可能会看起来很奇怪)
  • 评估顺序(如果同一蜡烛上发生多个信号)
    • 退出信号
    • 止损
    • ROI
    • 移动止损根据这些假设,回测试图尽可能真实地模拟交易。然而,回测永远不会取代以模拟交易方式运行策略。 此外,请记住,过去的结果并不能保证未来的成功。

除了上述假设之外,策略作者应仔细阅读常见错误部分,以避免在回测中使用实际市场条件中不可用的数据。

回测中的交易限制

交易所有一些交易限制,如最小(和最大)基准货币,或最小/最大收益(报价)货币。 这些限制通常在交易所文档中列出为“交易规则”或类似名称,并且在不同交易对之间可能会有很大的差异。

回测(以及实时和模拟交易)会遵守这些限制,并确保止损价可以低于此值-因此该值将略高于交易所规定的值。 然而,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的价格。这些精度值是基于当前交换限制(如上一节交易限制中描述的),因为历史精度限制不可用。

改进的回测准确性

回测的一个重要限制是无法知道价格在蜡烛内部如何移动(收盘前是高还是低?)。假设您在1小时的时间框架内运行回测,那么该蜡烛有四个价格(开盘价、最高价、最低价、收盘价)。

虽然回测确实对此有一些假设(参见上文)- 这永远不可能是完美的,并且总会有一种或另一种方式上的偏差。为了减轻这个问题,Freqtrade可以使用更低(更快)的时间框架来模拟蜡烛内部的价格变动。

要使用此功能,您可以将 --timeframe-detail 5m 添加到常规的回测命令中。

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

这将加载1小时数据以及5分钟数据。策略将使用1小时时间框架进行分析,并且订单将只在主时间框架上下达,但订单成交和退出信号将在5分钟蜡烛上进行评估,模拟蜡烛内部的价格变动。

所有回调函数(custom_exit()custom_stoploss(),等等)将在交易打开后的每个5分钟蜡烛上运行一次(在上述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文件中,包括Strategy001Strategy002的结果。还将有一张额外的表格比较不同策略的盈亏(与第一个表格中的“总计”行相同)。所有策略的详细输出一个接着一个地可用,因此请确保向上滚动以查看每个策略的详细信息。

=========================================================== STRATEGY SUMMARY ===========================================================================
| 策略        |  入场次数 |  平均收益 %  |   总收益 %    |   总收益 BTC     |   总收益 %     | 平均持续时间   |  胜利次数 | 平局次数 | 输掉次数 |   最大回撤 %  |
|:-----------|---------:|---------------:|---------------:|-----------------:|---------------:|:---------------|-------:|--------:|--------:|-------------:|
| 策略1       |      429 |           0.36 |         152.41 |       0.00762792 |          76.20 | 4:12:00        |    186 |      0  |    243 |        45.2 |
| 策略2       |     1487 |          -0.13 |        -197.58 |      -0.00988917 |         -98.79 | 4:43:00        |    662 |      0  |    825 |       241.68 |

下一步

很棒,你的策略是盈利的。如果机器人能够给出你的策略的最佳参数,会怎样呢?你的下一步是学习如何使用Hyperopt找到最佳参数