2018-01-03 06:43:00 +00:00
|
|
|
# Backtesting
|
|
|
|
This page explains how to validate your strategy performance by using
|
|
|
|
Backtesting.
|
|
|
|
|
|
|
|
## Table of Contents
|
|
|
|
- [Test your strategy with Backtesting](#test-your-strategy-with-backtesting)
|
|
|
|
- [Understand the backtesting result](#understand-the-backtesting-result)
|
|
|
|
|
|
|
|
## Test your strategy with Backtesting
|
|
|
|
Now you have good Buy and Sell strategies, you want to test it against
|
|
|
|
real data. This is what we call
|
|
|
|
[backtesting](https://en.wikipedia.org/wiki/Backtesting).
|
|
|
|
|
|
|
|
|
|
|
|
Backtesting will use the crypto-currencies (pair) from your config file
|
|
|
|
and load static tickers located in
|
2018-01-19 05:07:55 +00:00
|
|
|
[/freqtrade/tests/testdata](https://github.com/gcarq/freqtrade/tree/develop/freqtrade/tests/testdata).
|
2018-01-03 06:43:00 +00:00
|
|
|
If the 5 min and 1 min ticker for the crypto-currencies to test is not
|
|
|
|
already in the `testdata` folder, backtesting will download them
|
|
|
|
automatically. Testdata files will not be updated until you specify it.
|
|
|
|
|
|
|
|
The result of backtesting will confirm you if your bot as more chance to
|
|
|
|
make a profit than a loss.
|
|
|
|
|
|
|
|
|
|
|
|
The backtesting is very easy with freqtrade.
|
|
|
|
|
|
|
|
### Run a backtesting against the currencies listed in your config file
|
|
|
|
**With 5 min tickers (Per default)**
|
|
|
|
```bash
|
|
|
|
python3 ./freqtrade/main.py backtesting --realistic-simulation
|
|
|
|
```
|
|
|
|
|
|
|
|
**With 1 min tickers**
|
|
|
|
```bash
|
2018-03-24 09:21:59 +00:00
|
|
|
python3 ./freqtrade/main.py backtesting --realistic-simulation --ticker-interval 1m
|
2018-01-03 06:43:00 +00:00
|
|
|
```
|
|
|
|
|
2018-04-30 21:27:05 +00:00
|
|
|
**Update cached pairs with the latest data**
|
2018-01-03 06:43:00 +00:00
|
|
|
```bash
|
|
|
|
python3 ./freqtrade/main.py backtesting --realistic-simulation --refresh-pairs-cached
|
|
|
|
```
|
|
|
|
|
|
|
|
**With live data (do not alter your testdata files)**
|
|
|
|
```bash
|
|
|
|
python3 ./freqtrade/main.py backtesting --realistic-simulation --live
|
|
|
|
```
|
|
|
|
|
2018-01-07 09:15:26 +00:00
|
|
|
**Using a different on-disk ticker-data source**
|
|
|
|
```bash
|
|
|
|
python3 ./freqtrade/main.py backtesting --datadir freqtrade/tests/testdata-20180101
|
|
|
|
```
|
|
|
|
|
2018-01-28 13:51:45 +00:00
|
|
|
**With a (custom) strategy file**
|
|
|
|
```bash
|
2018-05-26 17:09:20 +00:00
|
|
|
python3 ./freqtrade/main.py -s TestStrategy backtesting
|
2018-01-28 13:51:45 +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-01-11 14:45:39 +00:00
|
|
|
**Exporting trades to file**
|
|
|
|
```bash
|
2018-03-15 22:34:13 +00:00
|
|
|
python3 ./freqtrade/main.py backtesting --export trades
|
2018-01-11 14:45:39 +00:00
|
|
|
```
|
|
|
|
|
2018-06-03 17:41:34 +00:00
|
|
|
**Exporting trades to file specifying a custom filename**
|
|
|
|
```bash
|
|
|
|
python3 ./freqtrade/main.py backtesting --export trades --export-filename=backtest_teststrategy.json
|
|
|
|
```
|
|
|
|
|
|
|
|
|
2018-01-19 05:07:55 +00:00
|
|
|
**Running backtest with smaller testset**
|
|
|
|
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-01-10 23:14:36 +00:00
|
|
|
```bash
|
2018-01-15 21:25:02 +00:00
|
|
|
python3 ./freqtrade/main.py backtesting --timerange=-200
|
2018-01-10 23:14:36 +00:00
|
|
|
```
|
|
|
|
|
2018-01-19 05:07:55 +00:00
|
|
|
***Advanced use of timerange***
|
|
|
|
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:
|
|
|
|
- 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-01-19 05:07:55 +00:00
|
|
|
|
|
|
|
**Update testdata directory**
|
2018-01-13 16:39:36 +00:00
|
|
|
To update your testdata directory, or download into another testdata directory:
|
|
|
|
```bash
|
2018-01-19 05:07:55 +00:00
|
|
|
mkdir -p user_data/data/testdata-20180113
|
|
|
|
cp freqtrade/tests/testdata/pairs.json user_data/data-20180113
|
|
|
|
cd user_data/data-20180113
|
|
|
|
```
|
2018-01-13 16:39:36 +00:00
|
|
|
|
|
|
|
Possibly edit pairs.json file to include/exclude pairs
|
|
|
|
|
2018-01-19 05:07:55 +00:00
|
|
|
```bash
|
2018-03-15 22:34:13 +00:00
|
|
|
python3 freqtrade/tests/testdata/download_backtest_data.py -p pairs.json
|
2018-01-13 16:39:36 +00:00
|
|
|
```
|
|
|
|
|
|
|
|
The script will read your pairs.json file, and download ticker data
|
|
|
|
into the current working directory.
|
|
|
|
|
2018-01-10 23:14:36 +00:00
|
|
|
|
2018-01-03 06:43:00 +00:00
|
|
|
For help about backtesting usage, please refer to
|
|
|
|
[Backtesting commands](#backtesting-commands).
|
|
|
|
|
|
|
|
## Understand the backtesting result
|
|
|
|
The most important in the backtesting is to understand the result.
|
|
|
|
|
|
|
|
A backtesting result will look like that:
|
|
|
|
```
|
|
|
|
====================== BACKTESTING REPORT ================================
|
|
|
|
pair buy count avg profit % total profit BTC avg duration
|
|
|
|
-------- ----------- -------------- ------------------ --------------
|
2018-02-03 16:15:40 +00:00
|
|
|
ETH/BTC 56 -0.67 -0.00075455 62.3
|
|
|
|
LTC/BTC 38 -0.48 -0.00036315 57.9
|
|
|
|
ETC/BTC 42 -1.15 -0.00096469 67.0
|
|
|
|
DASH/BTC 72 -0.62 -0.00089368 39.9
|
|
|
|
ZEC/BTC 45 -0.46 -0.00041387 63.2
|
|
|
|
XLM/BTC 24 -0.88 -0.00041846 47.7
|
|
|
|
NXT/BTC 24 0.68 0.00031833 40.2
|
|
|
|
POWR/BTC 35 0.98 0.00064887 45.3
|
|
|
|
ADA/BTC 43 -0.39 -0.00032292 55.0
|
|
|
|
XMR/BTC 40 -0.40 -0.00032181 47.4
|
2018-01-03 06:43:00 +00:00
|
|
|
TOTAL 419 -0.41 -0.00348593 52.9
|
|
|
|
```
|
|
|
|
|
|
|
|
The last line will give you the overall performance of your strategy,
|
|
|
|
here:
|
|
|
|
```
|
|
|
|
TOTAL 419 -0.41 -0.00348593 52.9
|
|
|
|
```
|
|
|
|
|
|
|
|
We understand the bot has made `419` trades for an average duration of
|
|
|
|
`52.9` min, with a performance of `-0.41%` (loss), that means it has
|
|
|
|
lost a total of `-0.00348593 BTC`.
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
As for an example if your minimal_roi is only `"0": 0.01`. You cannot
|
|
|
|
expect the bot to make more profit than 1% (because it will sell every
|
|
|
|
time a trade will reach 1%).
|
|
|
|
```json
|
|
|
|
"minimal_roi": {
|
|
|
|
"0": 0.01
|
|
|
|
},
|
|
|
|
```
|
|
|
|
|
|
|
|
On the other hand, if you set a too high `minimal_roi` like `"0": 0.55`
|
|
|
|
(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
|
|
|
|
strategies, your configuration, and the crypto-currency you have set up.
|
|
|
|
|
|
|
|
## Next step
|
|
|
|
Great, your strategy is profitable. What if the bot can give your the
|
|
|
|
optimal parameters to use for your strategy?
|
2018-01-07 09:15:26 +00:00
|
|
|
Your next step is to learn [how to find optimal parameters with Hyperopt](https://github.com/gcarq/freqtrade/blob/develop/docs/hyperopt.md)
|