2018-01-03 06:43:00 +00:00
# Backtesting
2018-06-13 04:52:17 +00:00
2018-12-30 16:14:56 +00:00
This page explains how to validate your strategy performance by using
2018-01-03 06:43:00 +00:00
Backtesting.
## Test your strategy with Backtesting
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
Now you have good Buy and Sell strategies, you want to test it against
2018-12-30 16:14:56 +00:00
real data. This is what we call
2018-01-03 06:43:00 +00:00
[backtesting ](https://en.wikipedia.org/wiki/Backtesting ).
Backtesting will use the crypto-currencies (pair) from your config file
2018-12-30 16:14:56 +00:00
and load static tickers located in
[/freqtrade/tests/testdata ](https://github.com/freqtrade/freqtrade/tree/develop/freqtrade/tests/testdata ).
If the 5 min and 1 min ticker for the crypto-currencies to test is not
2019-07-04 17:56:48 +00:00
already in the `testdata` directory, backtesting will download them
2018-01-03 06:43:00 +00:00
automatically. Testdata files will not be updated until you specify it.
2018-06-14 19:20:16 +00:00
The result of backtesting will confirm you if your bot has better odds of making a profit than a loss.
2018-01-03 06:43:00 +00:00
The backtesting is very easy with freqtrade.
### Run a backtesting against the currencies listed in your config file
2018-06-13 04:52:17 +00:00
#### With 5 min tickers (Per default)
2018-01-03 06:43:00 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting
2018-01-03 06:43:00 +00:00
```
2018-06-13 04:52:17 +00:00
#### With 1 min tickers
2018-01-03 06:43:00 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --ticker-interval 1m
2018-01-03 06:43:00 +00:00
```
2018-06-13 04:52:17 +00:00
#### Update cached pairs with the latest data
2018-01-03 06:43:00 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --refresh-pairs-cached
2018-01-03 06:43:00 +00:00
```
2018-06-13 04:52:17 +00:00
#### With live data (do not alter your testdata files)
2018-01-03 06:43:00 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --live
2018-01-03 06:43:00 +00:00
```
2018-06-13 04:52:17 +00:00
#### Using a different on-disk ticker-data source
2018-01-07 09:15:26 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --datadir freqtrade/tests/testdata-20180101
2018-01-07 09:15:26 +00:00
```
2018-06-13 04:52:17 +00:00
#### With a (custom) strategy file
2018-01-28 13:51:45 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade -s TestStrategy backtesting
2018-01-28 13:51:45 +00:00
```
2018-06-13 04:52:17 +00:00
2018-05-26 17:14:33 +00:00
Where `-s TestStrategy` refers to the class name within the strategy file `test_strategy.py` found in the `freqtrade/user_data/strategies` directory
2018-01-28 13:51:45 +00:00
2018-06-13 04:52:17 +00:00
#### Exporting trades to file
2018-01-11 14:45:39 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --export trades
2018-01-11 14:45:39 +00:00
```
2019-07-04 17:56:48 +00:00
The exported trades can be used for [further analysis ](#further-backtest-result-analysis ), or can be used by the plotting script `plot_dataframe.py` in the scripts directory.
2018-07-12 19:37:54 +00:00
2018-06-13 04:52:17 +00:00
#### Exporting trades to file specifying a custom filename
2018-06-03 17:41:34 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --export trades --export-filename=backtest_teststrategy.json
2018-06-03 17:41:34 +00:00
```
2018-06-13 04:52:17 +00:00
#### Running backtest with smaller testset
2018-06-03 17:41:34 +00:00
2018-01-19 05:07:55 +00:00
Use the `--timerange` argument to change how much of the testset
2018-01-10 23:14:36 +00:00
you want to use. The last N ticks/timeframes will be used.
2018-01-19 05:07:55 +00:00
Example:
2018-06-13 04:52:17 +00:00
2018-01-10 23:14:36 +00:00
```bash
2019-07-08 15:00:34 +00:00
freqtrade backtesting --timerange=-200
2018-01-10 23:14:36 +00:00
```
2018-06-13 04:52:17 +00:00
#### Advanced use of timerange
2018-01-19 05:07:55 +00:00
Doing `--timerange=-200` will get the last 200 timeframes
from your inputdata. You can also specify specific dates,
or a range span indexed by start and stop.
The full timerange specification:
2018-06-13 04:52:17 +00:00
2018-01-19 05:07:55 +00:00
- Use last 123 tickframes of data: `--timerange=-123`
- Use first 123 tickframes of data: `--timerange=123-`
- Use tickframes from line 123 through 456: `--timerange=123-456`
2018-04-27 21:16:34 +00:00
- Use tickframes till 2018/01/31: `--timerange=-20180131`
- Use tickframes since 2018/01/31: `--timerange=20180131-`
- Use tickframes since 2018/01/31 till 2018/03/01 : `--timerange=20180131-20180301`
2018-06-02 16:49:23 +00:00
- Use tickframes between POSIX timestamps 1527595200 1527618600:
`--timerange=1527595200-1527618600`
2018-01-15 21:25:02 +00:00
2018-06-13 04:52:17 +00:00
#### Downloading new set of ticker data
2018-01-19 05:07:55 +00:00
2018-06-04 09:30:21 +00:00
To download new set of backtesting ticker data, you can use a download script.
If you are using Binance for example:
2018-06-13 04:52:17 +00:00
2019-07-04 17:56:48 +00:00
- create a directory `user_data/data/binance` and copy `pairs.json` in that directory.
2018-06-04 09:30:21 +00:00
- update the `pairs.json` to contain the currency pairs you are interested in.
2018-01-13 16:39:36 +00:00
```bash
2018-06-04 09:30:21 +00:00
mkdir -p user_data/data/binance
cp freqtrade/tests/testdata/pairs.json user_data/data/binance
2018-01-19 05:07:55 +00:00
```
2018-01-13 16:39:36 +00:00
2018-06-04 09:30:21 +00:00
Then run:
2018-01-13 16:39:36 +00:00
2018-01-19 05:07:55 +00:00
```bash
2018-07-29 07:51:45 +00:00
python scripts/download_backtest_data.py --exchange binance
2018-01-13 16:39:36 +00:00
```
2018-06-04 09:30:21 +00:00
This will download ticker data for all the currency pairs you defined in `pairs.json` .
2019-07-04 17:56:48 +00:00
- To use a different directory than the exchange specific default, use `--datadir user_data/data/some_directory` .
2018-06-04 09:30:21 +00:00
- To change the exchange used to download the tickers, use `--exchange` . Default is `bittrex` .
2019-07-04 17:56:48 +00:00
- To use `pairs.json` from some other directory, use `--pairs-file some_other_dir/pairs.json` .
2018-06-04 09:30:21 +00:00
- To download ticker data for only 10 days, use `--days 10` .
2018-06-04 10:31:52 +00:00
- Use `--timeframes` to specify which tickers to download. Default is `--timeframes 1m 5m` which will download 1-minute and 5-minute tickers.
2019-05-30 20:00:19 +00:00
- To use exchange, timeframe and list of pairs as defined in your configuration file, use the `-c/--config` option. With this, the script uses the whitelist defined in the config as the list of currency pairs to download data for and does not require the pairs.json file. You can combine `-c/--config` with other options.
2018-01-13 16:39:36 +00:00
2018-06-13 04:52:17 +00:00
For help about backtesting usage, please refer to [Backtesting commands ](#backtesting-commands ).
2018-01-03 06:43:00 +00:00
## Understand the backtesting result
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
The most important in the backtesting is to understand the result.
A backtesting result will look like that:
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
```
2019-01-24 14:24:38 +00:00
========================================================= BACKTESTING REPORT ========================================================
| pair | buy count | avg profit % | cum profit % | tot profit BTC | tot profit % | avg duration | profit | loss |
|:---------|------------:|---------------:|---------------:|-----------------:|---------------:|:---------------|---------:|-------:|
| ADA/BTC | 35 | -0.11 | -3.88 | -0.00019428 | -1.94 | 4:35:00 | 14 | 21 |
| ARK/BTC | 11 | -0.41 | -4.52 | -0.00022647 | -2.26 | 2:03:00 | 3 | 8 |
| BTS/BTC | 32 | 0.31 | 9.78 | 0.00048938 | 4.89 | 5:05:00 | 18 | 14 |
| DASH/BTC | 13 | -0.08 | -1.07 | -0.00005343 | -0.53 | 4:39:00 | 6 | 7 |
| ENG/BTC | 18 | 1.36 | 24.54 | 0.00122807 | 12.27 | 2:50:00 | 8 | 10 |
| EOS/BTC | 36 | 0.08 | 3.06 | 0.00015304 | 1.53 | 3:34:00 | 16 | 20 |
| ETC/BTC | 26 | 0.37 | 9.51 | 0.00047576 | 4.75 | 6:14:00 | 11 | 15 |
| ETH/BTC | 33 | 0.30 | 9.96 | 0.00049856 | 4.98 | 7:31:00 | 16 | 17 |
| IOTA/BTC | 32 | 0.03 | 1.09 | 0.00005444 | 0.54 | 3:12:00 | 14 | 18 |
| LSK/BTC | 15 | 1.75 | 26.26 | 0.00131413 | 13.13 | 2:58:00 | 6 | 9 |
| LTC/BTC | 32 | -0.04 | -1.38 | -0.00006886 | -0.69 | 4:49:00 | 11 | 21 |
| NANO/BTC | 17 | 1.26 | 21.39 | 0.00107058 | 10.70 | 1:55:00 | 10 | 7 |
| NEO/BTC | 23 | 0.82 | 18.97 | 0.00094936 | 9.48 | 2:59:00 | 10 | 13 |
| REQ/BTC | 9 | 1.17 | 10.54 | 0.00052734 | 5.27 | 3:47:00 | 4 | 5 |
| XLM/BTC | 16 | 1.22 | 19.54 | 0.00097800 | 9.77 | 3:15:00 | 7 | 9 |
| XMR/BTC | 23 | -0.18 | -4.13 | -0.00020696 | -2.07 | 5:30:00 | 12 | 11 |
| XRP/BTC | 35 | 0.66 | 22.96 | 0.00114897 | 11.48 | 3:49:00 | 12 | 23 |
| ZEC/BTC | 22 | -0.46 | -10.18 | -0.00050971 | -5.09 | 2:22:00 | 7 | 15 |
| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 243 |
========================================================= SELL REASON STATS =========================================================
| Sell Reason | Count |
|:-------------------|--------:|
| trailing_stop_loss | 205 |
| stop_loss | 166 |
| sell_signal | 56 |
| force_sell | 2 |
====================================================== LEFT OPEN TRADES REPORT ======================================================
| pair | buy count | avg profit % | cum profit % | tot profit BTC | tot profit % | avg duration | profit | loss |
|:---------|------------:|---------------:|---------------:|-----------------:|---------------:|:---------------|---------:|-------:|
| ADA/BTC | 1 | 0.89 | 0.89 | 0.00004434 | 0.44 | 6:00:00 | 1 | 0 |
| LTC/BTC | 1 | 0.68 | 0.68 | 0.00003421 | 0.34 | 2:00:00 | 1 | 0 |
| TOTAL | 2 | 0.78 | 1.57 | 0.00007855 | 0.78 | 4:00:00 | 2 | 0 |
2018-01-03 06:43:00 +00:00
```
2018-06-13 05:00:05 +00:00
The 1st table will contain all trades the bot made.
2019-01-24 14:24:38 +00:00
The 2nd table will contain a recap of sell reasons.
The 3rd table will contain all trades the bot had to `forcesell` at the end of the backtest period to present a full picture.
2018-06-13 05:00:05 +00:00
These trades are also included in the first table, but are extracted separately for clarity.
2018-01-03 06:43:00 +00:00
The last line will give you the overall performance of your strategy,
here:
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
```
2019-01-24 14:24:38 +00:00
| TOTAL | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 243 |
2018-01-03 06:43:00 +00:00
```
2019-01-24 14:24:38 +00:00
We understand the bot has made `429` trades for an average duration of
`4:12:00` , with a performance of `76.20%` (profit), that means it has
earned a total of `0.00762792 BTC` starting with a capital of 0.01 BTC.
The column `avg profit %` shows the average profit for all trades made while the column `cum profit %` sums all the profits/losses.
The column `tot profit %` shows instead the total profit % in relation to allocated capital
(`max_open_trades * stake_amount`). In the above results we have `max_open_trades=2 stake_amount=0.005` in config
so `(76.20/100) * (0.005 * 2) =~ 0.00762792 BTC` .
2018-12-30 16:14:56 +00:00
As you will see your strategy performance will be influenced by your buy
strategy, your sell strategy, and also by the `minimal_roi` and
`stop_loss` you have set.
2018-01-03 06:43:00 +00:00
As for an example if your minimal_roi is only `"0": 0.01` . You cannot
2018-12-30 16:14:56 +00:00
expect the bot to make more profit than 1% (because it will sell every
2018-01-03 06:43:00 +00:00
time a trade will reach 1%).
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
```json
"minimal_roi": {
"0": 0.01
},
```
On the other hand, if you set a too high `minimal_roi` like `"0": 0.55`
2018-12-30 16:14:56 +00:00
(55%), there is a lot of chance that the bot will never reach this
profit. Hence, keep in mind that your performance is a mix of your
2018-01-03 06:43:00 +00:00
strategies, your configuration, and the crypto-currency you have set up.
2019-03-07 20:11:14 +00:00
### Further backtest-result analysis
To further analyze your backtest results, you can [export the trades ](#exporting-trades-to-file ).
2019-06-22 14:18:22 +00:00
You can then load the trades to perform further analysis as shown in our [data analysis ](data-analysis.md#backtesting ) backtesting section.
2019-03-07 20:11:14 +00:00
2018-07-29 07:51:45 +00:00
## Backtesting multiple strategies
To backtest multiple strategies, a list of Strategies can be provided.
2018-12-30 16:14:56 +00:00
This is limited to 1 ticker-interval per run, however, data is only loaded once from disk so if you have multiple
2018-07-29 07:51:45 +00:00
strategies you'd like to compare, this should give a nice runtime boost.
2019-07-04 17:56:48 +00:00
All listed Strategies need to be in the same directory.
2018-07-29 07:51:45 +00:00
``` bash
2018-12-30 16:14:56 +00:00
freqtrade backtesting --timerange 20180401-20180410 --ticker-interval 5m --strategy-list Strategy001 Strategy002 --export trades
2018-07-29 07:51:45 +00:00
```
This will save the results to `user_data/backtest_data/backtest-result-<strategy>.json` , injecting the strategy-name into the target filename.
2018-07-29 11:13:03 +00:00
There will be an additional table comparing win/losses of the different strategies (identical to the "Total" row in the first table).
Detailed output for all strategies one after the other will be available, so make sure to scroll up.
2018-07-29 07:51:45 +00:00
2018-07-29 11:13:03 +00:00
```
2019-01-24 14:24:38 +00:00
=========================================================== Strategy Summary ===========================================================
| Strategy | buy count | avg profit % | cum profit % | tot profit BTC | tot profit % | avg duration | profit | loss |
|:------------|------------:|---------------:|---------------:|-----------------:|---------------:|:---------------|---------:|-------:|
| Strategy1 | 429 | 0.36 | 152.41 | 0.00762792 | 76.20 | 4:12:00 | 186 | 243 |
| Strategy2 | 1487 | -0.13 | -197.58 | -0.00988917 | -98.79 | 4:43:00 | 662 | 825 |
2018-07-29 11:13:03 +00:00
```
2018-07-29 07:51:45 +00:00
2018-01-03 06:43:00 +00:00
## Next step
2018-06-13 04:52:17 +00:00
2018-01-03 06:43:00 +00:00
Great, your strategy is profitable. What if the bot can give your the
2018-12-30 16:14:56 +00:00
optimal parameters to use for your strategy?
2018-12-31 12:36:27 +00:00
Your next step is to learn [how to find optimal parameters with Hyperopt ](hyperopt.md )