]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor(qav3): cleanups
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 2 Apr 2025 17:50:56 +0000 (19:50 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 2 Apr 2025 17:50:56 +0000 (19:50 +0200)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/user_data/freqaimodels/ReforceXY.py
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/QuickAdapterV3.py
quickadapter/user_data/strategies/Utils.py

index 10fdc61bbcdb97af0c50442a23258da5845c4252..1624805e36aa9e9db8d3fef0bc9a4a0951a49f00 100644 (file)
@@ -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
index 55c0fe6175d364fd51b797207f91e92445aaee4f..f0394cf5abf855489fd8d6ced507df8db3c7586a 100644 (file)
@@ -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(
index 8b5d1069a0743e20baa2ab519df5c74744cb76fe..8cad3a99a8f49ff7f1e9f12f8ebe2fc43617e104 100644 (file)
@@ -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
index 00b8a8274c47a0bfd901fd5f17e28030b1fafdbd..967ade14e88bf3c2106255d49c248fd215590aa3 100644 (file)
@@ -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)