From: Jérôme Benoit Date: Wed, 2 Apr 2025 17:50:56 +0000 (+0200) Subject: refactor(qav3): cleanups X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=4b10eb8492e90e593123c6c823b25464a3483067;p=freqai-strategies.git refactor(qav3): cleanups Signed-off-by: Jérôme Benoit --- diff --git a/ReforceXY/user_data/freqaimodels/ReforceXY.py b/ReforceXY/user_data/freqaimodels/ReforceXY.py index 10fdc61..1624805 100644 --- a/ReforceXY/user_data/freqaimodels/ReforceXY.py +++ b/ReforceXY/user_data/freqaimodels/ReforceXY.py @@ -486,7 +486,7 @@ class ReforceXY(BaseReinforcementLearningModel): output = output.rolling(window=self.CONV_WIDTH).apply(_predict) return output - def get_storage(self, pair: Optional[str] = None) -> Optional[BaseStorage]: + def get_storage(self, pair: Optional[str] = None) -> BaseStorage: """ Get the storage for Optuna """ @@ -499,6 +499,10 @@ class ReforceXY(BaseReinforcementLearningModel): storage = JournalStorage( JournalFileBackend(f"{storage_dir}/{storage_filename}.log") ) + else: + raise ValueError( + f"Unsupported storage backend: {storage_backend}. Supported backends are: 'sqlite' and 'file'." + ) return storage @staticmethod diff --git a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py index 55c0fe6..f0394cf 100644 --- a/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py +++ b/quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py @@ -345,7 +345,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): return time_spent = time.time() - start_time - if self.optuna_study_has_best_params(study): + if QuickAdapterRegressorV3.optuna_study_has_best_params(study): params_storage[pair] = study.best_params rmse_storage[pair] = study.best_value logger.info(f"Optuna {namespace} hyperopt done ({time_spent:.2f} secs)") @@ -360,7 +360,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel): f"Optuna {namespace} hyperopt failed ({time_spent:.2f} secs): no study best params found" ) - def optuna_storage(self, pair: str) -> Optional[optuna.storages.BaseStorage]: + def optuna_storage(self, pair: str) -> optuna.storages.BaseStorage: storage_dir = self.full_path storage_filename = f"optuna-{pair.split('/')[0]}" storage_backend = self.__optuna_config.get("storage") @@ -372,18 +372,26 @@ class QuickAdapterRegressorV3(BaseRegressionModel): f"{storage_dir}/{storage_filename}.log" ) ) + else: + raise ValueError( + f"Unsupported optuna storage backend: {storage_backend}. Supported backends are 'sqlite' and 'file'." + ) return storage def optuna_create_study( self, study_name: str, pair: str ) -> Optional[optuna.study.Study]: - storage = self.optuna_storage(pair) - if storage is None: - logger.error(f"Failed to create optuna storage for {study_name}") + try: + storage = self.optuna_storage(pair) + except Exception as e: + logger.error( + f"Failed to create optuna storage for {study_name}: {str(e)}", + exc_info=True, + ) return None if self.__optuna_config.get("continuous"): - self.optuna_study_delete(study_name, storage) + QuickAdapterRegressorV3.optuna_study_delete(study_name, storage) try: return optuna.create_study( diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 8b5d106..8cad3a9 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -462,11 +462,7 @@ class QuickAdapterV3(IStrategy): @staticmethod def is_trade_duration_valid(trade_duration_candles: int) -> bool: - if isna(trade_duration_candles): - return False - if trade_duration_candles == 0: - return False - return True + return not (isna(trade_duration_candles) or trade_duration_candles <= 0) def get_stoploss_distance( self, df: DataFrame, trade: Trade, current_rate: float diff --git a/quickadapter/user_data/strategies/Utils.py b/quickadapter/user_data/strategies/Utils.py index 00b8a82..967ade1 100644 --- a/quickadapter/user_data/strategies/Utils.py +++ b/quickadapter/user_data/strategies/Utils.py @@ -1,13 +1,15 @@ import numpy as np import pandas as pd import talib.abstract as ta -from typing import Callable +from typing import Callable, Union from scipy.signal import convolve from scipy.signal.windows import gaussian from technical import qtpylib -def get_distance(p1: pd.Series | float, p2: pd.Series | float) -> pd.Series | float: +def get_distance( + p1: Union[pd.Series, float], p2: Union[pd.Series, float] +) -> Union[pd.Series, float]: return abs(p1 - p2)