Merge pull request #83 from gcarq/better-hyperopt-objective
Better hyperopt objective
This commit is contained in:
commit
a948142ef5
@ -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))
|
||||
|
@ -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']))
|
||||
|
Loading…
Reference in New Issue
Block a user