stable/docs/backtesting.md
2018-06-03 19:41:34 +02:00

6.2 KiB

Backtesting

This page explains how to validate your strategy performance by using Backtesting.

Table of Contents

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.

Backtesting will use the crypto-currencies (pair) from your config file and load static tickers located in /freqtrade/tests/testdata.
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)

python3 ./freqtrade/main.py backtesting --realistic-simulation

With 1 min tickers

python3 ./freqtrade/main.py backtesting --realistic-simulation --ticker-interval 1m

Update cached pairs with the latest data

python3 ./freqtrade/main.py backtesting --realistic-simulation --refresh-pairs-cached

With live data (do not alter your testdata files)

python3 ./freqtrade/main.py backtesting --realistic-simulation --live

Using a different on-disk ticker-data source

python3 ./freqtrade/main.py backtesting --datadir freqtrade/tests/testdata-20180101

With a (custom) strategy file

python3 ./freqtrade/main.py -s TestStrategy backtesting

Where -s TestStrategy refers to the class name within the strategy file test_strategy.py found in the freqtrade/user_data/strategies directory

Exporting trades to file

python3 ./freqtrade/main.py backtesting --export trades

Exporting trades to file specifying a custom filename

python3 ./freqtrade/main.py backtesting --export trades --export-filename=backtest_teststrategy.json

Running backtest with smaller testset
Use the --timerange argument to change how much of the testset you want to use. The last N ticks/timeframes will be used.

Example:

python3 ./freqtrade/main.py backtesting --timerange=-200

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
  • 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
  • Use tickframes between POSIX timestamps 1527595200 1527618600: --timerange=1527595200-1527618600

Update testdata directory To update your testdata directory, or download into another testdata directory:

mkdir -p user_data/data/testdata-20180113
cp freqtrade/tests/testdata/pairs.json user_data/data-20180113
cd user_data/data-20180113

Possibly edit pairs.json file to include/exclude pairs

python3 freqtrade/tests/testdata/download_backtest_data.py -p pairs.json

The script will read your pairs.json file, and download ticker data into the current working directory.

For help about backtesting usage, please refer to 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
--------  -----------  --------------  ------------------  --------------
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
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%).

"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?
Your next step is to learn how to find optimal parameters with Hyperopt