]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
fix(qav3): handle nan properly in smma() computation
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 1 Oct 2025 16:25:51 +0000 (18:25 +0200)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Wed, 1 Oct 2025 16:25:51 +0000 (18:25 +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 87e6663595a56d4efde8af6f1f57e609d85db8a6..3c207cb11b44c8f0d33d472932e9e7e0d1718991 100644 (file)
@@ -239,17 +239,20 @@ class ReforceXY(BaseReinforcementLearningModel):
             self.n_eval_envs = 1
         if self.multiprocessing and self.n_envs <= 1:
             logger.warning(
-                "User tried to use multiprocessing with n_envs=1. Deactivating multiprocessing"
+                "User tried to use multiprocessing with n_envs=%s. Deactivating multiprocessing",
+                self.n_envs,
             )
             self.multiprocessing = False
         if self.eval_multiprocessing and self.n_eval_envs <= 1:
             logger.warning(
-                "User tried to use eval_multiprocessing with n_eval_envs=1. Deactivating eval_multiprocessing"
+                "User tried to use eval_multiprocessing with n_eval_envs=%s. Deactivating eval_multiprocessing",
+                self.n_eval_envs,
             )
             self.eval_multiprocessing = False
         if self.multiprocessing and self.plot_new_best:
             logger.warning(
-                "User tried to use plot_new_best with multiprocessing. Deactivating plot_new_best"
+                "User tried to use plot_new_best with multiprocessing=%s. Deactivating plot_new_best",
+                self.multiprocessing,
             )
             self.plot_new_best = False
         if not isinstance(self.frame_stacking, int) or self.frame_stacking < 0:
@@ -264,13 +267,13 @@ class ReforceXY(BaseReinforcementLearningModel):
                 self.frame_stacking,
             )
             self.frame_stacking = 0
-        if self.n_eval_steps <= 0:
+        if not isinstance(self.n_eval_steps, int) or self.n_eval_steps <= 0:
             logger.warning(
                 "Invalid n_eval_steps=%s. Forcing n_eval_steps=10_000",
                 self.n_eval_steps,
             )
             self.n_eval_steps = 10_000
-        if self.n_eval_episodes <= 0:
+        if not isinstance(self.n_eval_episodes, int) or self.n_eval_episodes <= 0:
             logger.warning(
                 "Invalid n_eval_episodes=%s. Forcing n_eval_episodes=5",
                 self.n_eval_episodes,
@@ -285,8 +288,9 @@ class ReforceXY(BaseReinforcementLearningModel):
             self.rl_config["tensorboard_throttle"] = 1
         if self.continual_learning and self.frame_stacking:
             logger.warning(
-                "User tried to use continual_learning with frame_stacking. \
-                Deactivating continual_learning"
+                "User tried to use continual_learning with frame_stacking=%s. "
+                "Deactivating continual_learning",
+                self.frame_stacking,
             )
             self.continual_learning = False
 
index d4b971d42d17af6a6a31575b458335f68e0362b4..a465b87ed7e1b60814285ca266cdb7a1f91a78b6 100644 (file)
@@ -125,7 +125,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
             )
         if (
             not isinstance(self.freqai_info.get("identifier"), str)
-            or not self.freqai_info.get("identifier").strip()
+            or not self.freqai_info.get("identifier", "").strip()
         ):
             raise ValueError(
                 "FreqAI model requires 'identifier' defined in the freqai section configuration"
index 12fff9deac81432a2e122497ea211ca5995dad3b..6be13853fce7040d324f3361e6a62639ede540ce 100644 (file)
@@ -213,7 +213,7 @@ class QuickAdapterV3(IStrategy):
             )
         if (
             not isinstance(self.freqai_info.get("identifier"), str)
-            or not self.freqai_info.get("identifier").strip()
+            or not self.freqai_info.get("identifier", "").strip()
         ):
             raise ValueError(
                 "FreqAI strategy requires 'identifier' defined in the freqai section configuration"
index 9b22ec343408695815c7c162cdd89d893e7a296d..c8801a3124daec84779e2699ccd43cdaa3cee6e8 100644 (file)
@@ -387,7 +387,7 @@ def smma(series: pd.Series, period: int, zero_lag=False, offset=0) -> pd.Series:
     values = series.to_numpy()
 
     smma_values = np.full(n, np.nan)
-    smma_values[period - 1] = np.mean(values[:period])
+    smma_values[period - 1] = np.nanmean(values[:period])
     for i in range(period, n):
         smma_values[i] = (smma_values[i - 1] * (period - 1) + values[i]) / period