store result strings, display best result in summary. switch to a lot better objective algo

This commit is contained in:
Janne Sinivirta 2017-10-28 15:22:15 +03:00
parent 08ca7a8166
commit 649781d823

View File

@ -1,15 +1,17 @@
# pragma pylint: disable=missing-docstring # pragma pylint: disable=missing-docstring
from operator import itemgetter
import json import json
import logging import logging
import os import os
from functools import reduce from functools import reduce
from math import exp
import pytest import pytest
import arrow import arrow
from pandas import DataFrame from pandas import DataFrame
from qtpylib.indicators import crossed_above 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.analyze import analyze_ticker
from freqtrade.main import should_sell from freqtrade.main import should_sell
@ -19,6 +21,10 @@ from freqtrade.tests.test_backtesting import backtest, format_results
logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot 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 @pytest.fixture
def pairs(): def pairs():
return ['btc-neo', 'btc-eth', 'btc-omg', 'btc-edg', 'btc-pay', return ['btc-neo', 'btc-eth', 'btc-omg', 'btc-edg', 'btc-pay',
@ -86,11 +92,17 @@ def test_hyperopt(conf, pairs, mocker):
result = format_results(results) result = format_results(results)
print(result) print(result)
# set TARGET_TRADES to suit your number concurrent trades so its realistic to 20days of data total_profit = results.profit.sum() * 1000
TARGET_TRADES = 1200 trade_count = len(results.index)
if results.profit.sum() == 0 or results.profit.mean() == 0:
return 49999999999 # avoid division by zero, return huge value to discard result trade_loss = 1 - 0.8 * exp(-(trade_count - TARGET_TRADES) ** 2 / 10 ** 5)
return abs(len(results.index) - 1200.1) / (results.profit.sum() ** 2) * results.duration.mean() # the smaller the better profit_loss = exp(-total_profit**3 / 10**11)
return {
'loss': trade_loss + profit_loss,
'status': STATUS_OK,
'result': result
}
space = { space = {
'mfi': hp.choice('mfi', [ 'mfi': hp.choice('mfi', [
@ -131,4 +143,9 @@ def test_hyperopt(conf, pairs, mocker):
{'type': 'ao_cross_zero'} {'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']))