| freqai.optuna_hyperopt.space_reduction | false | bool | Enable/disable `hp` search space reduction based on previous best parameters. |
| freqai.optuna_hyperopt.space_fraction | 0.4 | float [0,1] | Fraction of the `hp` search space to use with `space_reduction`. Lower values create narrower search ranges around the best parameters. |
| freqai.optuna_hyperopt.min_resource | 3 | int >= 1 | Minimum resource per [HyperbandPruner](https://optuna.readthedocs.io/en/stable/reference/generated/optuna.pruners.HyperbandPruner.html) rung. |
-| freqai.optuna_hyperopt.seed | 1 | int >= 0 | HPO RNG seed. |
+| freqai.optuna_hyperopt.seed | 1 | int >= 0 | HPO RNG seed used by the Optuna samplers and label-candle shuffling. |
+| freqai.optuna_hyperopt.vary_model_seed_by_trial | true | bool | Add `trial.number` to each regressor's configured model seed (or its default seed of `1`) during HPO. `true` samples model randomness across trials and preserves the historical behavior; `false` evaluates every trial and the final fit with the same model seed. This does not change `freqai.optuna_hyperopt.seed`. |
## ReforceXY
OPTUNA_SPACE_REDUCTION_DEFAULT: Final[bool] = False
OPTUNA_SPACE_FRACTION_DEFAULT: Final[float] = 0.4
OPTUNA_SEED_DEFAULT: Final[int] = 1
+ OPTUNA_VARY_MODEL_SEED_BY_TRIAL_DEFAULT: Final[bool] = True
+
+ _OPTUNA_BOOL_OPTIONS: Final[tuple[str, ...]] = (
+ "enabled",
+ "continuous",
+ "warm_start",
+ "space_reduction",
+ "vary_model_seed_by_trial",
+ )
_DATA_SPLIT_METHODS: Final[tuple[str, ...]] = (
"train_test_split",
"space_fraction": QuickAdapterRegressorV3.OPTUNA_SPACE_FRACTION_DEFAULT,
"min_resource": QuickAdapterRegressorV3.OPTUNA_MIN_RESOURCE_DEFAULT,
"seed": QuickAdapterRegressorV3.OPTUNA_SEED_DEFAULT,
+ "vary_model_seed_by_trial": (
+ QuickAdapterRegressorV3.OPTUNA_VARY_MODEL_SEED_BY_TRIAL_DEFAULT
+ ),
}
optuna_hyperopt = self.config.get("freqai", {}).get("optuna_hyperopt", {})
- return {
+ optuna_config = {
**optuna_default_config,
**optuna_hyperopt,
}
+ for option in QuickAdapterRegressorV3._OPTUNA_BOOL_OPTIONS:
+ if not isinstance(optuna_config[option], bool):
+ raise ValueError(
+ f"freqai.optuna_hyperopt.{option} must be a boolean "
+ f"(got {type(optuna_config[option]).__name__})"
+ )
+ return optuna_config
@property
def _min_label_period_candles(self) -> int:
)
logger.info(f" min_resource: {optuna_config.get('min_resource')}")
logger.info(f" seed: {optuna_config.get('seed')}")
+ logger.info(
+ " vary_model_seed_by_trial: "
+ f"{optuna_config.get('vary_model_seed_by_trial')}"
+ )
logger.info(f" label_sampler: {optuna_config.get('label_sampler')}")
logger.info(
model_training_parameters,
self._optuna_config["space_reduction"],
self._optuna_config["space_fraction"],
- dk.data_path,
- init_model,
+ model_path=dk.data_path,
+ init_model=init_model,
+ vary_model_seed_by_trial=self._optuna_config[
+ "vary_model_seed_by_trial"
+ ],
),
direction=optuna.study.StudyDirection.MINIMIZE,
)
space_fraction: float,
model_path: Optional[Path] = None,
init_model: Any = None,
+ vary_model_seed_by_trial: bool = True,
) -> float:
study_model_parameters = get_optuna_study_model_parameters(
trial,
init_model=init_model,
model_path=model_path,
trial=trial,
+ vary_model_seed_by_trial=vary_model_seed_by_trial,
)
y_pred = model.predict(X_validation)
callbacks: list[RegressorCallback] | None = None,
model_path: Path | None = None,
trial: optuna.trial.Trial | None = None,
+ vary_model_seed_by_trial: bool = True,
) -> Any:
fit_callbacks = list(callbacks) if callbacks else []
f"supported values are {', '.join(REGRESSORS)}"
)
model_training_parameters.setdefault(spec.seed_param, 1)
- if trial is not None:
+ if trial is not None and vary_model_seed_by_trial:
model_training_parameters[spec.seed_param] = (
model_training_parameters[spec.seed_param] + trial.number
)
max_depth=model_training_parameters.pop("max_depth", None),
min_samples_split=model_training_parameters.pop("min_samples_split", 2),
min_samples_leaf=model_training_parameters.pop("min_samples_leaf", 1),
+ random_state=model_training_parameters["random_state"],
),
**model_training_parameters,
)