回测¶
本页面解释了如何通过使用回测来验证策略的表现。
回测需要历史数据可用。要了解如何获取你感兴趣的交易对和交易所的数据,请前往数据下载部分查看文档。
回测命令参考¶
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
其中 SampleStrategy1
和 AwesomeStrategy
是策略的类名。防止将交易导出到文件中
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
文件中,包括Strategy001
和Strategy002
的结果。还将有一张额外的表格比较不同策略的盈亏(与第一个表格中的“总计”行相同)。所有策略的详细输出一个接着一个地可用,因此请确保向上滚动以查看每个策略的详细信息。
=========================================================== 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找到最佳参数。