From 3779be78e3ab55284449ae3cb2b2b65aae98b9c0 Mon Sep 17 00:00:00 2001 From: I Luk Kim Date: Fri, 13 Mar 2026 21:03:34 -0700 Subject: [PATCH] fix: kill switch research mode reset + adjust veto threshold MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Fix kill switch reset: remove unreachable drawdown recovery condition (equity can't change while trading is halted), reset peak_equity and drawdown_pct to 0 on cooldown expiry - Raise veto_oneoff_penalty threshold 0.5 → 0.7 (was blocking 67% of candidates due to high median oneoff_penalty in dataset) Co-Authored-By: Claude Opus 4.6 --- apps/backtester/run.py | 8 +++++--- configs/backtest/defaults.json | 2 +- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/apps/backtester/run.py b/apps/backtester/run.py index 9b0aac7..a139e13 100644 --- a/apps/backtester/run.py +++ b/apps/backtester/run.py @@ -269,15 +269,17 @@ class BacktestRunner: if self.config.risk.backtest_mode == "research": self._kill_switch_cooldown_remaining = self.config.risk.kill_switch_cooldown_days - # Research mode: reset kill switch after cooldown + recovery + # Research mode: reset kill switch after cooldown expires + # Reset peak_equity to current equity so drawdown restarts from 0 if ( self._kill_switch_triggered and self.config.risk.backtest_mode == "research" and self._kill_switch_cooldown_remaining <= 0 - and drawdown_pct < _KILL_SWITCH_DRAWDOWN_PCT ): self._kill_switch_triggered = False - logger.info("kill_switch_reset", date=str(date), drawdown_pct=drawdown_pct) + self._peak_equity = self._equity + drawdown_pct = 0.0 + logger.info("kill_switch_reset", date=str(date)) # --- ENTRIES (only if kill switch not triggered) --- if not self._kill_switch_triggered: diff --git a/configs/backtest/defaults.json b/configs/backtest/defaults.json index 373e8da..b2531a3 100644 --- a/configs/backtest/defaults.json +++ b/configs/backtest/defaults.json @@ -27,7 +27,7 @@ "stop_atr_multiplier": 3.0, "backtest_mode": "research", "kill_switch_cooldown_days": 20, - "veto_oneoff_penalty": 0.5, + "veto_oneoff_penalty": 0.7, "veto_parse_confidence_min": 0.4, "veto_unknown_direction": true, "veto_bearish_direction": true