feat: add starting_balance as argument to hyperopt_loss_function

This commit is contained in:
Matthias
2024-12-03 19:15:57 +01:00
parent 7a8971b9b6
commit b0b73bf166
9 changed files with 17 additions and 20 deletions
@@ -28,6 +28,7 @@ from freqtrade.optimize.hyperopt_loss.hyperopt_loss_interface import IHyperOptLo
from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer, HyperoptTools from freqtrade.optimize.hyperopt_tools import HyperoptStateContainer, HyperoptTools
from freqtrade.optimize.optimize_reports import generate_strategy_stats from freqtrade.optimize.optimize_reports import generate_strategy_stats
from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver from freqtrade.resolvers.hyperopt_resolver import HyperOptLossResolver
from freqtrade.util.dry_run_wallet import get_dry_run_wallet
# Suppress scikit-learn FutureWarnings from skopt # Suppress scikit-learn FutureWarnings from skopt
@@ -363,6 +364,7 @@ class HyperOptimizer:
config=self.config, config=self.config,
processed=processed, processed=processed,
backtest_stats=strat_stats, backtest_stats=strat_stats,
starting_balance=get_dry_run_wallet(self.config),
) )
return { return {
"loss": loss, "loss": loss,
@@ -12,7 +12,6 @@ from pandas import DataFrame
from freqtrade.constants import Config from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_calmar from freqtrade.data.metrics import calculate_calmar
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util import get_dry_run_wallet
class CalmarHyperOptLoss(IHyperOptLoss): class CalmarHyperOptLoss(IHyperOptLoss):
@@ -29,6 +28,7 @@ class CalmarHyperOptLoss(IHyperOptLoss):
min_date: datetime, min_date: datetime,
max_date: datetime, max_date: datetime,
config: Config, config: Config,
starting_balance: float,
*args, *args,
**kwargs, **kwargs,
) -> float: ) -> float:
@@ -37,7 +37,6 @@ class CalmarHyperOptLoss(IHyperOptLoss):
Uses Calmar Ratio calculation. Uses Calmar Ratio calculation.
""" """
starting_balance = get_dry_run_wallet(config)
calmar_ratio = calculate_calmar(results, min_date, max_date, starting_balance) calmar_ratio = calculate_calmar(results, min_date, max_date, starting_balance)
# print(expected_returns_mean, max_drawdown, calmar_ratio) # print(expected_returns_mean, max_drawdown, calmar_ratio)
return -calmar_ratio return -calmar_ratio
@@ -31,6 +31,7 @@ class IHyperOptLoss(ABC):
config: Config, config: Config,
processed: dict[str, DataFrame], processed: dict[str, DataFrame],
backtest_stats: dict[str, Any], backtest_stats: dict[str, Any],
starting_balance: float,
**kwargs, **kwargs,
) -> float: ) -> float:
""" """
@@ -10,7 +10,6 @@ from pandas import DataFrame
from freqtrade.constants import Config from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_underwater from freqtrade.data.metrics import calculate_underwater
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util import get_dry_run_wallet
class MaxDrawDownRelativeHyperOptLoss(IHyperOptLoss): class MaxDrawDownRelativeHyperOptLoss(IHyperOptLoss):
@@ -22,7 +21,9 @@ class MaxDrawDownRelativeHyperOptLoss(IHyperOptLoss):
""" """
@staticmethod @staticmethod
def hyperopt_loss_function(results: DataFrame, config: Config, *args, **kwargs) -> float: def hyperopt_loss_function(
results: DataFrame, config: Config, starting_balance: float, *args, **kwargs
) -> float:
""" """
Objective function. Objective function.
@@ -32,7 +33,7 @@ class MaxDrawDownRelativeHyperOptLoss(IHyperOptLoss):
total_profit = results["profit_abs"].sum() total_profit = results["profit_abs"].sum()
try: try:
drawdown_df = calculate_underwater( drawdown_df = calculate_underwater(
results, value_col="profit_abs", starting_balance=get_dry_run_wallet(config) results, value_col="profit_abs", starting_balance=starting_balance
) )
max_drawdown = abs(min(drawdown_df["drawdown"])) max_drawdown = abs(min(drawdown_df["drawdown"]))
relative_drawdown = max(drawdown_df["drawdown_relative"]) relative_drawdown = max(drawdown_df["drawdown_relative"])
@@ -36,7 +36,6 @@ from pandas import DataFrame
from freqtrade.constants import Config from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_expectancy, calculate_max_drawdown from freqtrade.data.metrics import calculate_expectancy, calculate_max_drawdown
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util import get_dry_run_wallet
# smaller numbers penalize drawdowns more severely # smaller numbers penalize drawdowns more severely
@@ -59,6 +58,7 @@ class MultiMetricHyperOptLoss(IHyperOptLoss):
results: DataFrame, results: DataFrame,
trade_count: int, trade_count: int,
config: Config, config: Config,
starting_balance: float,
**kwargs, **kwargs,
) -> float: ) -> float:
total_profit = results["profit_abs"].sum() total_profit = results["profit_abs"].sum()
@@ -84,7 +84,7 @@ class MultiMetricHyperOptLoss(IHyperOptLoss):
# Calculate drawdown # Calculate drawdown
try: try:
drawdown = calculate_max_drawdown( drawdown = calculate_max_drawdown(
results, starting_balance=get_dry_run_wallet(config), value_col="profit_abs" results, starting_balance=starting_balance, value_col="profit_abs"
) )
relative_account_drawdown = drawdown.relative_account_drawdown relative_account_drawdown = drawdown.relative_account_drawdown
except ValueError: except ValueError:
@@ -13,7 +13,6 @@ from pandas import DataFrame
from freqtrade.constants import Config from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_max_drawdown from freqtrade.data.metrics import calculate_max_drawdown
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util import get_dry_run_wallet
# smaller numbers penalize drawdowns more severely # smaller numbers penalize drawdowns more severely
@@ -22,12 +21,14 @@ DRAWDOWN_MULT = 0.075
class ProfitDrawDownHyperOptLoss(IHyperOptLoss): class ProfitDrawDownHyperOptLoss(IHyperOptLoss):
@staticmethod @staticmethod
def hyperopt_loss_function(results: DataFrame, config: Config, *args, **kwargs) -> float: def hyperopt_loss_function(
results: DataFrame, config: Config, starting_balance: float, *args, **kwargs
) -> float:
total_profit = results["profit_abs"].sum() total_profit = results["profit_abs"].sum()
try: try:
drawdown = calculate_max_drawdown( drawdown = calculate_max_drawdown(
results, starting_balance=get_dry_run_wallet(config), value_col="profit_abs" results, starting_balance=starting_balance, value_col="profit_abs"
) )
relative_account_drawdown = drawdown.relative_account_drawdown relative_account_drawdown = drawdown.relative_account_drawdown
except ValueError: except ValueError:
@@ -9,10 +9,8 @@ from datetime import datetime
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_sharpe from freqtrade.data.metrics import calculate_sharpe
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util.dry_run_wallet import get_dry_run_wallet
class SharpeHyperOptLoss(IHyperOptLoss): class SharpeHyperOptLoss(IHyperOptLoss):
@@ -25,10 +23,9 @@ class SharpeHyperOptLoss(IHyperOptLoss):
@staticmethod @staticmethod
def hyperopt_loss_function( def hyperopt_loss_function(
results: DataFrame, results: DataFrame,
trade_count: int,
min_date: datetime, min_date: datetime,
max_date: datetime, max_date: datetime,
config: Config, starting_balance: float,
*args, *args,
**kwargs, **kwargs,
) -> float: ) -> float:
@@ -37,7 +34,6 @@ class SharpeHyperOptLoss(IHyperOptLoss):
Uses Sharpe Ratio calculation. Uses Sharpe Ratio calculation.
""" """
starting_balance = get_dry_run_wallet(config)
sharp_ratio = calculate_sharpe(results, min_date, max_date, starting_balance) sharp_ratio = calculate_sharpe(results, min_date, max_date, starting_balance)
# print(expected_returns_mean, up_stdev, sharp_ratio) # print(expected_returns_mean, up_stdev, sharp_ratio)
return -sharp_ratio return -sharp_ratio
@@ -9,10 +9,8 @@ from datetime import datetime
from pandas import DataFrame from pandas import DataFrame
from freqtrade.constants import Config
from freqtrade.data.metrics import calculate_sortino from freqtrade.data.metrics import calculate_sortino
from freqtrade.optimize.hyperopt import IHyperOptLoss from freqtrade.optimize.hyperopt import IHyperOptLoss
from freqtrade.util import get_dry_run_wallet
class SortinoHyperOptLoss(IHyperOptLoss): class SortinoHyperOptLoss(IHyperOptLoss):
@@ -25,10 +23,9 @@ class SortinoHyperOptLoss(IHyperOptLoss):
@staticmethod @staticmethod
def hyperopt_loss_function( def hyperopt_loss_function(
results: DataFrame, results: DataFrame,
trade_count: int,
min_date: datetime, min_date: datetime,
max_date: datetime, max_date: datetime,
config: Config, starting_balance: float,
*args, *args,
**kwargs, **kwargs,
) -> float: ) -> float:
@@ -37,7 +34,6 @@ class SortinoHyperOptLoss(IHyperOptLoss):
Uses Sortino Ratio calculation. Uses Sortino Ratio calculation.
""" """
starting_balance = get_dry_run_wallet(config)
sortino_ratio = calculate_sortino(results, min_date, max_date, starting_balance) sortino_ratio = calculate_sortino(results, min_date, max_date, starting_balance)
# print(expected_returns_mean, down_stdev, sortino_ratio) # print(expected_returns_mean, down_stdev, sortino_ratio)
return -sortino_ratio return -sortino_ratio
+1
View File
@@ -116,6 +116,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()},
starting_balance=default_conf["dry_run_wallet"],
) )
over = hl.hyperopt_loss_function( over = hl.hyperopt_loss_function(
results_over, results_over,