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
|
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))
|
||||||
|
@ -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']))
|
||||||
|
Loading…
Reference in New Issue
Block a user