diff --git a/freqtrade/tests/test_backtesting.py b/freqtrade/tests/test_backtesting.py index 3af459ee4..fa2af3511 100644 --- a/freqtrade/tests/test_backtesting.py +++ b/freqtrade/tests/test_backtesting.py @@ -13,17 +13,17 @@ from freqtrade.persistence import Trade logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot -def print_results(results): - print('Made {} buys. Average profit {:.2f}%. Total profit was {:.3f}. Average duration {:.1f} mins.'.format( +def format_results(results): + return 'Made {} buys. Average profit {:.2f}%. Total profit was {:.3f}. Average duration {:.1f} mins.'.format( len(results.index), results.profit.mean() * 100.0, results.profit.sum(), results.duration.mean() * 5 - )) + ) def print_pair_results(pair, results): print('For currency {}:'.format(pair)) - print_results(results[results.currency == pair]) + print(format_results(results[results.currency == pair])) @pytest.fixture def pairs(): @@ -77,4 +77,4 @@ def test_backtest(conf, pairs, mocker, report=True): print('====================== BACKTESTING REPORT ================================') [print_pair_results(pair, results) for pair in pairs] print('TOTAL OVER ALL TRADES:') - print_results(results) + print(format_results(results)) diff --git a/freqtrade/tests/test_hyperopt.py b/freqtrade/tests/test_hyperopt.py index ceefb06ac..fa1c0fab1 100644 --- a/freqtrade/tests/test_hyperopt.py +++ b/freqtrade/tests/test_hyperopt.py @@ -1,24 +1,23 @@ # pragma pylint: disable=missing-docstring -import json +from operator import itemgetter import logging import os from functools import reduce - +from math import exp import pytest -import arrow from pandas import DataFrame from qtpylib.indicators import crossed_above -from hyperopt import fmin, tpe, hp +from hyperopt import fmin, tpe, hp, Trials, STATUS_OK -from freqtrade.analyze import analyze_ticker -from freqtrade.main import should_sell -from freqtrade.persistence import Trade - -from freqtrade.tests.test_backtesting import backtest, print_results +from freqtrade.tests.test_backtesting import backtest, format_results logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot +# set TARGET_TRADES to suit your number concurrent trades so its realistic to 20days of data +TARGET_TRADES = 1200 + + @pytest.fixture def pairs(): return ['btc-neo', 'btc-eth', 'btc-omg', 'btc-edg', 'btc-pay', @@ -83,13 +82,20 @@ def test_hyperopt(conf, pairs, mocker): mocker.patch('freqtrade.analyze.populate_buy_trend', side_effect=buy_strategy) results = backtest(conf, pairs, mocker) - print_results(results) + result = format_results(results) + print(result) - # set the value below to suit your number concurrent trades so its realistic to 20days of data - TARGET_TRADES = 1200 - if results.profit.sum() == 0 or results.profit.mean() == 0: - return 49999999999 # avoid division by zero, return huge value to discard result - return abs(len(results.index) - 1200.1) / (results.profit.sum() ** 2) * results.duration.mean() # the smaller the better + total_profit = results.profit.sum() * 1000 + trade_count = len(results.index) + + trade_loss = 1 - 0.8 * exp(-(trade_count - TARGET_TRADES) ** 2 / 10 ** 5) + profit_loss = exp(-total_profit**3 / 10**11) + + return { + 'loss': trade_loss + profit_loss, + 'status': STATUS_OK, + 'result': result + } space = { 'mfi': hp.choice('mfi', [ @@ -130,4 +136,9 @@ def test_hyperopt(conf, pairs, mocker): {'type': 'ao_cross_zero'} ]), } - print('Best parameters {}'.format(fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=40))) + trials = Trials() + best = fmin(fn=optimizer, space=space, algo=tpe.suggest, max_evals=40, trials=trials) + print('\n\n\n\n====================== HYPEROPT BACKTESTING REPORT ================================') + print('Best parameters {}'.format(best)) + newlist = sorted(trials.results, key=itemgetter('loss')) + print('Result: {}'.format(newlist[0]['result']))