]> Piment Noir Git Repositories - freqai-strategies.git/commitdiff
refactor: improve type hints
authorJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 23 Nov 2025 21:59:46 +0000 (22:59 +0100)
committerJérôme Benoit <jerome.benoit@piment-noir.org>
Sun, 23 Nov 2025 21:59:46 +0000 (22:59 +0100)
Signed-off-by: Jérôme Benoit <jerome.benoit@piment-noir.org>
ReforceXY/.devcontainer/requirements-dev.txt
ReforceXY/user_data/freqaimodels/ReforceXY.py
quickadapter/.devcontainer/requirements-dev.txt
quickadapter/user_data/freqaimodels/QuickAdapterRegressorV3.py
quickadapter/user_data/strategies/Utils.py

index af3ee5763862e3daa29c9085c29d1c64cc60edd5..73e773645c35972e4c7d929151d4ebb8c161643d 100644 (file)
@@ -1 +1,4 @@
+pandas-stubs
+scipy-stubs
+uv
 ruff
index 78c31b6a5d3a7a72f058768b2744f28242b1054b..3f22e9c929586e353eb92583144b45d5e9e89345 100644 (file)
@@ -52,6 +52,7 @@ from optuna.storages import (
 )
 from optuna.storages.journal import JournalFileBackend
 from optuna.study import Study, StudyDirection
+from optuna.study.study import ObjectiveFuncType
 from pandas import DataFrame, merge
 from sb3_contrib.common.maskable.callbacks import MaskableEvalCallback
 from sb3_contrib.common.maskable.utils import is_masking_supported
@@ -1159,8 +1160,11 @@ class ReforceXY(BaseReinforcementLearningModel):
         hyperopt_failed = False
         start_time = time.time()
         try:
+            objective: ObjectiveFuncType = lambda trial: self.objective(
+                trial, dk, total_timesteps
+            )
             study.optimize(
-                lambda trial: self.objective(trial, dk, total_timesteps),
+                objective,
                 n_trials=self.optuna_n_trials,
                 timeout=(
                     hours_to_seconds(self.optuna_timeout_hours)
@@ -1285,7 +1289,7 @@ class ReforceXY(BaseReinforcementLearningModel):
             prices_train, prices_test = self.build_ohlc_price_dataframes(
                 dk.data_dictionary, dk.pair, dk
             )
-        seed = self.get_model_params().get("seed", 42) if seed is None else seed
+        seed: int = self.get_model_params().get("seed", 42) if seed is None else seed
         if trial is not None:
             seed += trial.number
         set_random_seed(seed)
@@ -1549,7 +1553,9 @@ class MyRLEnv(Base5ActionRLEnv):
         self._total_entry_additive: float = 0.0
         self._last_exit_additive: float = 0.0
         self._total_exit_additive: float = 0.0
-        model_reward_parameters = self.rl_config.get("model_reward_parameters", {})
+        model_reward_parameters: Dict[str, Any] = self.rl_config.get(
+            "model_reward_parameters", {}
+        )
         self.max_trade_duration_candles: int = int(
             model_reward_parameters.get(
                 "max_trade_duration_candles",
index af3ee5763862e3daa29c9085c29d1c64cc60edd5..4c0d70d29a76ff2781324f35200d31a438f76504 100644 (file)
@@ -1 +1,3 @@
+pandas-stubs
+scipy-stubs
 ruff
index 4b5481b7b706452d7d22a97ad6f1aada5ca6674c..65f7c660ceb543997d40e5ce18d7a1914e72490f 100644 (file)
@@ -18,6 +18,7 @@ import sklearn
 from freqtrade.freqai.base_models.BaseRegressionModel import BaseRegressionModel
 from freqtrade.freqai.data_kitchen import FreqaiDataKitchen
 from numpy.typing import NDArray
+from optuna.study.study import ObjectiveFuncType
 from sklearn_extra.cluster import KMedoids
 
 from Utils import (
@@ -560,7 +561,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
         self,
         pair: str,
         namespace: str,
-        callback: Callable[[], None],
+        callback: Callable[[], Optional[optuna.study.Study]],
     ) -> None:
         if namespace not in {
             QuickAdapterRegressorV3._OPTUNA_NAMESPACES[2]
@@ -1637,7 +1638,7 @@ class QuickAdapterRegressorV3(BaseRegressionModel):
         self,
         pair: str,
         namespace: str,
-        objective: Callable[[optuna.trial.Trial], float],
+        objective: ObjectiveFuncType,
         direction: Optional[optuna.study.StudyDirection] = None,
         directions: Optional[list[optuna.study.StudyDirection]] = None,
     ) -> Optional[optuna.study.Study]:
index 3a6ede8b6c22448a191fdb809ecccbe207f30daf..5c3bb12c1a57baa1252408c0f078f5e71e5eb27c 100644 (file)
@@ -1144,7 +1144,18 @@ REGRESSORS: Final[tuple[Regressor, ...]] = ("xgboost", "lightgbm")
 
 def get_optuna_callbacks(
     trial: optuna.trial.Trial, regressor: Regressor
-) -> list[Callable[[optuna.trial.Trial, str], None]]:
+) -> list[
+    Union[
+        optuna.integration.XGBoostPruningCallback,
+        optuna.integration.LightGBMPruningCallback,
+    ]
+]:
+    callbacks: list[
+        Union[
+            optuna.integration.XGBoostPruningCallback,
+            optuna.integration.LightGBMPruningCallback,
+        ]
+    ]
     if regressor == REGRESSORS[0]:  # "xgboost"
         callbacks = [
             optuna.integration.XGBoostPruningCallback(trial, "validation_0-rmse")
@@ -1167,7 +1178,14 @@ def fit_regressor(
     eval_weights: Optional[list[NDArray[np.floating]]],
     model_training_parameters: dict[str, Any],
     init_model: Any = None,
-    callbacks: Optional[list[Callable[[optuna.trial.Trial, str], None]]] = None,
+    callbacks: Optional[
+        list[
+            Union[
+                optuna.integration.XGBoostPruningCallback,
+                optuna.integration.LightGBMPruningCallback,
+            ]
+        ]
+    ] = None,
     trial: Optional[optuna.trial.Trial] = None,
 ) -> Any:
     if regressor == REGRESSORS[0]:  # "xgboost"