39 lines
1.1 KiB
Python
39 lines
1.1 KiB
Python
"""
|
|
ProfitDrawDownHyperOptLoss
|
|
|
|
This module defines the alternative HyperOptLoss class based on Profit &
|
|
Drawdown objective which can be used for Hyperoptimization.
|
|
|
|
Possible to change `DRAWDOWN_MULT` to penalize drawdown objective for
|
|
individual needs.
|
|
"""
|
|
|
|
from pandas import DataFrame
|
|
|
|
from freqtrade.data.metrics import calculate_max_drawdown
|
|
from freqtrade.optimize.hyperopt import IHyperOptLoss
|
|
|
|
|
|
# smaller numbers penalize drawdowns more severely
|
|
DRAWDOWN_MULT = 0.075
|
|
|
|
|
|
class ProfitDrawDownHyperOptLoss(IHyperOptLoss):
|
|
@staticmethod
|
|
def hyperopt_loss_function(
|
|
results: DataFrame, starting_balance: float, *args, **kwargs
|
|
) -> float:
|
|
total_profit = results["profit_abs"].sum()
|
|
|
|
try:
|
|
drawdown = calculate_max_drawdown(
|
|
results, starting_balance=starting_balance, value_col="profit_abs"
|
|
)
|
|
relative_account_drawdown = drawdown.relative_account_drawdown
|
|
except ValueError:
|
|
relative_account_drawdown = 0
|
|
|
|
return -1 * (
|
|
total_profit - (relative_account_drawdown * total_profit) * (1 - DRAWDOWN_MULT)
|
|
)
|