Update onlyprofit loss should use absolute profit

closes #4934
This commit is contained in:
Matthias 2021-05-28 08:38:46 +02:00
parent b740ed8064
commit 8a56af9192
2 changed files with 5 additions and 17 deletions

View File

@ -9,23 +9,11 @@ from pandas import DataFrame
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
# This is assumed to be expected avg profit * expected trade count.
# For example, for 0.35% avg per trade (or 0.0035 as ratio) and 1100 trades,
# expected max profit = 3.85
#
# Note, this is ratio. 3.85 stated above means 385Σ%, 3.0 means 300Σ%.
#
# In this implementation it's only used in calculation of the resulting value
# of the objective function as a normalization coefficient and does not
# represent any limit for profits as in the Freqtrade legacy default loss function.
EXPECTED_MAX_PROFIT = 3.0
class OnlyProfitHyperOptLoss(IHyperOptLoss): class OnlyProfitHyperOptLoss(IHyperOptLoss):
""" """
Defines the loss function for hyperopt. Defines the loss function for hyperopt.
This implementation takes only profit into account. This implementation takes only absolute profit into account, not looking at any other indicator.
""" """
@staticmethod @staticmethod
@ -34,5 +22,5 @@ class OnlyProfitHyperOptLoss(IHyperOptLoss):
""" """
Objective function, returns smaller number for better results. Objective function, returns smaller number for better results.
""" """
total_profit = results['profit_ratio'].sum() total_profit = results['profit_abs'].sum()
return 1 - total_profit / EXPECTED_MAX_PROFIT return -1 * total_profit

View File

@ -149,9 +149,9 @@ def test_sortino_loss_daily_prefers_higher_profits(default_conf, hyperopt_result
def test_onlyprofit_loss_prefers_higher_profits(default_conf, hyperopt_results) -> None: def test_onlyprofit_loss_prefers_higher_profits(default_conf, hyperopt_results) -> None:
results_over = hyperopt_results.copy() results_over = hyperopt_results.copy()
results_over['profit_ratio'] = hyperopt_results['profit_ratio'] * 2 results_over['profit_abs'] = hyperopt_results['profit_abs'] * 2
results_under = hyperopt_results.copy() results_under = hyperopt_results.copy()
results_under['profit_ratio'] = hyperopt_results['profit_ratio'] / 2 results_under['profit_abs'] = hyperopt_results['profit_abs'] / 2
default_conf.update({'hyperopt_loss': 'OnlyProfitHyperOptLoss'}) default_conf.update({'hyperopt_loss': 'OnlyProfitHyperOptLoss'})
hl = HyperOptLossResolver.load_hyperoptloss(default_conf) hl = HyperOptLossResolver.load_hyperoptloss(default_conf)