Add ProfitDrawdownHyperoptLoss method
This commit is contained in:
parent
6ed237a72a
commit
0b01fcf047
@ -116,7 +116,7 @@ optional arguments:
|
|||||||
ShortTradeDurHyperOptLoss, OnlyProfitHyperOptLoss,
|
ShortTradeDurHyperOptLoss, OnlyProfitHyperOptLoss,
|
||||||
SharpeHyperOptLoss, SharpeHyperOptLossDaily,
|
SharpeHyperOptLoss, SharpeHyperOptLossDaily,
|
||||||
SortinoHyperOptLoss, SortinoHyperOptLossDaily,
|
SortinoHyperOptLoss, SortinoHyperOptLossDaily,
|
||||||
CalmarHyperOptLoss, MaxDrawDownHyperOptLoss
|
CalmarHyperOptLoss, MaxDrawDownHyperOptLoss, ProfitDrawDownHyperOptLoss
|
||||||
--disable-param-export
|
--disable-param-export
|
||||||
Disable automatic hyperopt parameter export.
|
Disable automatic hyperopt parameter export.
|
||||||
--ignore-missing-spaces, --ignore-unparameterized-spaces
|
--ignore-missing-spaces, --ignore-unparameterized-spaces
|
||||||
@ -525,6 +525,7 @@ Currently, the following loss functions are builtin:
|
|||||||
* `SortinoHyperOptLossDaily` - optimizes Sortino Ratio calculated on **daily** trade returns relative to **downside** standard deviation.
|
* `SortinoHyperOptLossDaily` - optimizes Sortino Ratio calculated on **daily** trade returns relative to **downside** standard deviation.
|
||||||
* `MaxDrawDownHyperOptLoss` - Optimizes Maximum drawdown.
|
* `MaxDrawDownHyperOptLoss` - Optimizes Maximum drawdown.
|
||||||
* `CalmarHyperOptLoss` - Optimizes Calmar Ratio calculated on trade returns relative to max drawdown.
|
* `CalmarHyperOptLoss` - Optimizes Calmar Ratio calculated on trade returns relative to max drawdown.
|
||||||
|
* `ProfitDrawDownHyperOptLoss` - Optimizes by max Profit & min Drawdown objective. `DRAWDOWN_MULT` variable within the hyperoptloss file can be adjusted to be stricter or more flexible on drawdown purposes.
|
||||||
|
|
||||||
Creation of a custom loss function is covered in the [Advanced Hyperopt](advanced-hyperopt.md) part of the documentation.
|
Creation of a custom loss function is covered in the [Advanced Hyperopt](advanced-hyperopt.md) part of the documentation.
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ HYPEROPT_LOSS_BUILTIN = ['ShortTradeDurHyperOptLoss', 'OnlyProfitHyperOptLoss',
|
|||||||
'SharpeHyperOptLoss', 'SharpeHyperOptLossDaily',
|
'SharpeHyperOptLoss', 'SharpeHyperOptLossDaily',
|
||||||
'SortinoHyperOptLoss', 'SortinoHyperOptLossDaily',
|
'SortinoHyperOptLoss', 'SortinoHyperOptLossDaily',
|
||||||
'CalmarHyperOptLoss',
|
'CalmarHyperOptLoss',
|
||||||
'MaxDrawDownHyperOptLoss']
|
'MaxDrawDownHyperOptLoss', 'ProfitDrawDownHyperOptLoss']
|
||||||
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList',
|
AVAILABLE_PAIRLISTS = ['StaticPairList', 'VolumePairList',
|
||||||
'AgeFilter', 'OffsetFilter', 'PerformanceFilter',
|
'AgeFilter', 'OffsetFilter', 'PerformanceFilter',
|
||||||
'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter',
|
'PrecisionFilter', 'PriceFilter', 'RangeStabilityFilter',
|
||||||
|
29
freqtrade/optimize/hyperopt_loss_profit_drawdown.py
Normal file
29
freqtrade/optimize/hyperopt_loss_profit_drawdown.py
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
"""
|
||||||
|
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.optimize.hyperopt import IHyperOptLoss
|
||||||
|
from freqtrade.data.btanalysis import calculate_max_drawdown
|
||||||
|
|
||||||
|
# higher numbers penalize drawdowns more severely
|
||||||
|
DRAWDOWN_MULT = 0.075
|
||||||
|
|
||||||
|
|
||||||
|
class ProfitDrawDownHyperOptLoss(IHyperOptLoss):
|
||||||
|
@staticmethod
|
||||||
|
def hyperopt_loss_function(results: DataFrame, trade_count: int, *args, **kwargs) -> float:
|
||||||
|
total_profit = results["profit_abs"].sum()
|
||||||
|
|
||||||
|
# from freqtrade.optimize.optimize_reports.generate_strategy_stats()
|
||||||
|
try:
|
||||||
|
_, _, _, _, max_drawdown_per = calculate_max_drawdown(results, value_col="profit_ratio")
|
||||||
|
except ValueError:
|
||||||
|
max_drawdown_per = 0
|
||||||
|
|
||||||
|
return -1 * (total_profit * (1 - max_drawdown_per * DRAWDOWN_MULT))
|
@ -86,6 +86,7 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) ->
|
|||||||
"SharpeHyperOptLossDaily",
|
"SharpeHyperOptLossDaily",
|
||||||
"MaxDrawDownHyperOptLoss",
|
"MaxDrawDownHyperOptLoss",
|
||||||
"CalmarHyperOptLoss",
|
"CalmarHyperOptLoss",
|
||||||
|
"ProfitDrawDownHyperOptLoss",
|
||||||
|
|
||||||
])
|
])
|
||||||
def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunction) -> None:
|
def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunction) -> None:
|
||||||
@ -106,7 +107,7 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
|
|||||||
config=default_conf,
|
config=default_conf,
|
||||||
processed=None,
|
processed=None,
|
||||||
backtest_stats={'profit_total': hyperopt_results['profit_abs'].sum()}
|
backtest_stats={'profit_total': hyperopt_results['profit_abs'].sum()}
|
||||||
)
|
)
|
||||||
over = hl.hyperopt_loss_function(
|
over = hl.hyperopt_loss_function(
|
||||||
results_over,
|
results_over,
|
||||||
trade_count=len(results_over),
|
trade_count=len(results_over),
|
||||||
|
Loading…
Reference in New Issue
Block a user