Merge pull request #11618 from mrpabloyeah/hyperopt_loss_max_drawdown_per_pair

Add new loss function based on profit/drawdown ratio per pair
This commit is contained in:
Matthias
2025-04-10 07:14:34 +02:00
committed by GitHub
5 changed files with 103 additions and 3 deletions
+41 -3
View File
@@ -153,6 +153,7 @@ def test_loss_calculation_has_limited_profit(hyperopt_conf, hyperopt_results) ->
"SharpeHyperOptLossDaily",
"MaxDrawDownHyperOptLoss",
"MaxDrawDownRelativeHyperOptLoss",
"MaxDrawDownPerPairHyperOptLoss",
"CalmarHyperOptLoss",
"ProfitDrawDownHyperOptLoss",
"MultiMetricHyperOptLoss",
@@ -165,6 +166,34 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
results_under = hyperopt_results.copy()
results_under["profit_abs"] = hyperopt_results["profit_abs"] / 2 - 0.2
results_under["profit_ratio"] = hyperopt_results["profit_ratio"] / 2
pair_results = [
{
"key": "ETH/USDT",
"max_drawdown_abs": 50.0,
"profit_total_abs": 100.0,
},
{
"key": "BTC/USDT",
"max_drawdown_abs": 50.0,
"profit_total_abs": 100.0,
},
]
pair_results_over = [
{
**p,
"max_drawdown_abs": p["max_drawdown_abs"] * 0.5,
"profit_total_abs": p["profit_total_abs"] * 2,
}
for p in pair_results
]
pair_results_under = [
{
**p,
"max_drawdown_abs": p["max_drawdown_abs"] * 2,
"profit_total_abs": p["profit_total_abs"] * 0.5,
}
for p in pair_results
]
default_conf.update({"hyperopt_loss": lossfunction})
hl = HyperOptLossResolver.load_hyperoptloss(default_conf)
@@ -175,7 +204,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": hyperopt_results["profit_abs"].sum()},
backtest_stats={
"profit_total": hyperopt_results["profit_abs"].sum(),
"results_per_pair": pair_results,
},
starting_balance=default_conf["dry_run_wallet"],
)
over = hl.hyperopt_loss_function(
@@ -185,7 +217,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": results_over["profit_abs"].sum()},
backtest_stats={
"profit_total": results_over["profit_abs"].sum(),
"results_per_pair": pair_results_over,
},
starting_balance=default_conf["dry_run_wallet"],
)
under = hl.hyperopt_loss_function(
@@ -195,7 +230,10 @@ def test_loss_functions_better_profits(default_conf, hyperopt_results, lossfunct
max_date=datetime(2019, 5, 1),
config=default_conf,
processed=None,
backtest_stats={"profit_total": results_under["profit_abs"].sum()},
backtest_stats={
"profit_total": results_under["profit_abs"].sum(),
"results_per_pair": pair_results_under,
},
starting_balance=default_conf["dry_run_wallet"],
)
assert over < correct