Merge pull request #83 from gcarq/better-hyperopt-objective

Better hyperopt objective
This commit is contained in:
Michael Egger 2017-10-29 14:13:44 +01:00 committed by GitHub
commit a948142ef5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 32 additions and 21 deletions

View File

@ -13,17 +13,17 @@ from freqtrade.persistence import Trade
logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot logging.disable(logging.DEBUG) # disable debug logs that slow backtesting a lot
def print_results(results): def format_results(results):
print('Made {} buys. Average profit {:.2f}%. Total profit was {:.3f}. Average duration {:.1f} mins.'.format( return 'Made {} buys. Average profit {:.2f}%. Total profit was {:.3f}. Average duration {:.1f} mins.'.format(
len(results.index), len(results.index),
results.profit.mean() * 100.0, results.profit.mean() * 100.0,
results.profit.sum(), results.profit.sum(),
results.duration.mean() * 5 results.duration.mean() * 5
)) )
def print_pair_results(pair, results): def print_pair_results(pair, results):
print('For currency {}:'.format(pair)) print('For currency {}:'.format(pair))
print_results(results[results.currency == pair]) print(format_results(results[results.currency == pair]))
@pytest.fixture @pytest.fixture
def pairs(): def pairs():
@ -77,4 +77,4 @@ def test_backtest(conf, pairs, mocker, report=True):
print('====================== BACKTESTING REPORT ================================') print('====================== BACKTESTING REPORT ================================')
[print_pair_results(pair, results) for pair in pairs] [print_pair_results(pair, results) for pair in pairs]
print('TOTAL OVER ALL TRADES:') print('TOTAL OVER ALL TRADES:')
print_results(results) print(format_results(results))

View File

@ -1,24 +1,23 @@
# pragma pylint: disable=missing-docstring # pragma pylint: disable=missing-docstring
import json from operator import itemgetter
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
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.tests.test_backtesting import backtest, format_results
from freqtrade.main import should_sell
from freqtrade.persistence import Trade
from freqtrade.tests.test_backtesting import backtest, print_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',
@ -83,13 +82,20 @@ def test_hyperopt(conf, pairs, mocker):
mocker.patch('freqtrade.analyze.populate_buy_trend', side_effect=buy_strategy) mocker.patch('freqtrade.analyze.populate_buy_trend', side_effect=buy_strategy)
results = backtest(conf, pairs, mocker) 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 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', [
@ -130,4 +136,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']))