From: Jérôme Benoit Date: Sat, 23 Aug 2025 14:09:49 +0000 (+0200) Subject: perf(qav3): tune reversal confirmation X-Git-Url: https://git.piment-noir.org/?a=commitdiff_plain;h=bd2b090ffaaea833bc2133d25b6203bcdc938087;p=freqai-strategies.git perf(qav3): tune reversal confirmation Signed-off-by: Jérôme Benoit --- diff --git a/ReforceXY/user_data/freqaimodels/ReforceXY.py b/ReforceXY/user_data/freqaimodels/ReforceXY.py index 24a6558..b2160fd 100644 --- a/ReforceXY/user_data/freqaimodels/ReforceXY.py +++ b/ReforceXY/user_data/freqaimodels/ReforceXY.py @@ -29,7 +29,12 @@ from optuna import Trial, TrialPruned, create_study from optuna.exceptions import ExperimentalWarning from optuna.pruners import HyperbandPruner from optuna.samplers import TPESampler -from optuna.storages import BaseStorage, JournalStorage, RDBStorage +from optuna.storages import ( + BaseStorage, + JournalStorage, + RDBStorage, + RetryFailedTrialCallback, +) from optuna.storages.journal import JournalFileBackend from optuna.study import Study, StudyDirection from pandas import DataFrame, concat, merge @@ -494,7 +499,9 @@ class ReforceXY(BaseReinforcementLearningModel): storage_backend = self.rl_config_optuna.get("storage", "sqlite") if storage_backend == "sqlite": storage = RDBStorage( - url=f"sqlite:///{storage_dir}/{storage_filename}.sqlite" + url=f"sqlite:///{storage_dir}/{storage_filename}.sqlite", + heartbeat_interval=60, + failed_trial_callback=RetryFailedTrialCallback(max_retry=3), ) elif storage_backend == "file": storage = JournalStorage( diff --git a/quickadapter/user_data/strategies/QuickAdapterV3.py b/quickadapter/user_data/strategies/QuickAdapterV3.py index 7170f9b..c172b79 100644 --- a/quickadapter/user_data/strategies/QuickAdapterV3.py +++ b/quickadapter/user_data/strategies/QuickAdapterV3.py @@ -1125,7 +1125,7 @@ class QuickAdapterV3(IStrategy): min_natr_ratio_percent: float = 0.00999, max_natr_ratio_percent: float = 0.099, lookback_period: int = 1, - decay_ratio: float = 0.5, + decay_ratio: float = 0.6, ) -> bool: """ Confirm a reversal using a multi-candle lookback chain. @@ -1137,7 +1137,7 @@ class QuickAdapterV3(IStrategy): - A geometric decay is applied for each lookback step k: min_natr_ratio_percent/max_natr_ratio_percent bounds are multiplied by (decay_ratio ** k) and clamped to [0, 1] for the threshold computed on candle [-(k+1)]. - Default decay_ratio=0.5. + Default decay_ratio=0.6. Set decay_ratio=1.0 to disable decay and keep the current behavior. Fallbacks: - If thresholds or closes are unavailable for any k, only the current threshold condition is enforced. @@ -1187,12 +1187,13 @@ class QuickAdapterV3(IStrategy): if not isinstance(close_k, (int, float)) or not np.isfinite(close_k): return current_ok + decay_factor = decay_ratio**k decayed_min_natr_ratio_percent = max( - 0.0, min(1.0, min_natr_ratio_percent * (decay_ratio**k)) + 0.0, min(1.0, min_natr_ratio_percent * decay_factor) ) decayed_max_natr_ratio_percent = max( decayed_min_natr_ratio_percent, - min(1.0, max_natr_ratio_percent * (decay_ratio**k)), + min(1.0, max_natr_ratio_percent * decay_factor), ) threshold_k = self.calculate_candle_threshold(