From ea9f156eeb5076a922a555533d39597bc997e56a Mon Sep 17 00:00:00 2001 From: I Luk Kim Date: Mon, 6 Apr 2026 01:56:58 -0700 Subject: [PATCH] Tune Form4 sleeve quality filters and reserve sizing --- apps/backtester/run.py | 4 ++++ libs/backtest/domain.py | 4 +++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/apps/backtester/run.py b/apps/backtester/run.py index 3e9fd97..23a6686 100644 --- a/apps/backtester/run.py +++ b/apps/backtester/run.py @@ -2842,8 +2842,12 @@ class BacktestRunner: continue if event.weighted_purchase_pct < float(cfg.min_purchase_pct): continue + if int(event.event_day_count) < int(cfg.min_event_day_count): + continue if cfg.max_lag_days is not None and event.max_lag_days is not None and event.max_lag_days > int(cfg.max_lag_days): continue + if bool(cfg.require_officer_or_director) and not bool(event.has_officer_or_director): + continue symbol = str(event.symbol).upper() if symbol in open_symbols: continue diff --git a/libs/backtest/domain.py b/libs/backtest/domain.py index d5575da..928b4ba 100644 --- a/libs/backtest/domain.py +++ b/libs/backtest/domain.py @@ -945,7 +945,7 @@ FORM4_CAPTURE_SLEEVE_PRESETS: dict[str, dict[str, Any]] = { "reserve_form4_cluster": { "enabled": True, "pit_events_path": "data/reference/form4_daily_events_pit.parquet", - "reserve_pct": 0.04, + "reserve_pct": 0.06, "min_owner_count": 2, "min_total_value": 5_000_000.0, "min_purchase_pct": 0.0, @@ -1497,7 +1497,9 @@ class Form4CaptureConfig(BaseModel): min_owner_count: int = 2 min_total_value: float = 5_000_000.0 min_purchase_pct: float = 0.0 + min_event_day_count: int = 1 max_lag_days: int | None = None + require_officer_or_director: bool = False hold_days: int = 20 max_positions: int = 6 max_new_per_day: int = 2