https://github.com/sponsors/robcaulk
"""
- version = "3.7.7"
+ version = "3.7.8"
@cached_property
def _optuna_config(self) -> dict:
"n_trials": 36,
"timeout": 7200,
"candles_step": 10,
+ "seed": 1,
}
return {
**optuna_default_config,
)
return min_pred, max_pred
- @staticmethod
def get_multi_objective_study_best_trial(
- namespace: str, study: optuna.study.Study
+ self, namespace: str, study: optuna.study.Study
) -> Optional[optuna.trial.FrozenTrial]:
if not QuickAdapterRegressorV3.optuna_study_has_best_trials(study):
return None
best_trials = study.best_trials
if namespace == "label":
peaks_sizes = [trial.values[1] for trial in best_trials]
- median_peaks_size = np.median(peaks_sizes)
- equal_median_trials = [
+ quantile_peaks_size = np.quantile(
+ peaks_sizes, self.ft_params.get("label_quantile", 0.75)
+ )
+ equal_quantile_peaks_size_trials = [
trial
for trial in best_trials
- if np.isclose(trial.values[1], median_peaks_size)
+ if np.isclose(trial.values[1], quantile_peaks_size)
]
- if equal_median_trials:
- return max(equal_median_trials, key=lambda trial: trial.values[0])
- nearest_above_median = (
+ if equal_quantile_peaks_size_trials:
+ return max(
+ equal_quantile_peaks_size_trials, key=lambda trial: trial.values[0]
+ )
+ nearest_above_quantile = (
np.inf,
-np.inf,
None,
) # (trial_peaks_size, trial_peaks_range, trial_index)
- nearest_below_median = (
+ nearest_below_quantile = (
-np.inf,
-np.inf,
None,
) # (trial_peaks_size, trial_peaks_range, trial_index)
for idx, trial in enumerate(best_trials):
peaks_size = trial.values[1]
- if peaks_size >= median_peaks_size:
- if peaks_size < nearest_above_median[0] or (
- peaks_size == nearest_above_median[0]
- and trial.values[0] > nearest_above_median[1]
+ if peaks_size >= quantile_peaks_size:
+ if peaks_size < nearest_above_quantile[0] or (
+ peaks_size == nearest_above_quantile[0]
+ and trial.values[0] > nearest_above_quantile[1]
):
- nearest_above_median = (peaks_size, trial.values[0], idx)
- if peaks_size <= median_peaks_size:
- if peaks_size > nearest_below_median[0] or (
- peaks_size == nearest_below_median[0]
- and trial.values[0] > nearest_below_median[1]
+ nearest_above_quantile = (peaks_size, trial.values[0], idx)
+ if peaks_size <= quantile_peaks_size:
+ if peaks_size > nearest_below_quantile[0] or (
+ peaks_size == nearest_below_quantile[0]
+ and trial.values[0] > nearest_below_quantile[1]
):
- nearest_below_median = (peaks_size, trial.values[0], idx)
- if nearest_above_median[2] is None or nearest_below_median[2] is None:
+ nearest_below_quantile = (peaks_size, trial.values[0], idx)
+ if nearest_above_quantile[2] is None or nearest_below_quantile[2] is None:
return None
- above_median_trial = best_trials[nearest_above_median[2]]
- below_median_trial = best_trials[nearest_below_median[2]]
- if above_median_trial.values[0] >= below_median_trial.values[0]:
- return above_median_trial
+ above_quantile_trial = best_trials[nearest_above_quantile[2]]
+ below_quantile_trial = best_trials[nearest_below_quantile[2]]
+ if above_quantile_trial.values[0] >= below_quantile_trial.values[0]:
+ return above_quantile_trial
else:
- return below_median_trial
+ return below_quantile_trial
else:
raise ValueError(f"Invalid namespace: {namespace}")
**self.get_optuna_params(pair, namespace),
}
else:
- best_trial = QuickAdapterRegressorV3.get_multi_objective_study_best_trial(
- "label", study
- )
+ best_trial = self.get_multi_objective_study_best_trial("label", study)
if not best_trial:
logger.error(
f"Optuna {pair} {namespace} {objective_type} hyperopt failed ({time_spent:.2f} secs): no study best trial found"
return optuna.create_study(
study_name=study_name,
sampler=optuna.samplers.TPESampler(
- multivariate=True, group=True, seed=1
+ multivariate=True, group=True, seed=self._optuna_config.get("seed")
),
pruner=optuna.pruners.HyperbandPruner(),
direction=direction,