From f1782f5fd338872a43bc130ae9a03cbedf396d2f Mon Sep 17 00:00:00 2001 From: I Luk Kim Date: Wed, 13 May 2026 07:24:52 -0700 Subject: [PATCH] Add xsmom disk cache + promote v9.3.2b as champion, retire v9 sweep configs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - New: libs/backtest/xsmom_cache.py — disk cache for xsmom ranked-universe per rebalance date; keyed by snapshot fingerprint + param hash; top_n is NOT in key so v9.3.1 (top20) and v9.3.2c (top10) share one cache file - libs/backtest/cross_sectional_momentum.py — add cache= param to build_candidates(); hit path skips 900-symbol scan; miss path writes ranked rows post-quality-gate to cache buffer - libs/backtest/snapshot_store.py — expose snapshot_dir attribute; propagate through slice_by_date_range() so runner always has the path - apps/backtester/run.py — wire up XsmomRankCache per engine (lazy init, flush after simulation loop); cache is no-op when snapshot_dir is None - configs: add return_max_long_v9.3.2b_fc.json (SQS 93.5 champion, ER days[2,8]); remove all other v9 sweep variants from .index.json Co-Authored-By: Claude Sonnet 4.6 --- apps/backtester/run.py | 73 +- configs/experiments/.index.json | 1365 +++++++++-------- .../return_max_long_v9.3.2b_fc.json | 748 +++++++++ libs/backtest/cross_sectional_momentum.py | 80 +- libs/backtest/snapshot_store.py | 10 +- libs/backtest/xsmom_cache.py | 199 +++ 6 files changed, 1839 insertions(+), 636 deletions(-) create mode 100644 configs/experiments/return_max_long_v9.3.2b_fc.json create mode 100644 libs/backtest/xsmom_cache.py diff --git a/apps/backtester/run.py b/apps/backtester/run.py index 068ce4f..ac9bccb 100644 --- a/apps/backtester/run.py +++ b/apps/backtester/run.py @@ -76,6 +76,11 @@ from libs.backtest.cross_sectional_momentum import ( _SnapshotStoreBarAdapter as _XsmomBarAdapter, build_candidates as build_cross_sectional_momentum_candidates, ) +from libs.backtest.xsmom_cache import ( + XsmomRankCache, + build_param_hash as _xsmom_build_param_hash, + compute_snapshot_fingerprint as _xsmom_compute_fingerprint, +) from libs.backtest.form4_calendar import load_pit_form4_calendar from libs.backtest.ownership_calendar import load_pit_ownership_calendar from libs.backtest.execution import ( @@ -657,15 +662,15 @@ class BacktestRunner: def _sleeve_equity_est(self, date: dt.date) -> float: """Equity estimate for sleeve budget calculations. - When ``fixed_capital_sizing`` is enabled, returns ``initial_equity`` so - that sleeve allocations (parking, form4, ownership, risk-off, idle-alpha) - stay proportional to the starting capital rather than compounding with - portfolio growth. + When ``fixed_capital_sizing`` is enabled, caps sleeve budgets at + ``initial_equity`` so gains do not compound into larger allocations, + while drawdowns still reduce available capital and avoid leverage. """ - if self._fixed_capital_sizing: - return float(self.initial_equity) market_value = self._compute_positions_market_value(date) - return self._cash + market_value + self._get_parking_value(date) + equity_est = self._cash + market_value + self._get_parking_value(date) + if self._fixed_capital_sizing: + return min(float(equity_est), float(self.initial_equity)) + return equity_est def _resolve_close_price(self, symbol: str, date: dt.date, fallback: float) -> float: """Best-effort close price: today's bar → latest prior bar → entry price.""" @@ -694,7 +699,10 @@ class BacktestRunner: def _compute_buying_power(self, equity: float, gross_exposure: float) -> float: multiplier = self.config.risk.buying_power_multiplier or 1.0 - max_gross = max(0.0, equity * multiplier) + capital_base = float(equity) + if self._fixed_capital_sizing: + capital_base = min(capital_base, float(self.initial_equity)) + max_gross = max(0.0, capital_base * multiplier) return max(0.0, max_gross - gross_exposure) def _get_candidate_capital_bucket_id(self, candidate: Candidate) -> str | None: @@ -749,10 +757,13 @@ class BacktestRunner: market_value = self._capital_bucket_notional(bucket_id, date) entry_cost = self._capital_bucket_entry_cost(bucket_id) unrealized = market_value - entry_cost - return max( + bucket_equity = max( 0.0, initial_bucket_equity + self._capital_bucket_realized_pnl(bucket_id) + unrealized, ) + if self._fixed_capital_sizing: + return min(bucket_equity, initial_bucket_equity) + return bucket_equity def _capital_bucket_cash_available(self, bucket_id: str, date: dt.date) -> float: market_value = self._capital_bucket_notional(bucket_id, date) @@ -936,6 +947,10 @@ class BacktestRunner: if self._parking_shares > 0 or self._parking_sgov_value > 0: self._liquidate_parking(last_date, timing="close") + # Flush xsmom rank caches to disk. + for xsmom_cache in getattr(self, "_xsmom_caches_by_hash", {}).values(): + xsmom_cache.close() + finished_at = utc_now() metrics = build_metrics_bundle( self._closed_trades, self._equity_curve, self._candidate_map @@ -6288,6 +6303,16 @@ class BacktestRunner: self._xsmom_bar_adapter = cached_adapter bar_provider = cached_adapter + # Lazily build snapshot fingerprint once per run. + if not hasattr(self, "_xsmom_snapshot_fp"): + snapshot_dir = self.store.snapshot_dir + if snapshot_dir is not None: + self._xsmom_snapshot_fp: str | None = _xsmom_compute_fingerprint(snapshot_dir) + else: + self._xsmom_snapshot_fp = None + if not hasattr(self, "_xsmom_caches_by_hash"): + self._xsmom_caches_by_hash: dict[str, XsmomRankCache] = {} + # Phase 20: regime gate. Macro data lookup at decision_date. # If empty, regime gate does not fire (fail-open) since the engine has # always been able to function without VIX/SPY data. @@ -6329,6 +6354,18 @@ class BacktestRunner: ) continue + # Get or create per-engine disk cache (keyed by param hash). + xsmom_cache: XsmomRankCache | None = None + if self._xsmom_snapshot_fp is not None and self.store.snapshot_dir is not None: + param_hash = _xsmom_build_param_hash(engine) + if param_hash not in self._xsmom_caches_by_hash: + self._xsmom_caches_by_hash[param_hash] = XsmomRankCache( + snapshot_dir=self.store.snapshot_dir, + snapshot_fingerprint=self._xsmom_snapshot_fp, + param_hash=param_hash, + ) + xsmom_cache = self._xsmom_caches_by_hash[param_hash] + try: candidates = build_cross_sectional_momentum_candidates( decision_date=date, @@ -6336,6 +6373,7 @@ class BacktestRunner: universe_symbols=universe_symbols, engine=engine, bar_provider=bar_provider, + cache=xsmom_cache, ) except Exception as exc: # noqa: BLE001 logger.warning( @@ -9633,6 +9671,16 @@ def main() -> None: parser.add_argument("--rm-step-days", type=int, default=21, help="Robustness matrix step size (trading days)") parser.add_argument("--mode", choices=["research", "live"], default=None, help="Backtest mode: research (kill switch resets) or live (permanent)") + parser.add_argument( + "--capital-mode", + choices=["compound", "simple", "fixed"], + default=None, + help=( + "Capital sizing mode override. compound uses current equity; " + "simple/fixed uses starting capital for sizing and caps new exposure " + "at starting capital for non-compounding research." + ), + ) parser.add_argument("--start", default=None, help="Start date filter YYYY-MM-DD (inclusive)") parser.add_argument("--end", default=None, help="End date filter YYYY-MM-DD (inclusive)") parser.add_argument("--parking", default=None, help="Cash parking preset (e.g. qqqm_low_dd)") @@ -9662,6 +9710,9 @@ def main() -> None: if args.mode: config.risk.backtest_mode = args.mode + if args.capital_mode: + config.risk.fixed_capital_sizing = args.capital_mode in {"simple", "fixed"} + if args.parking: config.risk.cash_parking_preset = args.parking config.risk.apply_parking_preset() @@ -9752,9 +9803,13 @@ def main() -> None: ) result = runner.run(output_root=args.output_root) print(f"Run complete: {result.run_id}") + capital_mode = "simple/fixed" if config.risk.fixed_capital_sizing else "compound" + print(f"Capital mode: {capital_mode}") print(f"Trades: {result.metrics.trade_count}") if result.metrics.total_return_pct is not None: print(f"Total return: {result.metrics.total_return_pct:.2f}%") + if result.metrics.simple_return_pct is not None: + print(f"Simple return: {result.metrics.simple_return_pct:.2f}%") # Print SQS score from libs.backtest.tracker import compute_sqs diff --git a/configs/experiments/.index.json b/configs/experiments/.index.json index 3f88457..4e4efdf 100644 --- a/configs/experiments/.index.json +++ b/configs/experiments/.index.json @@ -1,11 +1,11 @@ { - "updated_at": "2026-04-21T17:14:58.107337+00:00", + "updated_at": "2026-05-13T07:43:26.009503+00:00", "experiments": { "empty_strategy": { "id": 1072, "parent": "parking_only_qqq", "version_family": null, - "generation": null, + "generation": 0, "status": "draft", "created_at": "2026-04-06T03:51:55.001427+00:00", "created_by": "claude", @@ -16,26 +16,11 @@ "has_journal_entry": false, "sqs_score": null }, - "pead_step14_diag": { - "id": 9001, - "parent": "empty_strategy", - "version_family": null, - "generation": null, - "status": "draft", - "created_at": "2026-04-21T00:00:00+00:00", - "created_by": "claude", - "tags": [], - "aliases": [], - "description": "PEAD step14 diagnostic: reaction=10%, vol=2.0x, score=0.65, hold=7d, maxcand=3. Earnings-only, long+short.", - "changelog": "PEAD step14 diagnostic config for V23 diversification analysis", - "has_journal_entry": false, - "sqs_score": null - }, "return_max_long_v7.1": { "id": 340, "parent": "return_max_long_v6new.362", "version_family": "v7", - "generation": 4, + "generation": 0, "status": "retired", "created_at": "2026-03-28T00:21:30.371690+00:00", "created_by": "ai_agent", @@ -47,8 +32,8 @@ "aliases": [ "conviction" ], - "description": "v7 시리즈의 출발점. v362(VIX cap on core engine only)에서 VIX 30 캡을 전체 18개 엔진으로 확장한 전략.\n\n목적: VIX>30 스트레스 기간에 ANY 엔진의 진입을 차단하여 구조적으로 손실을 방지.\n결과: CW가 v362 대비 +30pp 상승하면서 valid/test는 완전히 동일. split 기간(2022-2026)에는 VIX>30이 거의 발생하지 않아 split 결과에 영향 없지만, 4년 CW 전체 기간에서는 2022년 bear market과 2025년 8월 일본 캐리 트레이드 언와인드 등 스트레스 이벤트를 건너뛰어 자본 보존 효과가 큼.\n\n[10k 기준] SQS 74.3 | Sharpe 2.83 | Calmar 8.0 | PF 11.3 | WR 64%\nTrain +92.5% (133t) | Valid +46.9% (29t) | Test +47.4% (24t, DD 1.8%)\nCW +346.7% (184t, DD 5.6%) | WFV: median 10.0%, mean 13.0%, worst 2.95%, gap 23.6%\n12 WFV folds 전부 양수 (100%). 가장 보수적인 v7 전략.\n\n실전 배포 시 추천 — 구조적 개선만 적용하여 과적합 위험이 가장 낮음. 수익률보다 안정성을 우선시하는 경우 이 전략을 사용.", - "changelog": "VIX 30 all 18 engines — v362 structural upgrade, no risk change", + "description": "v7 \uc2dc\ub9ac\uc988\uc758 \ucd9c\ubc1c\uc810. v362(VIX cap on core engine only)\uc5d0\uc11c VIX 30 \ucea1\uc744 \uc804\uccb4 18\uac1c \uc5d4\uc9c4\uc73c\ub85c \ud655\uc7a5\ud55c \uc804\ub7b5.\n\n\ubaa9\uc801: VIX>30 \uc2a4\ud2b8\ub808\uc2a4 \uae30\uac04\uc5d0 ANY \uc5d4\uc9c4\uc758 \uc9c4\uc785\uc744 \ucc28\ub2e8\ud558\uc5ec \uad6c\uc870\uc801\uc73c\ub85c \uc190\uc2e4\uc744 \ubc29\uc9c0.\n\uacb0\uacfc: CW\uac00 v362 \ub300\ube44 +30pp \uc0c1\uc2b9\ud558\uba74\uc11c valid/test\ub294 \uc644\uc804\ud788 \ub3d9\uc77c. split \uae30\uac04(2022-2026)\uc5d0\ub294 VIX>30\uc774 \uac70\uc758 \ubc1c\uc0dd\ud558\uc9c0 \uc54a\uc544 split \uacb0\uacfc\uc5d0 \uc601\ud5a5 \uc5c6\uc9c0\ub9cc, 4\ub144 CW \uc804\uccb4 \uae30\uac04\uc5d0\uc11c\ub294 2022\ub144 bear market\uacfc 2025\ub144 8\uc6d4 \uc77c\ubcf8 \uce90\ub9ac \ud2b8\ub808\uc774\ub4dc \uc5b8\uc640\uc778\ub4dc \ub4f1 \uc2a4\ud2b8\ub808\uc2a4 \uc774\ubca4\ud2b8\ub97c \uac74\ub108\ub6f0\uc5b4 \uc790\ubcf8 \ubcf4\uc874 \ud6a8\uacfc\uac00 \ud07c.\n\n[10k \uae30\uc900] SQS 74.3 | Sharpe 2.83 | Calmar 8.0 | PF 11.3 | WR 64%\nTrain +92.5% (133t) | Valid +46.9% (29t) | Test +47.4% (24t, DD 1.8%)\nCW +346.7% (184t, DD 5.6%) | WFV: median 10.0%, mean 13.0%, worst 2.95%, gap 23.6%\n12 WFV folds \uc804\ubd80 \uc591\uc218 (100%). \uac00\uc7a5 \ubcf4\uc218\uc801\uc778 v7 \uc804\ub7b5.\n\n\uc2e4\uc804 \ubc30\ud3ec \uc2dc \ucd94\ucc9c \u2014 \uad6c\uc870\uc801 \uac1c\uc120\ub9cc \uc801\uc6a9\ud558\uc5ec \uacfc\uc801\ud569 \uc704\ud5d8\uc774 \uac00\uc7a5 \ub0ae\uc74c. \uc218\uc775\ub960\ubcf4\ub2e4 \uc548\uc815\uc131\uc744 \uc6b0\uc120\uc2dc\ud558\ub294 \uacbd\uc6b0 \uc774 \uc804\ub7b5\uc744 \uc0ac\uc6a9.", + "changelog": "VIX 30 all 18 engines \u2014 v362 structural upgrade, no risk change", "has_journal_entry": false, "sqs_score": null }, @@ -56,7 +41,7 @@ "id": 349, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:43:39.707129+00:00", "created_by": "ai_agent", @@ -69,7 +54,7 @@ "conviction" ], "description": "v7.1 + extended holding on high-WR engines (broad 18d, guidance/inline 16d)", - "changelog": "Extend holding: broad 12→18d, guidance 12→16d — capture TIME exit profits", + "changelog": "Extend holding: broad 12\u219218d, guidance 12\u219216d \u2014 capture TIME exit profits", "has_journal_entry": false, "sqs_score": null }, @@ -77,7 +62,7 @@ "id": 350, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:43:40.197587+00:00", "created_by": "ai_agent", @@ -89,8 +74,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + trail warmup 6→4d globally — trigger trailing stops earlier", - "changelog": "Shorter trail warmup: 6→4d globally — actually trigger trailing stops", + "description": "v7.1 + trail warmup 6\u21924d globally \u2014 trigger trailing stops earlier", + "changelog": "Shorter trail warmup: 6\u21924d globally \u2014 actually trigger trailing stops", "has_journal_entry": false, "sqs_score": null }, @@ -98,7 +83,7 @@ "id": 351, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:43:40.678664+00:00", "created_by": "ai_agent", @@ -119,7 +104,7 @@ "id": 1153, "parent": "return_max_long_v7.120_composed_gld", "version_family": "v7", - "generation": 21, + "generation": 1, "status": "draft", "created_at": "2026-04-08T08:29:18.420820+00:00", "created_by": "ai_agent", @@ -130,7 +115,7 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], "description": "v7.120_composed_gld + full rebuild snapshot with filing_time_bucket fix (1667 events corrected, 22 new rows)", "changelog": "Snapshot with filing_time_bucket bug fix applied to AVGO 2026-04-06 event. No strategy config changes.", @@ -141,7 +126,7 @@ "id": 1144, "parent": "return_max_long_v7.120", "version_family": "v7", - "generation": 21, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:22:34.527314+00:00", "created_by": "ai_agent", @@ -152,10 +137,10 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "macro_vix_max 45→60: attempt to improve OOT 252d median from -3.41% to positive", + "description": "v7.118 + 6 per-engine exit/veto optimizations. 12\uac1c \uc5d4\uc9c4. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15\u21921.45)\nLineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119", + "changelog": "macro_vix_max 45\u219260: attempt to improve OOT 252d median from -3.41% to positive", "has_journal_entry": false, "sqs_score": null }, @@ -163,7 +148,7 @@ "id": 1145, "parent": "return_max_long_v7.120", "version_family": "v7", - "generation": 21, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:43:20.127971+00:00", "created_by": "ai_agent", @@ -174,10 +159,10 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.119 + macro_vix_max 30→45 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40→0.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119→v7.120", - "changelog": "macro_vix_max 45→999: remove VIX gate entirely to test March 2020 COVID trades impact on OOT", + "description": "v7.119 + macro_vix_max 30\u219245 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40\u21920.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119\u2192v7.120", + "changelog": "macro_vix_max 45\u2192999: remove VIX gate entirely to test March 2020 COVID trades impact on OOT", "has_journal_entry": false, "sqs_score": null }, @@ -185,7 +170,7 @@ "id": 1147, "parent": "return_max_long_v7.123", "version_family": "v7", - "generation": 22, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:54:44.419494+00:00", "created_by": "ai_agent", @@ -196,9 +181,9 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.119 + macro_vix_max 30→45 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40→0.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119→v7.120", + "description": "v7.119 + macro_vix_max 30\u219245 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40\u21920.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119\u2192v7.120", "changelog": "Add next_open_long_bullish_raised_recovery (budget 0.10) to push OOT 252d median toward 3% threshold. 16 engines.", "has_journal_entry": false, "sqs_score": null @@ -207,7 +192,7 @@ "id": 1148, "parent": "return_max_long_v7.123", "version_family": "v7", - "generation": 22, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:56:21.240506+00:00", "created_by": "ai_agent", @@ -218,9 +203,9 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.119 + macro_vix_max 30→45 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40→0.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119→v7.120", + "description": "v7.119 + macro_vix_max 30\u219245 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40\u21920.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119\u2192v7.120", "changelog": "Add reaction_close_long_unknown_strong (budget 0.15) to v7.123. Test if better exit handling improves OOT 252d median from 1.63% toward 3%.", "has_journal_entry": false, "sqs_score": null @@ -229,7 +214,7 @@ "id": 1149, "parent": "return_max_long_v7.123", "version_family": "v7", - "generation": 22, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:56:59.357956+00:00", "created_by": "ai_agent", @@ -240,9 +225,9 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.119 + macro_vix_max 30→45 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40→0.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119→v7.120", + "description": "v7.119 + macro_vix_max 30\u219245 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40\u21920.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119\u2192v7.120", "changelog": "Add reaction_close_long_bullish_raised_priority (budget 0.45) to v7.123. Test if priority reaction close improves OOT 252d.", "has_journal_entry": false, "sqs_score": null @@ -251,7 +236,7 @@ "id": 1150, "parent": "return_max_long_v7.123", "version_family": "v7", - "generation": 22, + "generation": 0, "status": "retired", "created_at": "2026-04-07T07:57:11.780260+00:00", "created_by": "ai_agent", @@ -262,9 +247,9 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.119 + macro_vix_max 30→45 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40→0.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119→v7.120", + "description": "v7.119 + macro_vix_max 30\u219245 on all 12 engines. Standalone public SQS 38.3 (IMP-0932). OOT gate 0.40\u21920.85 (3/4 criteria pass). VIX fix exposes COVID-recovery trades in OOT period. Composite: ~1200% CW expected (Oracle-variable). Parking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45. Lineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119\u2192v7.120", "changelog": "Add all 4 remaining v7.70 engines (bullish_raised_recovery, largecap_tight, priority_close, unknown_strong) = 19 engines total with macro_vix_max 45.", "has_journal_entry": false, "sqs_score": null @@ -273,7 +258,7 @@ "id": 352, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:43:41.156421+00:00", "created_by": "ai_agent", @@ -294,7 +279,7 @@ "id": 353, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:43:41.640744+00:00", "created_by": "ai_agent", @@ -315,7 +300,7 @@ "id": 357, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:47:54.135665+00:00", "created_by": "ai_agent", @@ -327,7 +312,7 @@ "aliases": [ "conviction" ], - "description": "v7.1 VIX-all + v392 entropy caps — best structural combo", + "description": "v7.1 VIX-all + v392 entropy caps \u2014 best structural combo", "changelog": "v7.1 + v392 entropy caps: OME 2.0, material_unknown 2.05", "has_journal_entry": false, "sqs_score": null @@ -336,7 +321,7 @@ "id": 358, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:47:54.652998+00:00", "created_by": "ai_agent", @@ -348,7 +333,7 @@ "aliases": [ "conviction" ], - "description": "v7.15 + core threshold 0.42→0.38 — more high-WR core trades", + "description": "v7.15 + core threshold 0.42\u21920.38 \u2014 more high-WR core trades", "changelog": "v7.15 + core score threshold 0.38 (more core trades)", "has_journal_entry": false, "sqs_score": null @@ -357,7 +342,7 @@ "id": 359, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:47:55.149514+00:00", "created_by": "ai_agent", @@ -369,7 +354,7 @@ "aliases": [ "conviction" ], - "description": "v7.15 + core threshold 0.42→0.35 — widest core net", + "description": "v7.15 + core threshold 0.42\u21920.35 \u2014 widest core net", "changelog": "v7.15 + core score threshold 0.35 (even more core trades)", "has_journal_entry": false, "sqs_score": null @@ -378,7 +363,7 @@ "id": 363, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:56:49.468035+00:00", "created_by": "ai_agent", @@ -390,7 +375,7 @@ "aliases": [ "conviction" ], - "description": "v7.1 + ATR stop 1.45→1.8 — wider stops, fewer stop-outs", + "description": "v7.1 + ATR stop 1.45\u21921.8 \u2014 wider stops, fewer stop-outs", "changelog": "v7.1 + ATR stop 1.8 (wider stop = fewer stop-outs, more room to run)", "has_journal_entry": false, "sqs_score": null @@ -399,7 +384,7 @@ "id": 364, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:56:49.970369+00:00", "created_by": "ai_agent", @@ -411,7 +396,7 @@ "aliases": [ "conviction" ], - "description": "v7.1 + ATR stop 1.45→1.2 — tighter stops, lower DD", + "description": "v7.1 + ATR stop 1.45\u21921.2 \u2014 tighter stops, lower DD", "changelog": "v7.1 + ATR stop 1.2 (tighter stop = lower DD, faster loss cut)", "has_journal_entry": false, "sqs_score": null @@ -420,7 +405,7 @@ "id": 341, "parent": "return_max_long_v6new.362", "version_family": "v7", - "generation": 4, + "generation": 0, "status": "retired", "created_at": "2026-03-28T00:21:30.874077+00:00", "created_by": "ai_agent", @@ -432,8 +417,8 @@ "aliases": [ "conviction" ], - "description": "v362 + VIX all + entropy 1.9 on orderly — max structural, WFV gap minimized", - "changelog": "VIX all + entropy 1.9 all orderly — max structural filters", + "description": "v362 + VIX all + entropy 1.9 on orderly \u2014 max structural, WFV gap minimized", + "changelog": "VIX all + entropy 1.9 all orderly \u2014 max structural filters", "has_journal_entry": false, "sqs_score": null }, @@ -441,7 +426,7 @@ "id": 365, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:56:50.487433+00:00", "created_by": "ai_agent", @@ -453,7 +438,7 @@ "aliases": [ "conviction" ], - "description": "v7.1 + global early_fail day 2 R=0.2 — faster capital recycle", + "description": "v7.1 + global early_fail day 2 R=0.2 \u2014 faster capital recycle", "changelog": "v7.1 + global early_failure day 2 R=0.2 (faster capital recycle)", "has_journal_entry": false, "sqs_score": null @@ -462,7 +447,7 @@ "id": 366, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:56:50.984455+00:00", "created_by": "ai_agent", @@ -474,7 +459,7 @@ "aliases": [ "conviction" ], - "description": "v7.1 + ATR 1.8 + target 1.5R/30% — wider stops with partial profit lock", + "description": "v7.1 + ATR 1.8 + target 1.5R/30% \u2014 wider stops with partial profit lock", "changelog": "v7.1 + ATR 1.8 + target_1_r 1.5/frac 0.3 (partial profit taking)", "has_journal_entry": false, "sqs_score": null @@ -483,7 +468,7 @@ "id": 367, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:02:20.502713+00:00", "created_by": "ai_agent", @@ -495,8 +480,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + ATR stop 1.3 — intermediate stop tightening", - "changelog": "v7.1 + ATR 1.3 — intermediate between 1.2 and 1.45", + "description": "v7.1 + ATR stop 1.3 \u2014 intermediate stop tightening", + "changelog": "v7.1 + ATR 1.3 \u2014 intermediate between 1.2 and 1.45", "has_journal_entry": false, "sqs_score": null }, @@ -504,7 +489,7 @@ "id": 368, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:02:20.963611+00:00", "created_by": "ai_agent", @@ -516,8 +501,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + ATR stop 1.35 — intermediate stop tightening", - "changelog": "v7.1 + ATR 1.35 — mild tightening", + "description": "v7.1 + ATR stop 1.35 \u2014 intermediate stop tightening", + "changelog": "v7.1 + ATR 1.35 \u2014 mild tightening", "has_journal_entry": false, "sqs_score": null }, @@ -525,7 +510,7 @@ "id": 369, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:05:21.552524+00:00", "created_by": "ai_agent", @@ -537,8 +522,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + risk-off regime scaler 0.5 — protect weak periods", - "changelog": "v7.1 + risk_off_scaler 0.5 — halve positions in risk-off regimes", + "description": "v7.1 + risk-off regime scaler 0.5 \u2014 protect weak periods", + "changelog": "v7.1 + risk_off_scaler 0.5 \u2014 halve positions in risk-off regimes", "has_journal_entry": false, "sqs_score": null }, @@ -546,7 +531,7 @@ "id": 370, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:05:22.031237+00:00", "created_by": "ai_agent", @@ -558,8 +543,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + max_daily_risk 0.76→0.50 — less concentrated entries, lower DD", - "changelog": "v7.1 + max_daily_new_risk 0.50 — reduce concentrated daily entries", + "description": "v7.1 + max_daily_risk 0.76\u21920.50 \u2014 less concentrated entries, lower DD", + "changelog": "v7.1 + max_daily_new_risk 0.50 \u2014 reduce concentrated daily entries", "has_journal_entry": false, "sqs_score": null }, @@ -567,7 +552,7 @@ "id": 371, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:05:22.518915+00:00", "created_by": "ai_agent", @@ -579,52 +564,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + daily_risk 0.50 + risk_off 0.7 — dual protection for DD/weakness", - "changelog": "v7.1 + daily_risk 0.50 + risk_off_scaler 0.7 — dual protection", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.267_composed_gld_cp_guarded": { - "id": null, - "parent": "return_max_long_v7.266_composed_gld_cp", - "version_family": "v7", - "generation": 39, - "status": "active", - "created_at": "2026-04-10T06:30:05.792113+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.266 composed gld cp follow-up. Guard idle-alpha mixed guidance to true micro-cap names, block oversized form4 dollar clusters, and cap max position value at 90% to reduce compounded DD without giving up headline return.", - "changelog": "Guard idle-alpha mixed_micro_postmarket with 8B cap, add form4 max_total_value=500M, set max_position_value_pct=0.9", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.268_composed_gld_cp_guarded_temp100": { - "id": 1303, - "parent": "return_max_long_v7.267_composed_gld_cp_guarded", - "version_family": "v7", - "generation": 40, - "status": "active", - "created_at": "2026-04-10T07:25:00+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.267 follow-up. Keep the guarded idle-alpha and form4 filters, but tighten the parking TQQQ overlay temperature gate via the existing temp100 preset to lower compounded DD with minimal strategy drift.", - "changelog": "From v7.267, switch cash_parking_preset to qqqm_low_dd_tqqq_active_v2_gld_brake_v2_temp100 only; keep guarded idle-alpha/form4 filters unchanged.", + "description": "v7.1 + daily_risk 0.50 + risk_off 0.7 \u2014 dual protection for DD/weakness", + "changelog": "v7.1 + daily_risk 0.50 + risk_off_scaler 0.7 \u2014 dual protection", "has_journal_entry": false, "sqs_score": null }, @@ -632,7 +573,7 @@ "id": 372, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:09:07.134132+00:00", "created_by": "ai_agent", @@ -644,8 +585,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + max_candidates 18→8 — top candidates only", - "changelog": "v7.1 + max_candidates 18→8 — take only top scored candidates", + "description": "v7.1 + max_candidates 18\u21928 \u2014 top candidates only", + "changelog": "v7.1 + max_candidates 18\u21928 \u2014 take only top scored candidates", "has_journal_entry": false, "sqs_score": null }, @@ -653,7 +594,7 @@ "id": 373, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:09:07.643923+00:00", "created_by": "ai_agent", @@ -665,8 +606,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + max_candidates 18→5 — ultra selective", - "changelog": "v7.1 + max_candidates 18→5 — ultra selective", + "description": "v7.1 + max_candidates 18\u21925 \u2014 ultra selective", + "changelog": "v7.1 + max_candidates 18\u21925 \u2014 ultra selective", "has_journal_entry": false, "sqs_score": null }, @@ -674,7 +615,7 @@ "id": 374, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T01:09:08.146067+00:00", "created_by": "ai_agent", @@ -686,8 +627,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + score_threshold 0.45→0.50 — higher quality bar", - "changelog": "v7.1 + global score_threshold 0.45→0.50 — raise quality bar", + "description": "v7.1 + score_threshold 0.45\u21920.50 \u2014 higher quality bar", + "changelog": "v7.1 + global score_threshold 0.45\u21920.50 \u2014 raise quality bar", "has_journal_entry": false, "sqs_score": null }, @@ -695,7 +636,7 @@ "id": 342, "parent": "return_max_long_v6new.354", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T00:21:31.362958+00:00", "created_by": "ai_agent", @@ -707,7 +648,7 @@ "aliases": [ "conviction" ], - "description": "v354 VIX-all with halved engine risk — balance CW return vs train-test gap", + "description": "v354 VIX-all with halved engine risk \u2014 balance CW return vs train-test gap", "changelog": "v354 halved risk: broad 0.015 OME 0.015 core 0.050 mixed 0.020", "has_journal_entry": false, "sqs_score": null @@ -716,7 +657,7 @@ "id": 375, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:47:31.951796+00:00", "created_by": "ai_agent", @@ -729,7 +670,7 @@ "conviction" ], "description": "v7.1 + weak engine mcap filter: OME>=20B, mat_unknown>=20B", - "changelog": "v7.1 + OME min_mcap 4B→20B, material_unknown 8B→20B — filter small-cap losers", + "changelog": "v7.1 + OME min_mcap 4B\u219220B, material_unknown 8B\u219220B \u2014 filter small-cap losers", "has_journal_entry": false, "sqs_score": null }, @@ -737,7 +678,7 @@ "id": 376, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:47:32.463443+00:00", "created_by": "ai_agent", @@ -750,7 +691,7 @@ "conviction" ], "description": "v7.1 + weak engine mcap filter: OME>=50B, mat_unknown>=50B", - "changelog": "v7.1 + OME min_mcap 50B, material_unknown 50B — mega-cap only for weak engines", + "changelog": "v7.1 + OME min_mcap 50B, material_unknown 50B \u2014 mega-cap only for weak engines", "has_journal_entry": false, "sqs_score": null }, @@ -758,7 +699,7 @@ "id": 377, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:47:32.973010+00:00", "created_by": "ai_agent", @@ -771,7 +712,7 @@ "conviction" ], "description": "v7.1 + weak engine mcap filter: OME>=10B, mat_unknown>=15B", - "changelog": "v7.1 + OME min_mcap 10B, material_unknown 15B — mild tightening", + "changelog": "v7.1 + OME min_mcap 10B, material_unknown 15B \u2014 mild tightening", "has_journal_entry": false, "sqs_score": null }, @@ -779,7 +720,7 @@ "id": 378, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:53:31.121767+00:00", "created_by": "ai_agent", @@ -792,7 +733,7 @@ "conviction" ], "description": "v7.1 + material_unknown min_mcap 50B (surgical: worst engine only)", - "changelog": "v7.1 + material_unknown min_mcap 8B→50B only (worst WR engine)", + "changelog": "v7.1 + material_unknown min_mcap 8B\u219250B only (worst WR engine)", "has_journal_entry": false, "sqs_score": null }, @@ -800,7 +741,7 @@ "id": 379, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:57:35.629892+00:00", "created_by": "ai_agent", @@ -821,7 +762,7 @@ "id": 380, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T04:57:36.124563+00:00", "created_by": "ai_agent", @@ -838,231 +779,11 @@ "has_journal_entry": false, "sqs_score": null }, - "return_max_long_v7.356-mod11_composed_gld": { - "id": 1368, - "parent": "return_max_long_v7.356-mod5_composed_gld", - "version_family": "v7", - "generation": 51, - "status": "draft", - "created_at": "2026-04-13T03:24:45.926639+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod5_composed_gld, fully restore broad_oneoff per-trade risk from 0.50 to 0.55 to test whether the lower-DD 10% reserve version can keep its parking-led max drawdown while recovering return.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod12_composed_gld": { - "id": 1369, - "parent": "return_max_long_v7.356-mod11_composed_gld", - "version_family": "v7", - "generation": 52, - "status": "draft", - "created_at": "2026-04-13T04:18:44.222938+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod11_composed_gld, raise explicit parking reserve from 10% to 11% while keeping the recovered broad_oneoff risk so parking-led max drawdown can compress further with minimal rule complexity.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod17_composed_gld": { - "id": 1371, - "parent": "return_max_long_v7.356-mod12_composed_gld", - "version_family": "v7", - "generation": 53, - "status": "draft", - "created_at": "2026-04-13T05:00:51.542578+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod12_composed_gld, raise broad_oneoff per-trade risk from 0.55 to 0.64, roughly matching the original 3.0 ATR-era share sizing after the stop widened to 3.5 ATR.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod18_composed_gld": { - "id": 1372, - "parent": "return_max_long_v7.356-mod17_composed_gld", - "version_family": "v7", - "generation": 54, - "status": "draft", - "created_at": "2026-04-13T05:02:27.042824+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod17_composed_gld, raise broad_oneoff per-trade risk from 0.64 to 0.70 as a single round-number upper test beyond the 3.5 ATR sizing-equivalence point.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod1_composed_gld": { - "id": 1358, - "parent": "return_max_long_v7.356_composed_gld", - "version_family": "v7", - "generation": 46, - "status": "promoted", - "created_at": "2026-04-13T01:59:37.008870+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356_composed_gld, reduce reaction_close_long_extreme_orderly per-trade risk override from 1.5 to 1.0 and switch parking preset to qqqm_low_dd_tqqq_active_v2_gld_brake_v2_r07 to lower fixed-capital drawdown with limited strategy drift.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod2_composed_gld": { - "id": 1359, - "parent": "return_max_long_v7.356-mod1_composed_gld", - "version_family": "v7", - "generation": 47, - "status": "draft", - "created_at": "2026-04-13T02:12:24.929761+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod1_composed_gld, reduce next_open_long_bullish_raised_recovery_broad_oneoff per-trade risk override from 0.55 to 0.50 to trim the remaining fixed-capital tail loss after STX-driven drawdown became the dominant path.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod3_composed_gld": { - "id": 1360, - "parent": "return_max_long_v7.356-mod2_composed_gld", - "version_family": "v7", - "generation": 48, - "status": "draft", - "created_at": "2026-04-13T02:36:38.425007+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod2_composed_gld, widen next_open_long_bullish_raised_recovery_broad_oneoff stop ATR from 3.0 to 3.5 to shrink fixed-capital gap-through tail risk without materially cutting the engine's participation.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod4_composed_gld": { - "id": 1361, - "parent": "return_max_long_v7.356-mod3_composed_gld", - "version_family": "v7", - "generation": 49, - "status": "draft", - "created_at": "2026-04-13T02:45:19.813314+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod3_composed_gld, replace the parking preset with the same brake-v2 active parking parameters but raise the idle cash reserve from 7% to 9% to trim the remaining parking-led fixed-capital drawdown with minimal strategy drift.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod5_composed_gld": { - "id": 1362, - "parent": "return_max_long_v7.356-mod4_composed_gld", - "version_family": "v7", - "generation": 50, - "status": "draft", - "created_at": "2026-04-13T03:11:11.730514+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod4_composed_gld, raise the explicit parking cash reserve from 9% to 10% to keep the same broad_oneoff stop and brake-v2 parking logic while shaving a little more portfolio-level fixed-capital drawdown.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.356-mod9_composed_gld": { - "id": 1366, - "parent": "return_max_long_v7.356-mod4_composed_gld", - "version_family": "v7", - "generation": 50, - "status": "draft", - "created_at": "2026-04-13T03:23:51.855709+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "From v7.356-mod4_composed_gld, fully restore broad_oneoff per-trade risk from 0.50 to 0.55 to test whether the 3.5 ATR stop already absorbed the main STX tail risk.", - "has_journal_entry": false, - "sqs_score": null - }, "return_max_long_v7.356_composed_gld": { "id": 1348, "parent": "return_max_long_v7.349_composed_gld", "version_family": "v7", - "generation": 45, + "generation": 0, "status": "promoted", "created_at": "2026-04-10T09:21:41.353437+00:00", "created_by": "ai_agent", @@ -1073,42 +794,20 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", + "description": "v7.118 + 6 per-engine exit/veto optimizations. 12\uac1c \uc5d4\uc9c4. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15\u21921.45)\nLineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119", "changelog": "Bullish recovery: mhd 10 only (isolate mhd effect from target_1_r)", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.356_composed_gld_compound": { - "id": 1351, - "parent": "return_max_long_v7.356_composed_gld", + "id": 1348, + "parent": "return_max_long_v7.349_composed_gld", "version_family": "v7", - "generation": 46, + "generation": 0, "status": "promoted", - "created_at": "2026-04-11T06:39:59.231482+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "Cloned from return_max_long_v7.356_composed_gld", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.359_composed_gld": { - "id": 1352, - "parent": "return_max_long_v7.356_composed_gld", - "version_family": "v7", - "generation": 46, - "status": "draft", - "created_at": "2026-04-11T08:10:22.311291+00:00", + "created_at": "2026-04-10T09:21:41.353437+00:00", "created_by": "ai_agent", "tags": [ "return-max", @@ -1117,10 +816,10 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "Reduce max_positions_per_sector 5→3: sector concentration fix (sector_rotation DD 43%→<25% target)", + "description": "v7.118 + 6 per-engine exit/veto optimizations. 12\uac1c \uc5d4\uc9c4. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15\u21921.45)\nLineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119", + "changelog": "Bullish recovery: mhd 10 only (isolate mhd effect from target_1_r)", "has_journal_entry": false, "sqs_score": null }, @@ -1128,7 +827,7 @@ "id": 381, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T05:27:14.551651+00:00", "created_by": "ai_agent", @@ -1140,40 +839,18 @@ "aliases": [ "conviction" ], - "description": "v7.1에 'unknown' event type 엔진을 추가한 전략. 이번 세션의 가장 중요한 구조적 발견.\n\n배경: snapshot 데이터에 1,766개의 'unknown' 이벤트가 있었으나, scoring model이 unknown에 score 0을 부여하여 완전히 무시되고 있었음. 데이터 분석 결과 unknown 이벤트 중 reaction 5%+, close_loc 0.5+, mcap 4B+ 조건의 서브셋이 61% WR, MFE 10d 8.39%로 core engine 수준의 quality를 보임.\n\n변경: (1) scoring.py에서 unknown을 generic_material_event로 처리하도록 수정 (2) reaction_close_long_unknown_strong 엔진 추가 (reaction 5%+, close 0.5+, mcap 4B+, VIX 30, early_fail day 2)\n\n결과: CW에 단 2 trade만 추가되었지만 WFV median이 10.0→10.9%로 +0.9pp 개선. 이 +0.9pp가 WFQS의 median_return 컴포넌트를 올려 SQS +0.4pp 달성. 양보다 질의 승리.\n\n[10k 기준] SQS 74.7 | Sharpe 2.85 | Calmar 8.1 | PF 11.6 | WR 64%\nTrain +96.4% (134t) | Valid +46.9% (29t) | Test +47.4% (24t, DD 1.8%)\nCW +354.5% (186t, DD 5.6%) | WFV: median 10.9%, mean 13.2%, worst 2.95%, gap 24.3%\n\n코드 변경이 필요한 전략이지만 (scoring.py에 unknown 허용), 변경 자체는 단 1줄이며 논리적으로 타당함. v7.1과 함께 실전 배포 후보.", + "description": "v7.1\uc5d0 'unknown' event type \uc5d4\uc9c4\uc744 \ucd94\uac00\ud55c \uc804\ub7b5. \uc774\ubc88 \uc138\uc158\uc758 \uac00\uc7a5 \uc911\uc694\ud55c \uad6c\uc870\uc801 \ubc1c\uacac.\n\n\ubc30\uacbd: snapshot \ub370\uc774\ud130\uc5d0 1,766\uac1c\uc758 'unknown' \uc774\ubca4\ud2b8\uac00 \uc788\uc5c8\uc73c\ub098, scoring model\uc774 unknown\uc5d0 score 0\uc744 \ubd80\uc5ec\ud558\uc5ec \uc644\uc804\ud788 \ubb34\uc2dc\ub418\uace0 \uc788\uc5c8\uc74c. \ub370\uc774\ud130 \ubd84\uc11d \uacb0\uacfc unknown \uc774\ubca4\ud2b8 \uc911 reaction 5%+, close_loc 0.5+, mcap 4B+ \uc870\uac74\uc758 \uc11c\ube0c\uc14b\uc774 61% WR, MFE 10d 8.39%\ub85c core engine \uc218\uc900\uc758 quality\ub97c \ubcf4\uc784.\n\n\ubcc0\uacbd: (1) scoring.py\uc5d0\uc11c unknown\uc744 generic_material_event\ub85c \ucc98\ub9ac\ud558\ub3c4\ub85d \uc218\uc815 (2) reaction_close_long_unknown_strong \uc5d4\uc9c4 \ucd94\uac00 (reaction 5%+, close 0.5+, mcap 4B+, VIX 30, early_fail day 2)\n\n\uacb0\uacfc: CW\uc5d0 \ub2e8 2 trade\ub9cc \ucd94\uac00\ub418\uc5c8\uc9c0\ub9cc WFV median\uc774 10.0\u219210.9%\ub85c +0.9pp \uac1c\uc120. \uc774 +0.9pp\uac00 WFQS\uc758 median_return \ucef4\ud3ec\ub10c\ud2b8\ub97c \uc62c\ub824 SQS +0.4pp \ub2ec\uc131. \uc591\ubcf4\ub2e4 \uc9c8\uc758 \uc2b9\ub9ac.\n\n[10k \uae30\uc900] SQS 74.7 | Sharpe 2.85 | Calmar 8.1 | PF 11.6 | WR 64%\nTrain +96.4% (134t) | Valid +46.9% (29t) | Test +47.4% (24t, DD 1.8%)\nCW +354.5% (186t, DD 5.6%) | WFV: median 10.9%, mean 13.2%, worst 2.95%, gap 24.3%\n\n\ucf54\ub4dc \ubcc0\uacbd\uc774 \ud544\uc694\ud55c \uc804\ub7b5\uc774\uc9c0\ub9cc (scoring.py\uc5d0 unknown \ud5c8\uc6a9), \ubcc0\uacbd \uc790\uccb4\ub294 \ub2e8 1\uc904\uc774\uba70 \ub17c\ub9ac\uc801\uc73c\ub85c \ud0c0\ub2f9\ud568. v7.1\uacfc \ud568\uaed8 \uc2e4\uc804 \ubc30\ud3ec \ud6c4\ubcf4.", "changelog": "v7.1 + unknown event engine: reaction 5%+, close 0.5+, mcap 4B+ (61% WR in data)", "has_journal_entry": false, "sqs_score": null }, - "return_max_long_v7.360_composed_gld": { - "id": 1353, - "parent": "return_max_long_v7.356_composed_gld", - "version_family": "v7", - "generation": 46, - "status": "draft", - "created_at": "2026-04-11T08:10:32.421024+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "macro_regime_risk_off_size_scaler 1.0→0.7: reduce sizing 30% during risk-off (regime_switch -0.31→0 target)", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.361_composed_gld": { - "id": 1354, - "parent": "return_max_long_v7.356_composed_gld", + "return_max_long_v7.364_composed_gld": { + "id": 1357, + "parent": "return_max_long_v7.356_composed_gld_compound", "version_family": "v7", - "generation": 46, - "status": "draft", - "created_at": "2026-04-11T08:10:47.697432+00:00", + "generation": 1, + "status": "promoted", + "created_at": "2026-04-11T09:00:57.282492+00:00", "created_by": "ai_agent", "tags": [ "return-max", @@ -1182,20 +859,20 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "reaction_close_long_extreme_orderly macro_vix_max 30→22: block highest-risk engine in stressed VIX (high_vol_chop target)", + "description": "v7.118 + 6 per-engine exit/veto optimizations. 12\uac1c \uc5d4\uc9c4. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15\u21921.45)\nLineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119", + "changelog": "Scale ALL per_trade_risk_pct values by 0.615x (0.65\u21920.40) to reduce DD while maintaining compound growth. Engine overrides also scaled proportionally. Expected: train DD 9.46%\u21925.8%, test gross_exp 69%\u219242%, SQS 80\u219283.", "has_journal_entry": false, "sqs_score": null }, - "return_max_long_v7.362_composed_gld": { - "id": 1355, - "parent": "return_max_long_v7.356_composed_gld", + "return_max_long_v7.37": { + "id": 382, + "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 46, - "status": "draft", - "created_at": "2026-04-11T08:17:47.652808+00:00", + "generation": 2, + "status": "retired", + "created_at": "2026-03-28T05:43:14.839476+00:00", "created_by": "ai_agent", "tags": [ "return-max", @@ -1203,21 +880,20 @@ "de-risk" ], "aliases": [ - "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "conviction" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "Switch parking to qqqm_low_dd_gld (no TQQQ): reduce sector_rotation DD 43%→<25% for better scenario RRS (33→55+ target)", + "description": "v7.36 + next_open unknown engine + widen same_day to 3%+", + "changelog": "v7.36 + next_open unknown engine (post_market) + reaction 3%+", "has_journal_entry": false, "sqs_score": null }, - "return_max_long_v7.363_composed_gld": { - "id": 1356, - "parent": "return_max_long_v7.356_composed_gld", + "return_max_long_v7.372_composed_gld_loo_smallcap": { + "id": 1348, + "parent": "return_max_long_v7.356_composed_gld_compound", "version_family": "v7", - "generation": 46, - "status": "draft", - "created_at": "2026-04-11T08:41:16.592864+00:00", + "generation": 1, + "status": "candidate", + "created_at": "2026-04-10T09:21:41.353437+00:00", "created_by": "ai_agent", "tags": [ "return-max", @@ -1226,53 +902,34 @@ ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "Reduce per_trade_risk_pct 0.65→0.325 (half): improves scenario DD resilience while maintaining capped RQS quality scores. Hypothesis: RRS improves from 33 to ~50+.", + "description": "v7.118 + 6 per-engine exit/veto optimizations. 12\uac1c \uc5d4\uc9c4. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15\u21921.45)\nLineage: v7.70\u2192v7.110\u2192v7.113\u2192v7.114\u2192v7.115\u2192v7.116\u2192v7.117\u2192v7.118\u2192v7.119", + "changelog": "LOO prune: drop reaction_close_long_residual_smallcap_gap (0pp on all splits \u2014 dead weight)", "has_journal_entry": false, "sqs_score": null }, - "return_max_long_v7.364_composed_gld": { - "id": 1357, - "parent": "return_max_long_v7.356_composed_gld_compound", + "return_max_long_v7.373_composed_gld_rebuilt": { + "id": 1373, + "parent": "return_max_long_v7.371_composed_gld_brake_v3_dropsmallcap", "version_family": "v7", - "generation": 47, + "generation": 0, "status": "promoted", - "created_at": "2026-04-11T09:00:57.282492+00:00", + "created_at": "2026-05-12T00:00:00+00:00", "created_by": "ai_agent", "tags": [ "return-max", "v6new", - "de-risk" + "de-risk", + "pead-rebuild", + "no-leverage" ], "aliases": [ "conviction", - "v7.119 — 12-engine composite champion (SQS 92.4, 493% standalone)" - ], - "description": "v7.118 + 6 per-engine exit/veto optimizations. 12개 엔진. Standalone SQS 92.4 (493% return).\nBEST conservative: tqqq_calm_v2 + sleeves = 3029.38% CW, SQS 89.2\nBEST aggressive: tqqq_active_v2 + sleeves = 3245.24% CW, SQS 89.2\nParking v3: gate_vol 0.35, TQQQ vol 0.22, temp 1.0, entropy 1.45 (1.15→1.45)\nLineage: v7.70→v7.110→v7.113→v7.114→v7.115→v7.116→v7.117→v7.118→v7.119", - "changelog": "Scale ALL per_trade_risk_pct values by 0.615x (0.65→0.40) to reduce DD while maintaining compound growth. Engine overrides also scaled proportionally. Expected: train DD 9.46%→5.8%, test gross_exp 69%→42%, SQS 80→83.", - "has_journal_entry": false, - "sqs_score": null - }, - "return_max_long_v7.37": { - "id": 382, - "parent": "return_max_long_v7.36", - "version_family": "v7", - "generation": 6, - "status": "retired", - "created_at": "2026-03-28T05:43:14.839476+00:00", - "created_by": "ai_agent", - "tags": [ - "return-max", - "v6new", - "de-risk" - ], - "aliases": [ - "conviction" + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" ], - "description": "v7.36 + next_open unknown engine + widen same_day to 3%+", - "changelog": "v7.36 + next_open unknown engine (post_market) + reaction 3%+", + "description": "No-leverage PEAD rebuild from v7.371 on fixed dual-convention snapshot. Keeps buying_power at default 1.0 and disables two negative fixed-pipeline contributors: core next_open_long_unknown_inline_hivol and preset-injected IA next_open_long_guidance_mixed_micro_postmarket. Validation on pead_dualconv_ftb_fix_v2_probe: all +3317.48%, DD 21.58%, Sharpe 2.82; train +808.07%, valid +122.35%, test +30.24%.", + "changelog": "No-leverage rebuild: disable next_open_long_unknown_inline_hivol and block preset-injected next_open_long_guidance_mixed_micro_postmarket after fixed-pipeline attribution showed both negative.", "has_journal_entry": false, "sqs_score": null }, @@ -1280,7 +937,7 @@ "id": 383, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T05:43:15.303286+00:00", "created_by": "ai_agent", @@ -1301,7 +958,7 @@ "id": 384, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T05:43:15.760383+00:00", "created_by": "ai_agent", @@ -1322,7 +979,7 @@ "id": 343, "parent": "return_max_long_v6new.354", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T00:21:31.854331+00:00", "created_by": "ai_agent", @@ -1334,8 +991,8 @@ "aliases": [ "conviction" ], - "description": "v354 VIX-all + aggressive risk + entropy filter — high CW with reduced overfitting", - "changelog": "v354 + entropy 1.9 all orderly — reduce train overfit, keep VIX-all", + "description": "v354 VIX-all + aggressive risk + entropy filter \u2014 high CW with reduced overfitting", + "changelog": "v354 + entropy 1.9 all orderly \u2014 reduce train overfit, keep VIX-all", "has_journal_entry": false, "sqs_score": null }, @@ -1343,7 +1000,7 @@ "id": 385, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T05:46:08.183314+00:00", "created_by": "ai_agent", @@ -1364,7 +1021,7 @@ "id": 386, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T05:46:08.647794+00:00", "created_by": "ai_agent", @@ -1385,7 +1042,7 @@ "id": 387, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T05:47:59.650997+00:00", "created_by": "ai_agent", @@ -1406,7 +1063,7 @@ "id": 388, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T06:02:28.689240+00:00", "created_by": "ai_agent", @@ -1418,7 +1075,7 @@ "aliases": [ "conviction" ], - "description": "v7.36 + unknown in core engine — 89% WR filters select best unknowns", + "description": "v7.36 + unknown in core engine \u2014 89% WR filters select best unknowns", "changelog": "v7.36 + add unknown to core engine (89% WR filters select best unknowns)", "has_journal_entry": false, "sqs_score": null @@ -1427,7 +1084,7 @@ "id": 389, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T06:02:29.147601+00:00", "created_by": "ai_agent", @@ -1448,7 +1105,7 @@ "id": 390, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T06:02:29.617906+00:00", "created_by": "ai_agent", @@ -1460,7 +1117,7 @@ "aliases": [ "conviction" ], - "description": "v7.36 + unknown in ALL engines — maximum unknown event capture", + "description": "v7.36 + unknown in ALL engines \u2014 maximum unknown event capture", "changelog": "v7.36 + unknown in ALL engines (maximum unknown capture)", "has_journal_entry": false, "sqs_score": null @@ -1469,7 +1126,7 @@ "id": 391, "parent": "return_max_long_v7.36", "version_family": "v7", - "generation": 6, + "generation": 2, "status": "retired", "created_at": "2026-03-28T06:04:55.603251+00:00", "created_by": "ai_agent", @@ -1481,8 +1138,8 @@ "aliases": [ "conviction" ], - "description": "v7.36 + unknown engine risk 0.015 — bigger bet on quality unknowns", - "changelog": "v7.36 + unknown engine risk 0.008→0.015 (bigger position on quality unknowns)", + "description": "v7.36 + unknown engine risk 0.015 \u2014 bigger bet on quality unknowns", + "changelog": "v7.36 + unknown engine risk 0.008\u21920.015 (bigger position on quality unknowns)", "has_journal_entry": false, "sqs_score": null }, @@ -1490,7 +1147,7 @@ "id": 393, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:12:06.624417+00:00", "created_by": "ai_agent", @@ -1502,7 +1159,7 @@ "aliases": [ "conviction" ], - "description": "v7.47 + unknown risk 0.030 — max conviction on quality unknowns", + "description": "v7.47 + unknown risk 0.030 \u2014 max conviction on quality unknowns", "changelog": "v7.47 + unknown risk 0.030 (push conviction higher)", "has_journal_entry": false, "sqs_score": null @@ -1511,7 +1168,7 @@ "id": 394, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:12:07.103798+00:00", "created_by": "ai_agent", @@ -1532,7 +1189,7 @@ "id": 344, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:31:15.286139+00:00", "created_by": "ai_agent", @@ -1544,8 +1201,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + entropy 1.9 on OME — reduce high-entropy noise trades", - "changelog": "v7.1 + entropy 1.9 on unknown_ome — tighter WFV gap", + "description": "v7.1 + entropy 1.9 on OME \u2014 reduce high-entropy noise trades", + "changelog": "v7.1 + entropy 1.9 on unknown_ome \u2014 tighter WFV gap", "has_journal_entry": false, "sqs_score": null }, @@ -1553,7 +1210,7 @@ "id": 395, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:12:07.562788+00:00", "created_by": "ai_agent", @@ -1565,7 +1222,7 @@ "aliases": [ "conviction" ], - "description": "v7.47 + unknown in core engine — double unknown capture", + "description": "v7.47 + unknown in core engine \u2014 double unknown capture", "changelog": "v7.47 + unknown in core engine (catch unknowns through 89% WR filter)", "has_journal_entry": false, "sqs_score": null @@ -1574,7 +1231,7 @@ "id": 396, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:12:08.023282+00:00", "created_by": "ai_agent", @@ -1586,7 +1243,7 @@ "aliases": [ "conviction" ], - "description": "v7.47 + global risk 0.085 — better 10k position sizing", + "description": "v7.47 + global risk 0.085 \u2014 better 10k position sizing", "changelog": "v7.47 + risk 0.085 global (10k position sizing boost)", "has_journal_entry": false, "sqs_score": null @@ -1595,7 +1252,7 @@ "id": 397, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:17:21.576327+00:00", "created_by": "ai_agent", @@ -1607,8 +1264,8 @@ "aliases": [ "conviction" ], - "description": "v7.47 + a_tier 0.55 — more events get A-tier sizing", - "changelog": "v7.47 + a_tier_threshold 0.58→0.55 (more A-tier = bigger positions on good events)", + "description": "v7.47 + a_tier 0.55 \u2014 more events get A-tier sizing", + "changelog": "v7.47 + a_tier_threshold 0.58\u21920.55 (more A-tier = bigger positions on good events)", "has_journal_entry": false, "sqs_score": null }, @@ -1616,7 +1273,7 @@ "id": 398, "parent": "return_max_long_v7.47", "version_family": "v7", - "generation": 7, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:17:22.033165+00:00", "created_by": "ai_agent", @@ -1628,8 +1285,8 @@ "aliases": [ "conviction" ], - "description": "v7.47 + unknown budget 0.25 — more capital for quality unknowns", - "changelog": "v7.47 + unknown engine_risk_budget 0.15→0.25 (more budget for unknowns)", + "description": "v7.47 + unknown budget 0.25 \u2014 more capital for quality unknowns", + "changelog": "v7.47 + unknown engine_risk_budget 0.15\u21920.25 (more budget for unknowns)", "has_journal_entry": false, "sqs_score": null }, @@ -1637,7 +1294,7 @@ "id": 401, "parent": "return_max_long_v7.54", "version_family": "v7", - "generation": 8, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:28:20.239787+00:00", "created_by": "ai_agent", @@ -1649,7 +1306,7 @@ "aliases": [ "conviction" ], - "description": "v7.54 + unknown in OME engines — wider unknown capture", + "description": "v7.54 + unknown in OME engines \u2014 wider unknown capture", "changelog": "v7.54 + unknown in OME orderly engines (more unknown capture)", "has_journal_entry": false, "sqs_score": null @@ -1658,7 +1315,7 @@ "id": 402, "parent": "return_max_long_v7.54", "version_family": "v7", - "generation": 8, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:28:20.705062+00:00", "created_by": "ai_agent", @@ -1670,7 +1327,7 @@ "aliases": [ "conviction" ], - "description": "v7.54 + global risk 0.075 — mild sizing bump", + "description": "v7.54 + global risk 0.075 \u2014 mild sizing bump", "changelog": "v7.54 + risk 0.075 (slight global risk bump)", "has_journal_entry": false, "sqs_score": null @@ -1679,7 +1336,7 @@ "id": 404, "parent": "return_max_long_v7.54", "version_family": "v7", - "generation": 8, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:28:21.679319+00:00", "created_by": "ai_agent", @@ -1691,7 +1348,7 @@ "aliases": [ "conviction" ], - "description": "v7.54 + max_positions 24→20 — tighter capital concentration", + "description": "v7.54 + max_positions 24\u219220 \u2014 tighter capital concentration", "changelog": "v7.54 + max_positions 20 (more concurrent at 10k)", "has_journal_entry": false, "sqs_score": null @@ -1700,7 +1357,7 @@ "id": 345, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:31:15.779469+00:00", "created_by": "ai_agent", @@ -1712,8 +1369,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + global risk 0.085 — meaningful positions at 10k", - "changelog": "v7.1 + global risk 0.085 — better position sizing at 10k", + "description": "v7.1 + global risk 0.085 \u2014 meaningful positions at 10k", + "changelog": "v7.1 + global risk 0.085 \u2014 better position sizing at 10k", "has_journal_entry": false, "sqs_score": null }, @@ -1721,7 +1378,7 @@ "id": 405, "parent": "return_max_long_v7.55", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:36:16.229603+00:00", "created_by": "ai_agent", @@ -1733,7 +1390,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + daily_risk 2.0 — push daily deployment limit", + "description": "v7.55 + daily_risk 2.0 \u2014 push daily deployment limit", "changelog": "v7.55 + daily_risk 2.0 (push limit)", "has_journal_entry": false, "sqs_score": null @@ -1742,7 +1399,7 @@ "id": 406, "parent": "return_max_long_v7.55", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:36:16.694397+00:00", "created_by": "ai_agent", @@ -1754,7 +1411,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + entropy 2.0 on OME — gap reduction at max deploy", + "description": "v7.55 + entropy 2.0 on OME \u2014 gap reduction at max deploy", "changelog": "v7.55 + entropy 2.0 OME + daily_risk 1.5 (gap control)", "has_journal_entry": false, "sqs_score": null @@ -1763,7 +1420,7 @@ "id": 407, "parent": "return_max_long_v7.55", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:36:17.155376+00:00", "created_by": "ai_agent", @@ -1775,7 +1432,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + unknown in core — max deploy + double unknown capture", + "description": "v7.55 + unknown in core \u2014 max deploy + double unknown capture", "changelog": "v7.55 + unknown in core engine (double capture at max deploy)", "has_journal_entry": false, "sqs_score": null @@ -1784,7 +1441,7 @@ "id": 409, "parent": "return_max_long_v7.55", "version_family": "v7", - "generation": 9, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:36:18.085170+00:00", "created_by": "ai_agent", @@ -1796,7 +1453,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + daily 2.0 + broad 0.015 + unknown core — full push combo", + "description": "v7.55 + daily 2.0 + broad 0.015 + unknown core \u2014 full push combo", "changelog": "v7.55 + daily_risk 2.0 + broad 0.015 + unknown in core", "has_journal_entry": false, "sqs_score": null @@ -1805,7 +1462,7 @@ "id": 411, "parent": "return_max_long_v7.63", "version_family": "v7", - "generation": 10, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:49:21.353997+00:00", "created_by": "ai_agent", @@ -1817,7 +1474,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + broad_oneoff risk 0.015 — boost top PnL engine", + "description": "v7.55 + broad_oneoff risk 0.015 \u2014 boost top PnL engine", "changelog": "v7.63 + OME risk 0.025 (boost 2nd engine)", "has_journal_entry": false, "sqs_score": null @@ -1826,7 +1483,7 @@ "id": 412, "parent": "return_max_long_v7.63", "version_family": "v7", - "generation": 10, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:49:21.810430+00:00", "created_by": "ai_agent", @@ -1838,7 +1495,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + broad_oneoff risk 0.015 — boost top PnL engine", + "description": "v7.55 + broad_oneoff risk 0.015 \u2014 boost top PnL engine", "changelog": "v7.63 + broad 0.020 + OME 0.025 (double engine boost)", "has_journal_entry": false, "sqs_score": null @@ -1847,7 +1504,7 @@ "id": 414, "parent": "return_max_long_v7.63", "version_family": "v7", - "generation": 10, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:49:22.732407+00:00", "created_by": "ai_agent", @@ -1859,7 +1516,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + broad_oneoff risk 0.015 — boost top PnL engine", + "description": "v7.55 + broad_oneoff risk 0.015 \u2014 boost top PnL engine", "changelog": "v7.63 + core risk 0.050 (89% WR engine boost)", "has_journal_entry": false, "sqs_score": null @@ -1868,7 +1525,7 @@ "id": 346, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:31:16.266926+00:00", "created_by": "ai_agent", @@ -1880,8 +1537,8 @@ "aliases": [ "conviction" ], - "description": "v7.1 + risk 0.085 + entropy OME — balanced CW/SQS", - "changelog": "v7.1 + risk 0.085 + entropy 1.9 OME — combine best of both", + "description": "v7.1 + risk 0.085 + entropy OME \u2014 balanced CW/SQS", + "changelog": "v7.1 + risk 0.085 + entropy 1.9 OME \u2014 combine best of both", "has_journal_entry": false, "sqs_score": null }, @@ -1889,7 +1546,7 @@ "id": 415, "parent": "return_max_long_v7.65", "version_family": "v7", - "generation": 11, + "generation": 0, "status": "active", "created_at": "2026-03-28T06:56:04.654440+00:00", "created_by": "ai_agent", @@ -1901,7 +1558,7 @@ "aliases": [ "conviction" ], - "description": "v7.65 + broad_oneoff risk 0.025. ★ Sharpe 최적점 (3.13).\n\n이 전략이 v7 시리즈에서 risk-adjusted return의 정점. broad risk를 0.025 이상으로 올리면 (v7.73에서 0.035 테스트) Sharpe가 하락하기 시작함. CW는 계속 올라가지만 리스크 효율이 떨어지는 지점.\n\n전체 경로 요약: v362(Sharpe 2.83) → VIX-all(2.83) → unknown(2.85) → conviction(2.88) → daily 1.0(2.98) → daily 1.5(3.04) → broad .015(3.09) → broad .020(3.11) → broad .025(3.13) → broad .035(3.11↓). 매 단계에서 DD가 5.6%로 동일한 채 Sharpe만 상승하다가, 이 지점에서 꺾임.\n\n[10k 기준] SQS 76.9 | Sharpe 3.13 (peak) | Calmar 9.6 | PF 12.4 | WR 65%\nTrain +130.2% (134t) | Valid +50.6% (28t) | Test +57.7% (24t, DD 2.9%)\nCW +468.5% (185t, DD 5.6%) | WFV: median 11.7%, mean 15.4%, worst 5.03%, gap 30.8%\n\nv362 대비: SQS +2.3pp, Test +10.3pp, CW +152pp, Sharpe +0.30, DD 동일.\n$10k Sharpe-optimal configuration. 공격적이지만 risk-efficient한 최고 수준.", + "description": "v7.65 + broad_oneoff risk 0.025. \u2605 Sharpe \ucd5c\uc801\uc810 (3.13).\n\n\uc774 \uc804\ub7b5\uc774 v7 \uc2dc\ub9ac\uc988\uc5d0\uc11c risk-adjusted return\uc758 \uc815\uc810. broad risk\ub97c 0.025 \uc774\uc0c1\uc73c\ub85c \uc62c\ub9ac\uba74 (v7.73\uc5d0\uc11c 0.035 \ud14c\uc2a4\ud2b8) Sharpe\uac00 \ud558\ub77d\ud558\uae30 \uc2dc\uc791\ud568. CW\ub294 \uacc4\uc18d \uc62c\ub77c\uac00\uc9c0\ub9cc \ub9ac\uc2a4\ud06c \ud6a8\uc728\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uc9c0\uc810.\n\n\uc804\uccb4 \uacbd\ub85c \uc694\uc57d: v362(Sharpe 2.83) \u2192 VIX-all(2.83) \u2192 unknown(2.85) \u2192 conviction(2.88) \u2192 daily 1.0(2.98) \u2192 daily 1.5(3.04) \u2192 broad .015(3.09) \u2192 broad .020(3.11) \u2192 broad .025(3.13) \u2192 broad .035(3.11\u2193). \ub9e4 \ub2e8\uacc4\uc5d0\uc11c DD\uac00 5.6%\ub85c \ub3d9\uc77c\ud55c \ucc44 Sharpe\ub9cc \uc0c1\uc2b9\ud558\ub2e4\uac00, \uc774 \uc9c0\uc810\uc5d0\uc11c \uaebe\uc784.\n\n[10k \uae30\uc900] SQS 76.9 | Sharpe 3.13 (peak) | Calmar 9.6 | PF 12.4 | WR 65%\nTrain +130.2% (134t) | Valid +50.6% (28t) | Test +57.7% (24t, DD 2.9%)\nCW +468.5% (185t, DD 5.6%) | WFV: median 11.7%, mean 15.4%, worst 5.03%, gap 30.8%\n\nv362 \ub300\ube44: SQS +2.3pp, Test +10.3pp, CW +152pp, Sharpe +0.30, DD \ub3d9\uc77c.\n$10k Sharpe-optimal configuration. \uacf5\uaca9\uc801\uc774\uc9c0\ub9cc risk-efficient\ud55c \ucd5c\uace0 \uc218\uc900.", "changelog": "v7.65 + broad 0.025", "has_journal_entry": false, "sqs_score": null @@ -1910,7 +1567,7 @@ "id": 688, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-30T20:11:54.199458+00:00", "created_by": "ai_agent", @@ -1922,7 +1579,7 @@ "aliases": [ "conviction" ], - "description": "v7.65 + broad_oneoff risk 0.025. ★ Sharpe 최적점 (3.13).\n\n이 전략이 v7 시리즈에서 risk-adjusted return의 정점. broad risk를 0.025 이상으로 올리면 (v7.73에서 0.035 테스트) Sharpe가 하락하기 시작함. CW는 계속 올라가지만 리스크 효율이 떨어지는 지점.\n\n전체 경로 요약: v362(Sharpe 2.83) → VIX-all(2.83) → unknown(2.85) → conviction(2.88) → daily 1.0(2.98) → daily 1.5(3.04) → broad .015(3.09) → broad .020(3.11) → broad .025(3.13) → broad .035(3.11↓). 매 단계에서 DD가 5.6%로 동일한 채 Sharpe만 상승하다가, 이 지점에서 꺾임.\n\n[10k 기준] SQS 76.9 | Sharpe 3.13 (peak) | Calmar 9.6 | PF 12.4 | WR 65%\nTrain +130.2% (134t) | Valid +50.6% (28t) | Test +57.7% (24t, DD 2.9%)\nCW +468.5% (185t, DD 5.6%) | WFV: median 11.7%, mean 15.4%, worst 5.03%, gap 30.8%\n\nv362 대비: SQS +2.3pp, Test +10.3pp, CW +152pp, Sharpe +0.30, DD 동일.\n$10k Sharpe-optimal configuration. 공격적이지만 risk-efficient한 최고 수준.", + "description": "v7.65 + broad_oneoff risk 0.025. \u2605 Sharpe \ucd5c\uc801\uc810 (3.13).\n\n\uc774 \uc804\ub7b5\uc774 v7 \uc2dc\ub9ac\uc988\uc5d0\uc11c risk-adjusted return\uc758 \uc815\uc810. broad risk\ub97c 0.025 \uc774\uc0c1\uc73c\ub85c \uc62c\ub9ac\uba74 (v7.73\uc5d0\uc11c 0.035 \ud14c\uc2a4\ud2b8) Sharpe\uac00 \ud558\ub77d\ud558\uae30 \uc2dc\uc791\ud568. CW\ub294 \uacc4\uc18d \uc62c\ub77c\uac00\uc9c0\ub9cc \ub9ac\uc2a4\ud06c \ud6a8\uc728\uc774 \ub5a8\uc5b4\uc9c0\ub294 \uc9c0\uc810.\n\n\uc804\uccb4 \uacbd\ub85c \uc694\uc57d: v362(Sharpe 2.83) \u2192 VIX-all(2.83) \u2192 unknown(2.85) \u2192 conviction(2.88) \u2192 daily 1.0(2.98) \u2192 daily 1.5(3.04) \u2192 broad .015(3.09) \u2192 broad .020(3.11) \u2192 broad .025(3.13) \u2192 broad .035(3.11\u2193). \ub9e4 \ub2e8\uacc4\uc5d0\uc11c DD\uac00 5.6%\ub85c \ub3d9\uc77c\ud55c \ucc44 Sharpe\ub9cc \uc0c1\uc2b9\ud558\ub2e4\uac00, \uc774 \uc9c0\uc810\uc5d0\uc11c \uaebe\uc784.\n\n[10k \uae30\uc900] SQS 76.9 | Sharpe 3.13 (peak) | Calmar 9.6 | PF 12.4 | WR 65%\nTrain +130.2% (134t) | Valid +50.6% (28t) | Test +57.7% (24t, DD 2.9%)\nCW +468.5% (185t, DD 5.6%) | WFV: median 11.7%, mean 15.4%, worst 5.03%, gap 30.8%\n\nv362 \ub300\ube44: SQS +2.3pp, Test +10.3pp, CW +152pp, Sharpe +0.30, DD \ub3d9\uc77c.\n$10k Sharpe-optimal configuration. \uacf5\uaca9\uc801\uc774\uc9c0\ub9cc risk-efficient\ud55c \ucd5c\uace0 \uc218\uc900.", "changelog": "v7.70 on midwide universe (.2B-B, 8360 events). Tests if extending to smaller caps improves alpha. Missing tier2/tier3/macro features (null fallback).", "has_journal_entry": false, "sqs_score": null @@ -1931,7 +1588,7 @@ "id": 416, "parent": "return_max_long_v7.65", "version_family": "v7", - "generation": 11, + "generation": 0, "status": "retired", "created_at": "2026-03-28T06:56:05.128084+00:00", "created_by": "ai_agent", @@ -1943,7 +1600,7 @@ "aliases": [ "conviction" ], - "description": "v7.55 + broad_oneoff risk 0.015 — boost top PnL engine", + "description": "v7.55 + broad_oneoff risk 0.015 \u2014 boost top PnL engine", "changelog": "v7.65 + guidance 0.05 (combo best engines)", "has_journal_entry": false, "sqs_score": null @@ -1952,7 +1609,7 @@ "id": 418, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:13:16.179944+00:00", "created_by": "ai_agent", @@ -1964,7 +1621,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + broad 0.035 + daily 2.0. ⚠ Sharpe 하락 시작점.\n\nv7.70(Sharpe 3.13)에서 broad를 0.035로 올리자 Sharpe 3.11로 하락. CW는 485.6%로 올라가지만 PF가 12.4→11.9로 떨어짐 — broad 엔진의 marginal trade에서 수익성이 낮아지는 신호.\n\n[10k 기준] Sharpe 3.11 (↓0.02) | Calmar 9.8 | CW +485.6% | DD 5.6%\n\n이 지점부터 sizing이 과도해짐. 수익은 올라가지만 리스크 대비 효율이 악화. 실전 사용 비추천.", + "description": "v7.70 + broad 0.035 + daily 2.0. \u26a0 Sharpe \ud558\ub77d \uc2dc\uc791\uc810.\n\nv7.70(Sharpe 3.13)\uc5d0\uc11c broad\ub97c 0.035\ub85c \uc62c\ub9ac\uc790 Sharpe 3.11\ub85c \ud558\ub77d. CW\ub294 485.6%\ub85c \uc62c\ub77c\uac00\uc9c0\ub9cc PF\uac00 12.4\u219211.9\ub85c \ub5a8\uc5b4\uc9d0 \u2014 broad \uc5d4\uc9c4\uc758 marginal trade\uc5d0\uc11c \uc218\uc775\uc131\uc774 \ub0ae\uc544\uc9c0\ub294 \uc2e0\ud638.\n\n[10k \uae30\uc900] Sharpe 3.11 (\u21930.02) | Calmar 9.8 | CW +485.6% | DD 5.6%\n\n\uc774 \uc9c0\uc810\ubd80\ud130 sizing\uc774 \uacfc\ub3c4\ud574\uc9d0. \uc218\uc775\uc740 \uc62c\ub77c\uac00\uc9c0\ub9cc \ub9ac\uc2a4\ud06c \ub300\ube44 \ud6a8\uc728\uc774 \uc545\ud654. \uc2e4\uc804 \uc0ac\uc6a9 \ube44\ucd94\ucc9c.", "changelog": "v7.70 + broad 0.035 + daily 2.0", "has_journal_entry": false, "sqs_score": null @@ -1973,7 +1630,7 @@ "id": 419, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:13:16.649445+00:00", "created_by": "ai_agent", @@ -1985,7 +1642,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + broad 0.045 + daily 3.0. ⚠ Sizing 과도 구간.\n\nSharpe 3.04로 v7.55 수준으로 후퇴. CW 502.8%($10k→$50k+)로 처음 500% 돌파했지만, 같은 Sharpe를 v7.55가 더 적은 리스크로 달성. 즉 불필요한 리스크를 지고 있는 상태.\n\n[10k 기준] Sharpe 3.04 (↓0.09 from peak) | Calmar 10.0 | CW +502.8% | DD 5.6%\n\nCW 수치에 현혹되기 쉽지만 risk-efficiency가 악화된 명확한 과적합 구간.", + "description": "v7.70 + broad 0.045 + daily 3.0. \u26a0 Sizing \uacfc\ub3c4 \uad6c\uac04.\n\nSharpe 3.04\ub85c v7.55 \uc218\uc900\uc73c\ub85c \ud6c4\ud1f4. CW 502.8%($10k\u2192$50k+)\ub85c \ucc98\uc74c 500% \ub3cc\ud30c\ud588\uc9c0\ub9cc, \uac19\uc740 Sharpe\ub97c v7.55\uac00 \ub354 \uc801\uc740 \ub9ac\uc2a4\ud06c\ub85c \ub2ec\uc131. \uc989 \ubd88\ud544\uc694\ud55c \ub9ac\uc2a4\ud06c\ub97c \uc9c0\uace0 \uc788\ub294 \uc0c1\ud0dc.\n\n[10k \uae30\uc900] Sharpe 3.04 (\u21930.09 from peak) | Calmar 10.0 | CW +502.8% | DD 5.6%\n\nCW \uc218\uce58\uc5d0 \ud604\ud639\ub418\uae30 \uc27d\uc9c0\ub9cc risk-efficiency\uac00 \uc545\ud654\ub41c \uba85\ud655\ud55c \uacfc\uc801\ud569 \uad6c\uac04.", "changelog": "v7.70 + broad 0.045 + daily 3.0 (extreme)", "has_journal_entry": false, "sqs_score": null @@ -1994,7 +1651,7 @@ "id": 420, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:13:17.118672+00:00", "created_by": "ai_agent", @@ -2006,7 +1663,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + global risk 0.10 + broad 0.045 + daily 3.0. ⛔ 명확한 과적합.\n\nMaxDD가 처음으로 5.6%에서 7.5%로 점프. 지금까지 모든 v7 전략이 DD 5.6%를 유지했는데, 이 전략에서 처음 깨짐. Calmar 7.5(v7.70의 9.6에서 급락), Sharpe 2.98(v7.1 수준으로 후퇴).\n\n[10k 기준] Sharpe 2.98 (↓0.15 from peak) | Calmar 7.5 (↓2.1) | CW +512.3% | DD 7.5% (↑)\n\nCW 512%는 인상적이지만 DD 증가 + Calmar/Sharpe 급락은 sizing이 전략의 edge를 넘어섰다는 명확한 신호. 절대 사용하지 말 것.", + "description": "v7.70 + global risk 0.10 + broad 0.045 + daily 3.0. \u26d4 \uba85\ud655\ud55c \uacfc\uc801\ud569.\n\nMaxDD\uac00 \ucc98\uc74c\uc73c\ub85c 5.6%\uc5d0\uc11c 7.5%\ub85c \uc810\ud504. \uc9c0\uae08\uae4c\uc9c0 \ubaa8\ub4e0 v7 \uc804\ub7b5\uc774 DD 5.6%\ub97c \uc720\uc9c0\ud588\ub294\ub370, \uc774 \uc804\ub7b5\uc5d0\uc11c \ucc98\uc74c \uae68\uc9d0. Calmar 7.5(v7.70\uc758 9.6\uc5d0\uc11c \uae09\ub77d), Sharpe 2.98(v7.1 \uc218\uc900\uc73c\ub85c \ud6c4\ud1f4).\n\n[10k \uae30\uc900] Sharpe 2.98 (\u21930.15 from peak) | Calmar 7.5 (\u21932.1) | CW +512.3% | DD 7.5% (\u2191)\n\nCW 512%\ub294 \uc778\uc0c1\uc801\uc774\uc9c0\ub9cc DD \uc99d\uac00 + Calmar/Sharpe \uae09\ub77d\uc740 sizing\uc774 \uc804\ub7b5\uc758 edge\ub97c \ub118\uc5b4\uc130\ub2e4\ub294 \uba85\ud655\ud55c \uc2e0\ud638. \uc808\ub300 \uc0ac\uc6a9\ud558\uc9c0 \ub9d0 \uac83.", "changelog": "v7.70 + global risk 0.10 + daily 3.0 (max push)", "has_journal_entry": false, "sqs_score": null @@ -2015,7 +1672,7 @@ "id": 422, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T10:30:03.143333+00:00", "created_by": "claude", @@ -2027,7 +1684,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + contrarian OBV scoring (v17). 데이터 분석에서 OBV slope 방향이 반대로 적용되었음을 발견. OBV Q1 (distribution, 기관 매도) = 56.4% WR vs Q5 (accumulation) = 51.2%. PEAD는 contrarian 신호에 유리: 이벤트 전 기관이 매도하던 주식이 긍정 이벤트 후 더 좋은 drift를 보임. v17 scoring = v13e + contrarian OBV bonus (+0.04 for distribution pattern).", + "description": "v7.70 + contrarian OBV scoring (v17). \ub370\uc774\ud130 \ubd84\uc11d\uc5d0\uc11c OBV slope \ubc29\ud5a5\uc774 \ubc18\ub300\ub85c \uc801\uc6a9\ub418\uc5c8\uc74c\uc744 \ubc1c\uacac. OBV Q1 (distribution, \uae30\uad00 \ub9e4\ub3c4) = 56.4% WR vs Q5 (accumulation) = 51.2%. PEAD\ub294 contrarian \uc2e0\ud638\uc5d0 \uc720\ub9ac: \uc774\ubca4\ud2b8 \uc804 \uae30\uad00\uc774 \ub9e4\ub3c4\ud558\ub358 \uc8fc\uc2dd\uc774 \uae0d\uc815 \uc774\ubca4\ud2b8 \ud6c4 \ub354 \uc88b\uc740 drift\ub97c \ubcf4\uc784. v17 scoring = v13e + contrarian OBV bonus (+0.04 for distribution pattern).", "changelog": "v7.70 + contrarian OBV scoring (v17). OBV Q1 (distribution pattern) = 56.4% WR vs Q5 (accumulation) = 51.2%. Reversing OBV direction to correctly reward contrarian signal.", "has_journal_entry": false, "sqs_score": null @@ -2036,7 +1693,7 @@ "id": 423, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T10:30:10.224586+00:00", "created_by": "claude", @@ -2048,7 +1705,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + contrarian OBV + BB scoring (v17b). OBV Q1 + BB Q1 조합이 58.1% WR로 가장 높은 승률의 dual signal. OBV distribution + BB below midline = 이벤트 전 underpriced → 이벤트 후 더 큰 drift. v17b = v13e + contrarian OBV (+0.04) + contrarian BB (+0.03).", + "description": "v7.70 + contrarian OBV + BB scoring (v17b). OBV Q1 + BB Q1 \uc870\ud569\uc774 58.1% WR\ub85c \uac00\uc7a5 \ub192\uc740 \uc2b9\ub960\uc758 dual signal. OBV distribution + BB below midline = \uc774\ubca4\ud2b8 \uc804 underpriced \u2192 \uc774\ubca4\ud2b8 \ud6c4 \ub354 \ud070 drift. v17b = v13e + contrarian OBV (+0.04) + contrarian BB (+0.03).", "changelog": "v7.70 + contrarian OBV + BB scoring (v17b). OBV Q1 + BB Q1 combo = 58.1% WR (best dual signal). Both features were applied in wrong direction previously.", "has_journal_entry": false, "sqs_score": null @@ -2057,7 +1714,7 @@ "id": 424, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T10:30:10.699410+00:00", "created_by": "claude", @@ -2069,7 +1726,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + full contrarian reversal (v17c). OBV + BB + RSI 모두 방향 반전 + OU theta bonus. 이전 실험에서 절반의 feature 방향이 반대였음을 발견하고 전부 교정. v17c = v13e + contrarian OBV/BB/RSI + OU theta. 최대 coverage 버전.", + "description": "v7.70 + full contrarian reversal (v17c). OBV + BB + RSI \ubaa8\ub450 \ubc29\ud5a5 \ubc18\uc804 + OU theta bonus. \uc774\uc804 \uc2e4\ud5d8\uc5d0\uc11c \uc808\ubc18\uc758 feature \ubc29\ud5a5\uc774 \ubc18\ub300\uc600\uc74c\uc744 \ubc1c\uacac\ud558\uace0 \uc804\ubd80 \uad50\uc815. v17c = v13e + contrarian OBV/BB/RSI + OU theta. \ucd5c\ub300 coverage \ubc84\uc804.", "changelog": "v7.70 + full contrarian signals (v17c). OBV + BB + RSI reversed + OU theta. All previously backward features corrected.", "has_journal_entry": false, "sqs_score": null @@ -2078,7 +1735,7 @@ "id": 425, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T10:30:49.325843+00:00", "created_by": "claude", @@ -2090,7 +1747,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + engine-specific risk sizing. 엔진별 WR에 기반한 차등 리스크: earnings bullish raised (65%+ WR) → per_trade_risk 0.08, core engines (60% WR) → 0.069 (유지), unknown/material (50-55% WR) → 0.04. 현재 일률적 6.9%보다 자본 효율이 높을 수 있음.", + "description": "v7.70 + engine-specific risk sizing. \uc5d4\uc9c4\ubcc4 WR\uc5d0 \uae30\ubc18\ud55c \ucc28\ub4f1 \ub9ac\uc2a4\ud06c: earnings bullish raised (65%+ WR) \u2192 per_trade_risk 0.08, core engines (60% WR) \u2192 0.069 (\uc720\uc9c0), unknown/material (50-55% WR) \u2192 0.04. \ud604\uc7ac \uc77c\ub960\uc801 6.9%\ubcf4\ub2e4 \uc790\ubcf8 \ud6a8\uc728\uc774 \ub192\uc744 \uc218 \uc788\uc74c.", "changelog": "v7.70 + engine-specific risk sizing. Earnings bullish raised: 0.08 (high WR), core: 0.069 (base), unknown/material: 0.04 (lower WR). Risk weighted by empirical win rate per engine type.", "has_journal_entry": false, "sqs_score": null @@ -2099,7 +1756,7 @@ "id": 347, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:31:16.775521+00:00", "created_by": "ai_agent", @@ -2111,16 +1768,16 @@ "aliases": [ "conviction" ], - "description": "v7.1 + risk 0.085 + entropy 2.0 all orderly — WFV gap minimized", + "description": "v7.1 + risk 0.085 + entropy 2.0 all orderly \u2014 WFV gap minimized", "changelog": "v7.1 + entropy 2.0 on all orderly + risk 0.085", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.80": { - "id": null, + "id": 1389, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:00:00.000000+00:00", "created_by": "ai_agent", @@ -2130,16 +1787,16 @@ "earnings-surprise" ], "aliases": [], - "description": "v7.70 + earnings surprise bonus (v13e_surp). Tests whether actual EPS vs estimate data improves scoring.\n\nEarnings surprise data exists in tier3 snapshot but unused by v13e. This adds use_earnings_surprise_bonus=True:\n- 0-3% beat → +0.10 bonus (sweet spot: gradual repricing)\n- 3-8% beat → +0.05 bonus\n- >8% beat → no change (already priced in)\n- miss → -0.05 penalty\n\nCoverage: ~22% of earnings_release events (596/2703 in train). Non-earnings events unaffected.", + "description": "v7.70 + earnings surprise bonus (v13e_surp). Tests whether actual EPS vs estimate data improves scoring.\n\nEarnings surprise data exists in tier3 snapshot but unused by v13e. This adds use_earnings_surprise_bonus=True:\n- 0-3% beat \u2192 +0.10 bonus (sweet spot: gradual repricing)\n- 3-8% beat \u2192 +0.05 bonus\n- >8% beat \u2192 no change (already priced in)\n- miss \u2192 -0.05 penalty\n\nCoverage: ~22% of earnings_release events (596/2703 in train). Non-earnings events unaffected.", "changelog": "v7.70 + earnings surprise bonus (v13e_surp)", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.81": { - "id": null, + "id": 1390, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:00:01.000000+00:00", "created_by": "ai_agent", @@ -2149,16 +1806,16 @@ "midwide" ], "aliases": [], - "description": "v7.70 on midwide universe ($1B+ mcap, $10 price, $50M vol). Tests if expanding universe from 6,560 to 8,360 train events improves performance.\n\nNote: midwide snapshot has base features only (no tier3: no entropy/hurst/OU). Entropy bonus in v13e will not fire (entropy=None → skip). Tests net effect of +27% more events.\n\nUniverse filters lowered to match midwide profile: min_market_cap_proxy=1B, min_price=10, min_avg_dollar_volume=50M.\n\nNote: macro_vix_max removed from all engines (midwide/midplus snapshot lacks macro_vix data).", + "description": "v7.70 on midwide universe ($1B+ mcap, $10 price, $50M vol). Tests if expanding universe from 6,560 to 8,360 train events improves performance.\n\nNote: midwide snapshot has base features only (no tier3: no entropy/hurst/OU). Entropy bonus in v13e will not fire (entropy=None \u2192 skip). Tests net effect of +27% more events.\n\nUniverse filters lowered to match midwide profile: min_market_cap_proxy=1B, min_price=10, min_avg_dollar_volume=50M.\n\nNote: macro_vix_max removed from all engines (midwide/midplus snapshot lacks macro_vix data).", "changelog": "v7.70 on midwide universe (1B+ mcap)", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.82": { - "id": null, + "id": 1391, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:00:02.000000+00:00", "created_by": "ai_agent", @@ -2174,10 +1831,10 @@ "sqs_score": null }, "return_max_long_v7.83": { - "id": null, + "id": 1392, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T07:00:03.000000+00:00", "created_by": "ai_agent", @@ -2188,16 +1845,16 @@ "v5-scoring" ], "aliases": [], - "description": "v5 scoring on midwide universe. Control experiment: v5 has no entropy bonus so this tests pure universe expansion effect without any tier3 feature dependency.\n\nComparison chain:\n- v7.70 (tier3, v13e): baseline\n- v7.81 (midwide, v13e): entropy bonus dormant\n- v7.83 (midwide, v5): pure universe effect with v5\nIf v7.83 > v7.70 then universe expansion is net positive. If v7.81 ≈ v7.83, entropy bonus was adding real value on tier3.\n\nNote: macro_vix_max removed from all engines (midwide/midplus snapshot lacks macro_vix data).", + "description": "v5 scoring on midwide universe. Control experiment: v5 has no entropy bonus so this tests pure universe expansion effect without any tier3 feature dependency.\n\nComparison chain:\n- v7.70 (tier3, v13e): baseline\n- v7.81 (midwide, v13e): entropy bonus dormant\n- v7.83 (midwide, v5): pure universe effect with v5\nIf v7.83 > v7.70 then universe expansion is net positive. If v7.81 \u2248 v7.83, entropy bonus was adding real value on tier3.\n\nNote: macro_vix_max removed from all engines (midwide/midplus snapshot lacks macro_vix data).", "changelog": "v5 scoring on midwide universe (control)", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.84": { - "id": null, + "id": 1393, "parent": "return_max_long_v7.70", "version_family": "v7.84", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2215,10 +1872,10 @@ "sqs_score": null }, "return_max_long_v7.85": { - "id": null, + "id": 1394, "parent": "return_max_long_v7.70", "version_family": "v7.85", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2230,16 +1887,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + OU theta bonus (v13e_ou). OU theta<0.02 = slow mean-reversion → price stays at new level longer.", + "description": "v7.70 + OU theta bonus (v13e_ou). OU theta<0.02 = slow mean-reversion \u2192 price stays at new level longer.", "changelog": "OU theta bonus on v7.70 base", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.86": { - "id": null, + "id": 1395, "parent": "return_max_long_v7.70", "version_family": "v7.86", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2257,10 +1914,10 @@ "sqs_score": null }, "return_max_long_v7.87": { - "id": null, + "id": 1396, "parent": "return_max_long_v7.70", "version_family": "v7.87", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2278,10 +1935,10 @@ "sqs_score": null }, "return_max_long_v7.88": { - "id": null, + "id": 1397, "parent": "return_max_long_v7.70", "version_family": "v7.88", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2293,16 +1950,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + dynamic hold: checkpoints [(D5,R=0),(D8,R=0.1)] cut losers, extend winners to D20 if R≥0.3 at D8.", + "description": "v7.70 + dynamic hold: checkpoints [(D5,R=0),(D8,R=0.1)] cut losers, extend winners to D20 if R\u22650.3 at D8.", "changelog": "Dynamic hold: early loser cut at D5/D8 + winner extension to mhd=20 on v7.70 base", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.89": { - "id": null, + "id": 1398, "parent": "return_max_long_v7.70", "version_family": "v7.89", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2314,7 +1971,7 @@ "aliases": [ "conviction" ], - "description": "v7.70 + adaptive exit: close_location-based trailing warmup. Exhaustion (≥0.90)→warmup 1d; orderly (0.70-0.88)→warmup 12d.", + "description": "v7.70 + adaptive exit: close_location-based trailing warmup. Exhaustion (\u22650.90)\u2192warmup 1d; orderly (0.70-0.88)\u2192warmup 12d.", "changelog": "Adaptive exit on v7.70 base: close_location zones adjust trailing warmup", "has_journal_entry": false, "sqs_score": null @@ -2323,7 +1980,7 @@ "id": 348, "parent": "return_max_long_v7.1", "version_family": "v7", - "generation": 5, + "generation": 1, "status": "retired", "created_at": "2026-03-28T00:31:17.436576+00:00", "created_by": "ai_agent", @@ -2335,16 +1992,16 @@ "aliases": [ "conviction" ], - "description": "v7.1 + broad 0.015 + OME 0.015 — mild targeted risk-up", + "description": "v7.1 + broad 0.015 + OME 0.015 \u2014 mild targeted risk-up", "changelog": "v7.1 + broad 0.015 + OME 0.015 (mild engine risk-up)", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.90": { - "id": null, + "id": 1399, "parent": "return_max_long_v7.70", "version_family": "v7.90", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:04:33Z", "created_by": "ai_agent", @@ -2362,10 +2019,10 @@ "sqs_score": null }, "return_max_long_v7.91": { - "id": null, + "id": 1400, "parent": "return_max_long_v7.70", "version_family": "v7.91", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2377,16 +2034,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + prior drift positive-only bonus (v13e_pd). Prior same-ticker 5d drift >+2% → +5% bonus. 76% coverage, 8.1pp WR spread.", - "changelog": "scoring_model → return_max_long_v13e_pd", + "description": "v7.70 + prior drift positive-only bonus (v13e_pd). Prior same-ticker 5d drift >+2% \u2192 +5% bonus. 76% coverage, 8.1pp WR spread.", + "changelog": "scoring_model \u2192 return_max_long_v13e_pd", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.92": { - "id": null, + "id": 1401, "parent": "return_max_long_v7.70", "version_family": "v7.92", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2398,16 +2055,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + macro regime positive-only bonus (v13e_mr). VIX>18 + HY>3.25 fear regime → +5%. 100% coverage, 11.5pp WR spread.", - "changelog": "scoring_model → return_max_long_v13e_mr", + "description": "v7.70 + macro regime positive-only bonus (v13e_mr). VIX>18 + HY>3.25 fear regime \u2192 +5%. 100% coverage, 11.5pp WR spread.", + "changelog": "scoring_model \u2192 return_max_long_v13e_mr", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.93": { - "id": null, + "id": 1402, "parent": "return_max_long_v7.70", "version_family": "v7.93", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2420,15 +2077,15 @@ "conviction" ], "description": "v7.70 + prior drift + macro regime combined positive-only (v13e_pdmr). V11 style on v13e base.", - "changelog": "scoring_model → return_max_long_v13e_pdmr", + "changelog": "scoring_model \u2192 return_max_long_v13e_pdmr", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.94": { - "id": null, + "id": 1403, "parent": "return_max_long_v7.70", "version_family": "v7.94", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2440,8 +2097,8 @@ "aliases": [ "conviction" ], - "description": "v7.70 + prior drift bidirectional (v13e_pd2). Positive drift → +10% bonus, negative → -10% penalty.", - "changelog": "scoring_model → return_max_long_v13e_pd2", + "description": "v7.70 + prior drift bidirectional (v13e_pd2). Positive drift \u2192 +10% bonus, negative \u2192 -10% penalty.", + "changelog": "scoring_model \u2192 return_max_long_v13e_pd2", "has_journal_entry": false, "sqs_score": null }, @@ -2449,7 +2106,7 @@ "id": 415, "parent": "return_max_long_v7.70", "version_family": "v7", - "generation": 11, + "generation": 1, "status": "retired", "created_at": "2026-03-28T06:56:04.654440+00:00", "created_by": "ai_agent", @@ -2467,10 +2124,10 @@ "sqs_score": null }, "return_max_long_v7.96": { - "id": null, + "id": 1404, "parent": "return_max_long_v7.70", "version_family": "v7.91", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2482,16 +2139,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + Quantum Signal Coherence (multiplicative). 7-signal coherence fraction → ×0.85~×1.15 scaler. Constructive interference when signals align.", - "changelog": "Physics: Quantum Signal Coherence. 7-signal coherence fraction → multiplicative ×0.85~×1.15 scaler. Addresses core failure of all prior additive bonuses.", + "description": "v7.70 + Quantum Signal Coherence (multiplicative). 7-signal coherence fraction \u2192 \u00d70.85~\u00d71.15 scaler. Constructive interference when signals align.", + "changelog": "Physics: Quantum Signal Coherence. 7-signal coherence fraction \u2192 multiplicative \u00d70.85~\u00d71.15 scaler. Addresses core failure of all prior additive bonuses.", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.97": { - "id": null, + "id": 1405, "parent": "return_max_long_v7.70", "version_family": "v7.91", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2503,16 +2160,16 @@ "aliases": [ "conviction" ], - "description": "v7.70 + Boltzmann Temperature Gate (multiplicative). Cold market (<0.8) ×1.10, hot (>1.3) ×0.85. Affects 58% of trades.", - "changelog": "Physics: Boltzmann Temperature Gate. Cold market (<0.8) ×1.10, hot (>1.3) ×0.85. Affects 58% of trades. 2-3x stronger than prior ±0.03 additive bonus.", + "description": "v7.70 + Boltzmann Temperature Gate (multiplicative). Cold market (<0.8) \u00d71.10, hot (>1.3) \u00d70.85. Affects 58% of trades.", + "changelog": "Physics: Boltzmann Temperature Gate. Cold market (<0.8) \u00d71.10, hot (>1.3) \u00d70.85. Affects 58% of trades. 2-3x stronger than prior \u00b10.03 additive bonus.", "has_journal_entry": false, "sqs_score": null }, "return_max_long_v7.98": { - "id": null, + "id": 1406, "parent": "return_max_long_v7.70", "version_family": "v7.91", - "generation": 12, + "generation": 1, "status": "retired", "created_at": "2026-03-28T18:43:15Z", "created_by": "ai_agent", @@ -2524,10 +2181,478 @@ "aliases": [ "conviction" ], - "description": "v7.70 + Heisenberg Uncertainty Gate (multiplicative). Entropy×temperature product: high(>2.5)×0.85, low(<1.0)×1.10. Dual uncertainty penalty.", - "changelog": "Physics: Heisenberg Uncertainty Gate. Entropy×temperature product: high(>2.5)×0.85, low(<1.0)×1.10. Interaction term captures dual uncertainty.", + "description": "v7.70 + Heisenberg Uncertainty Gate (multiplicative). Entropy\u00d7temperature product: high(>2.5)\u00d70.85, low(<1.0)\u00d71.10. Dual uncertainty penalty.", + "changelog": "Physics: Heisenberg Uncertainty Gate. Entropy\u00d7temperature product: high(>2.5)\u00d70.85, low(<1.0)\u00d71.10. Interaction term captures dual uncertainty.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.15_composed_gld_tqqq_broad_vr32_temp100_lowdd": { + "id": 1385, + "parent": "return_max_long_v8.11_composed_gld_tqqq_bmc30_cl65_vol40_rmin1_cap96", + "version_family": "v8", + "generation": 0, + "status": "promoted", + "created_at": "2026-05-12T00:00:00+00:00", + "created_by": "ai_agent", + "tags": [ + "de-risk", + "drawdown-reduction", + "no-buying-power-leverage", + "no-leverage", + "pead-rebuild", + "pead-v8", + "return-max", + "tqqq-allowed", + "v6new", + "v8.15", + "broad-vr32", + "parking-dd-sweep" + ], + "aliases": [ + "conviction", + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" + ], + "description": "v8.15 low-DD PEAD composite: no buying-power leverage, broad-oneoff volume-ratio ceiling 3.2, 30B market-cap floor, 0.62 close-location ceiling, 100% broad cap, and tighter temp100 parking.", + "changelog": "v8.15: from v8.13 broad filters, switch parking to qqqm_low_dd_tqqq_active_v2_gld_brake_v2_temp100 for sub-9% all-period DD. No buying_power_multiplier leverage; TQQQ only via parking.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.16_composed_gld_tqqq_temp100_f4balanced36_crisis60_sqs87": { + "id": 1386, + "parent": "return_max_long_v8.15_composed_gld_tqqq_broad_vr32_temp100_lowdd", + "version_family": "return_max_long_v8", + "generation": 1, + "status": "candidate", + "created_at": "2026-05-12T00:00:00Z", + "created_by": "codex", + "tags": [ + "de-risk", + "drawdown-reduction", + "no-buying-power-leverage", + "no-leverage", + "pead-rebuild", + "pead-v8", + "return-max", + "tqqq-allowed", + "v6new", + "v8.15", + "broad-vr32", + "parking-dd-sweep", + "pead", + "v8", + "sqs", + "drawdown", + "tqqq-parking", + "overfit-aware" + ], + "aliases": [ + "conviction", + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" + ], + "description": "v8.15-derived PEAD/TQQQ quality candidate. Keeps buying_power_multiplier=1.0, keeps temp100 TQQQ parking, and reduces Form4 sleeve concentration via balanced36 preset.", + "changelog": "v8.15: from v8.13 broad filters, switch parking to qqqm_low_dd_tqqq_active_v2_gld_brake_v2_temp100 for sub-9% all-period DD. No buying_power_multiplier leverage; TQQQ only via parking.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.17_composed_gld_tqqq_temp100_f4balanced36_strict_sqs87": { + "id": 1387, + "parent": "return_max_long_v8.15_composed_gld_tqqq_broad_vr32_temp100_lowdd", + "version_family": "return_max_long_v8", + "generation": 1, + "status": "candidate", + "created_at": "2026-05-12T00:00:00Z", + "created_by": "codex", + "tags": [ + "de-risk", + "drawdown-reduction", + "no-buying-power-leverage", + "no-leverage", + "pead-rebuild", + "pead-v8", + "return-max", + "tqqq-allowed", + "v6new", + "v8.15", + "broad-vr32", + "parking-dd-sweep", + "pead", + "v8", + "sqs", + "drawdown", + "tqqq-parking", + "overfit-aware" + ], + "aliases": [ + "conviction", + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" + ], + "description": "v8.15-derived PEAD/TQQQ quality candidate. Keeps buying_power_multiplier=1.0, keeps temp100 TQQQ parking, and reduces Form4 sleeve concentration via balanced36 preset.", + "changelog": "v8.15: from v8.13 broad filters, switch parking to qqqm_low_dd_tqqq_active_v2_gld_brake_v2_temp100 for sub-9% all-period DD. No buying_power_multiplier leverage; TQQQ only via parking.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.18_composed_gld_tqqq_temp98_f4max300_crisis60_sqs872": { + "id": 1388, + "parent": "return_max_long_v8.16_composed_gld_tqqq_temp100_f4balanced36_crisis60_sqs87", + "version_family": "return_max_long_v8", + "generation": 2, + "status": "candidate", + "created_at": "2026-05-12T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18" + ], + "aliases": [ + "conviction", + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" + ], + "description": "v8.16-derived PEAD/TQQQ quality-return candidate. Keeps buying_power_multiplier=1.0, tightens TQQQ parking temperature gate to 0.98, and adds a 300M Form4 total-value cap while preserving recent valid/test behavior.", + "changelog": "v8.18: from v8.16, use direct temp98 TQQQ parking settings and direct Form4 balanced36 settings with max_total_value=300M. No buying-power leverage.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.19_composed_gld_tqqq_temp98_f4max300_no_riskoff_sqs952": { + "id": 1389, + "parent": "return_max_long_v8.18_composed_gld_tqqq_temp98_f4max300_crisis60_sqs872", + "version_family": "return_max_long_v8", + "generation": 3, + "status": "candidate", + "created_at": "2026-05-12T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19" + ], + "aliases": [ + "conviction", + "v7.119 \u2014 12-engine composite champion (SQS 92.4, 493% standalone)" + ], + "description": "v8.18-derived simple-capital refinement. Disables the weak risk_off_alpha GLD sleeve, keeps buying_power_multiplier=1.0, and preserves direct temp98 TQQQ cash-parking plus 300M Form4 cap.", + "changelog": "v8.19: from v8.18, disable risk_off_alpha_gld_crisis60. Simple-capital all-window return improved from 534.02% to 541.37%, MDD improved from 4.52% to 4.47%, SQS improved from 95.1 to 95.2. No buying-power leverage.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.20_composed_gld_tqqq_temp96_f4reserve40_cap300_no_riskoff_sqs952": { + "id": 1410, + "parent": "return_max_long_v8.19_composed_gld_tqqq_temp98_f4max300_no_riskoff_sqs952", + "version_family": "return_max_long_v8", + "generation": 4, + "status": "candidate", + "created_at": "2026-05-12T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19", + "v8.20", + "temp96", + "form4-reserve40", + "simple-capital", + "compound-validation" + ], + "aliases": [ + "v8.20 conservative Form4 reserve40 temp96" + ], + "description": "v8.20: v8.19-based simple-capital refinement. Borrow only the useful v9.2 Form4 direction conservatively: raise Form4 reserve to 40% while keeping max_total_value at 300M, and tighten TQQQ parking temperature to 0.96 to preserve drawdown. No risk-off alpha, no buying-power leverage.", + "changelog": "v8.20: from v8.19, lower TQQQ parking temperature 0.98\u21920.96 and raise direct Form4 reserve 36%\u219240% while keeping Form4 max_total_value=300M and risk_off_alpha disabled. Simple-capital return improved to 547.96% with unchanged 4.47% full-window MDD and SQS 95.2; no buying-power leverage.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.22_composed_gld_tqqq_gate0275_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957": { + "id": 1425, + "parent": "return_max_long_v8.20_composed_gld_tqqq_temp96_f4reserve40_cap300_no_riskoff_sqs952", + "version_family": "return_max_long_v8", + "generation": 6, + "status": "candidate", + "created_at": "2026-05-13T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19", + "v8.20", + "v8.21", + "v8.22", + "temp96", + "gate0275", + "brake-v3-shape", + "trail5", + "form4-reserve48", + "simple-capital", + "compound-validation" + ], + "aliases": [ + "v8.22 gate0275 brakev3 trail5 Form4 reserve48 temp96" + ], + "description": "v8.22: v8.20 simple-capital refinement that folds in the accepted v8.21 PEAD-core interaction plus a lower QQQM/TQQQ parking volatility gate. No buying-power leverage; TQQQ remains cash-parking overlay only; no risk-off alpha. Changes: parking gate vol threshold 0.35 -> 0.275, parking shock-brake v3 shape, global trailing warmup 5 days, and Form4 reserve 48% with cap held at 300M.", + "changelog": "v8.22: from v8.20, add the accepted v8.21 PEAD-core interaction and lower cash_parking_gate_vol_threshold 0.35->0.275. Keep Form4 max_total_value=300M, risk_off_alpha disabled, and buying_power_multiplier=1.0. Development metric remains simple capital; compound is validation only.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.23_composed_gld_tqqq_pos80_mixed90_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957": { + "id": 1426, + "parent": "return_max_long_v8.22_composed_gld_tqqq_gate0275_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957", + "version_family": "return_max_long_v8", + "generation": 7, + "status": "candidate", + "created_at": "2026-05-13T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19", + "v8.20", + "v8.21", + "v8.22", + "temp96", + "gate0275", + "brake-v3-shape", + "trail5", + "form4-reserve48", + "simple-capital", + "compound-validation", + "v8.23", + "pos80", + "mixed-inline-cap90", + "drawdown-control" + ], + "aliases": [ + "v8.23 pos80 mixed90 brakev3 trail5 Form4 reserve48 temp96" + ], + "description": "v8.23: v8.22 drawdown-control refinement. Keep no buying-power leverage and TQQQ as cash-parking overlay only; cap normal single-position notional at 80% of sizing capital while allowing the mixed-inline earnings engine up to 90%. This sacrifices some full-window return but improves the 2026 test split drawdown/SQS and compound validation drawdown.", + "changelog": "v8.23: from v8.22, set risk.max_position_value_pct 1.00->0.80 and set next_open_long_earnings_mixed_inline_orderly.max_position_value_pct_override=0.90. Keep buying_power_multiplier=1.0, TQQQ as cash-parking overlay only, Form4 reserve=0.48/cap=300M, and risk_off_alpha disabled. Development metric remains simple capital; compound is validation only.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.24_composed_gld_tqqq_pos80_mixed100_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957": { + "id": 1427, + "parent": "return_max_long_v8.23_composed_gld_tqqq_pos80_mixed90_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957", + "version_family": "return_max_long_v8", + "generation": 8, + "status": "candidate", + "created_at": "2026-05-13T00:00:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19", + "v8.20", + "v8.21", + "v8.22", + "temp96", + "gate0275", + "brake-v3-shape", + "trail5", + "form4-reserve48", + "simple-capital", + "compound-validation", + "v8.24", + "pos80", + "mixed-inline-cap100", + "drawdown-control" + ], + "aliases": [ + "v8.24 pos80 mixed100 brakev3 trail5 Form4 reserve48 temp96" + ], + "description": "v8.24: v8.23 simple-capital refinement. Keep no buying-power leverage and TQQQ as cash-parking overlay only; retain the 80% global single-position cap while allowing the mixed-inline earnings engine up to 100%. This is a deliberately narrow change that improves full simple/compound return and explicit valid/test return without raising explicit test drawdown.", + "changelog": "v8.24: from v8.23, raise next_open_long_earnings_mixed_inline_orderly.max_position_value_pct_override from 0.90 to 1.00. Keep risk.max_position_value_pct at 0.80, buying_power_multiplier=1.0, TQQQ as cash-parking overlay only, Form4 reserve=0.48/cap=300M, and risk_off_alpha disabled. Development metric remains simple capital; compound is validation only.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v8.25_composed_gld_tqqq_pos80_mixed100_brakev3_trail5_f4reserve49_cap300_no_riskoff_sqs957": { + "id": 1428, + "parent": "return_max_long_v8.24_composed_gld_tqqq_pos80_mixed100_brakev3_trail5_f4reserve48_cap300_no_riskoff_sqs957", + "version_family": "return_max_long_v8", + "generation": 8, + "status": "candidate", + "created_at": "2026-05-13T00:20:00Z", + "created_by": "codex", + "tags": [ + "broad-vr32", + "de-risk", + "drawdown", + "drawdown-reduction", + "form4-cap", + "no-buying-power-leverage", + "no-leverage", + "overfit-aware", + "parking-dd-sweep", + "pead", + "pead-rebuild", + "pead-v8", + "return-max", + "sqs", + "tqqq-allowed", + "tqqq-parking", + "v6new", + "v8", + "v8.15", + "v8.18", + "v8.19", + "v8.20", + "v8.21", + "v8.22", + "temp96", + "gate0275", + "brake-v3-shape", + "trail5", + "form4-reserve49", + "simple-capital", + "compound-validation", + "v8.25", + "pos80", + "mixed-inline-cap100", + "drawdown-control", + "reserve-fine-tune", + "walk-forward-checked", + "robustness-matrix-checked" + ], + "aliases": [ + "v8.25 pos80 mixed100 brakev3 trail5 Form4 reserve49 temp96" + ], + "description": "v8.25: narrow simple-capital refinement from v8.24. Keep no buying-power leverage, TQQQ as cash-parking overlay only, risk_off_alpha disabled, global position cap 80%, and mixed-inline earnings cap 100%; raise direct Form4 reserve from 48% to 49%. This improves all-window simple and compound return while preserving explicit test return/DD and SQS.", + "changelog": "v8.25: from v8.24, raise direct form4_capture.reserve_pct from 0.48 to 0.49. Keep risk.max_position_value_pct=0.80, mixed-inline cap=1.00, buying_power_multiplier=1.0, TQQQ as cash-parking overlay only, Form4 cap=300M, and risk_off_alpha disabled. Development metric remains simple capital; compound is validation only.", + "has_journal_entry": false, + "sqs_score": null + }, + "return_max_long_v9.3.2b_fc": { + "id": 1429, + "parent": "return_max_long_v9.3.1_er25_xs5_fc", + "version_family": "v9", + "generation": 3, + "status": "experimental", + "created_at": "2026-05-12T15:00:00", + "created_by": "ai_agent", + "tags": [ + "de-risk", + "drawdown-reduction", + "fixed-capital", + "no-buying-power-leverage", + "no-leverage", + "pead-rebuild", + "pead-v8", + "return-max", + "tqqq-allowed", + "v6new", + "hybrid-3way", + "er-silo", + "xsmom-silo" + ], + "aliases": [], + "description": "v9.3.6d: reallocate risk: bullish_raised_recovery 1.5% + reaction_close_core 1.39%\u21921.0%", + "changelog": "v9.3.6d: reallocate risk: bullish_raised_recovery 1.5% + reaction_close_core 1.39%\u21921.0%", "has_journal_entry": false, "sqs_score": null } } -} +} \ No newline at end of file diff --git a/configs/experiments/return_max_long_v9.3.2b_fc.json b/configs/experiments/return_max_long_v9.3.2b_fc.json new file mode 100644 index 0000000..4f64f73 --- /dev/null +++ b/configs/experiments/return_max_long_v9.3.2b_fc.json @@ -0,0 +1,748 @@ +{ + "experiment_name": "return_max_long_v9.3.2b_fc", + "dataset_snapshot_id": "pead_v931_iluk", + "description": "v9.3.2b: ER days [2,8] (wider entry window). Built on v9.3.1 (ER25/xs5 champion, SQS 93.2).", + "base_config": "configs/backtest/return_max_long_v1.json", + "overrides": { + "signal": { + "scoring_model": "return_max_long_v13e", + "score_threshold": 0.45, + "max_candidates_per_day": 18, + "a_tier_score_threshold": 0.58 + }, + "risk": { + "per_trade_risk_pct": 0.65, + "per_trade_risk_pct_a_tier": 0.715, + "max_daily_new_risk_pct": 50, + "max_positions": 30, + "max_positions_per_sector": 5, + "max_position_value_pct": 1.0, + "max_adv_fraction": 0.3, + "macro_regime_neutral_size_scaler": 1, + "macro_regime_risk_off_size_scaler": 1, + "veto_unknown_direction": false, + "macro_regime_risk_off_a_tier_only": false, + "stop_atr_multiplier": 3, + "allow_budget_downsizing": true, + "cash_parking_preset": "qqqm_low_dd_tqqq_active_v2_gld_brake_v3", + "fixed_capital_sizing": true, + "buying_power_multiplier": 1.0 + }, + "execution": { + "a_tier_target_1_r": 3.5, + "a_tier_target_1_fraction": 0, + "non_a_tier_target_1_r": 2.25, + "non_a_tier_target_1_fraction": 0, + "trailing_warmup_days": 7, + "max_holding_days": 12, + "early_failure_no_progress_days": 1, + "early_failure_no_progress_r": 0.15, + "early_failure_no_progress_fraction": 1, + "lookback_entry_enabled": true + }, + "event_type_profiles": { + "material_contract": { + "enabled": true, + "direction_filter": "any", + "max_holding_days_override": 20 + }, + "other_material_event": { + "enabled": true, + "direction_filter": "any", + "max_holding_days_override": 20 + }, + "unknown": { + "enabled": true, + "direction_filter": "any", + "max_holding_days_override": 12 + }, + "earnings_runup_preevent": { + "enabled": true, + "direction_filter": "any", + "max_holding_days_override": 7 + }, + "xsmom_12_1": { + "enabled": true, + "direction_filter": "any", + "max_holding_days_override": 21 + } + }, + "idle_alpha_sleeve_preset": "micro_event_alpha_plus_event_plus_cash_convex_microcap8_guarded", + "form4_capture_sleeve_preset": "reserve_form4_cluster_plus_fresh_same_day_v3_aggressive_plus_cooldown180_high_maxval500m", + "ownership_capture_sleeve_preset": "ownership_13d_raise_reserve_ultra_balanced_purpose_plus_cooldown90_r95", + "risk_off_alpha_sleeve_preset": "risk_off_alpha_gld_crisis65_balanced_refined" + }, + "strategy_engines": [ + { + "engine_id": "next_open_long_unknown_material_patient", + "_disabled_reason": "LOO: removing adds +234pp CW on ftb_fix_v2", + "event_types": [ + "material_contract" + ], + "event_directions": [ + "unknown" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.25, + "reaction_day_return_min": 0, + "reaction_day_return_max": 0.15, + "close_location_min": 0.5, + "close_location_max": 0.85, + "gap_size_min": 0, + "gap_size_max": 0.02, + "volume_ratio_min": 0.8, + "volume_ratio_max": 2, + "max_market_cap_proxy": 10000000000, + "document_quality_score_min": 0.5, + "parse_confidence_overall_min": 0.45, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "veto_parse_confidence_min_override": 0.45, + "next_open_gap_cap_pct": 0.02, + "early_failure_close_below_entry_and_reaction_close_override": true, + "early_failure_no_progress_days_override": 15, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": false, + "min_market_cap_proxy": 5000000000, + "macro_vix_max": 30 + }, + { + "engine_id": "reaction_close_long_core", + "event_types": [ + "earnings_release", + "guidance_update" + ], + "timing_class": "same_day", + "direction": "long_only", + "entry_timing_policy": "reaction_close", + "max_holding_days": 12, + "engine_risk_budget_pct": 1, + "reaction_day_return_min": 0, + "reaction_day_return_max": 0.18, + "close_location_min": 0.45, + "volume_ratio_min": 1, + "gap_size_min": 0, + "weak_reaction_threshold": 0.03, + "weak_reaction_gap_max": 0.02, + "unknown_direction_reaction_min": 0.05, + "unknown_direction_close_location_min": 0.7, + "attention_max_wiki_spike_10d": 6, + "score_threshold_override": 0.42, + "enabled": true, + "residual_reserve_selected": true, + "mixed_inline_close_location_max": 0.88, + "mixed_inline_gap_size_max": 0.1, + "unknown_inline_exit_close_location_min": 0.9, + "unknown_inline_exit_gap_size_max": 0.04, + "unknown_inline_early_failure_no_progress_days_override": 2, + "unknown_inline_early_failure_no_progress_r_override": 0.1, + "unknown_inline_early_failure_no_progress_fraction_override": 1, + "per_trade_risk_pct_override": 1.39, + "trailing_warmup_days_override": 8, + "macro_vix_max": 30, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_r_override": 0.2 + }, + { + "engine_id": "reaction_close_long_residual_lowclose_gap_d3", + "event_types": [ + "earnings_release", + "guidance_update" + ], + "timing_class": "same_day", + "direction": "long_only", + "entry_timing_policy": "reaction_close", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.12, + "reaction_day_return_min": 0.03, + "reaction_day_return_max": 0.2, + "close_location_min": 0.35, + "close_location_max": 0.45, + "volume_ratio_min": 1.25, + "gap_size_min": 0.05, + "gap_size_max": 0.1, + "max_market_cap_proxy": 10000000000, + "score_threshold_override": 0.35, + "target_1_r_override": 3, + "target_1_fraction_override": 0, + "residual_reserve_selected": true, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 3, + "early_failure_no_progress_r_override": 0.25, + "early_failure_no_progress_fraction_override": 1, + "enabled": true, + "macro_vix_max": 30 + }, + { + "engine_id": "reaction_close_long_residual_smallcap_gap", + "event_types": [ + "earnings_release", + "guidance_update" + ], + "timing_class": "same_day", + "direction": "long_only", + "entry_timing_policy": "reaction_close", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.12, + "reaction_day_return_min": 0.03, + "reaction_day_return_max": 0.2, + "close_location_min": 0.45, + "volume_ratio_min": 1.25, + "gap_size_min": 0.05, + "gap_size_max": 0.1, + "max_market_cap_proxy": 10000000000, + "score_threshold_override": 0.35, + "target_1_r_override": 3, + "target_1_fraction_override": 0, + "enabled": false, + "macro_vix_max": 30, + "_loo_disabled": true + }, + { + "engine_id": "reaction_close_long_extreme_orderly", + "event_types": [ + "earnings_release", + "guidance_update" + ], + "timing_class": "same_day", + "direction": "long_only", + "entry_timing_policy": "reaction_close", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.35, + "reaction_day_return_min": 0.2, + "reaction_day_return_max": 0.4, + "close_location_min": 0.83, + "volume_ratio_min": 6, + "gap_size_min": 0, + "gap_size_max": 0.15, + "attention_max_wiki_spike_10d": 6, + "score_threshold_override": 0.65, + "enabled": true, + "target_1_r_override": 99, + "target_1_fraction_override": 0, + "trailing_warmup_days_override": 8, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": null, + "early_failure_no_progress_r_override": null, + "early_failure_no_progress_fraction_override": null, + "per_trade_risk_pct_override": 1.5, + "macro_vix_max": 30 + }, + { + "engine_id": "next_open_long_unknown_inline_hivol", + "event_types": [ + "earnings_release" + ], + "event_directions": [ + "unknown" + ], + "guidance_statuses": [ + "inline_or_maintained" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.1, + "reaction_day_return_min": 0, + "reaction_day_return_max": 0.06, + "close_location_min": 0.74, + "close_location_max": 0.86, + "gap_size_min": 0, + "gap_size_max": 0.04, + "volume_ratio_min": 2.1, + "volume_ratio_max": 2.8, + "document_quality_score_min": 0.5, + "parse_confidence_overall_min": 0.5, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "veto_oneoff_penalty_override": 1, + "next_open_gap_cap_pct": 0.04, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 15, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": false, + "per_trade_risk_pct_override": 1.95, + "macro_vix_max": 30, + "_opt_disabled_reason": "v7.373 candidate: negative fixed-pipeline attribution" + }, + { + "engine_id": "next_open_long_guidance_unknown_orderly", + "event_types": [ + "guidance_update" + ], + "event_directions": [ + "unknown" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.0675, + "reaction_day_return_min": -0.03, + "reaction_day_return_max": 0.05, + "close_location_min": 0.9, + "gap_size_min": -0.02, + "gap_size_max": 0.03, + "volume_ratio_min": 0.8, + "min_market_cap_proxy": 9000000000, + "document_quality_score_min": 0.52, + "parse_confidence_overall_min": 0.48, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.03, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 15, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 4, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 15, + "enabled": false, + "veto_parse_confidence_min_override": 0.48, + "per_trade_risk_pct_override": 0.98, + "stop_atr_multiplier_override": 2, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 30, + "_disabled_reason": "v8 TQQQ-allowed DD rebuild: positive aggregate PnL but caused 2025 drawdown/cash displacement; disabling improved return/DD on fixed dual-convention snapshot." + }, + { + "engine_id": "next_open_long_earnings_mixed_inline_orderly", + "event_types": [ + "earnings_release" + ], + "event_directions": [ + "mixed" + ], + "guidance_statuses": [ + "inline_or_maintained" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.03, + "reaction_day_return_min": -0.03, + "reaction_day_return_max": 0.06, + "close_location_min": 0.5, + "gap_size_min": -0.02, + "gap_size_max": 0.05, + "volume_ratio_min": 1, + "min_market_cap_proxy": 8000000000, + "document_quality_score_min": 0.5, + "parse_confidence_overall_min": 0.5, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.04, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 8, + "early_failure_no_progress_r_override": 0.05, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": true, + "veto_parse_confidence_min_override": 0.5, + "per_trade_risk_pct_override": 1.34, + "stop_atr_multiplier_override": 3, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 30, + "_v8_change": "v8.7+: tighten no-progress exit; sweep best kept RVMD winners while reducing dead-money tail." + }, + { + "engine_id": "next_open_long_unknown_material_orderly", + "event_types": [ + "material_contract" + ], + "event_directions": [ + "unknown" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.02, + "reaction_day_return_min": -0.02, + "reaction_day_return_max": 0.07, + "close_location_min": 0.5, + "close_location_max": 0.8, + "gap_size_min": -0.02, + "gap_size_max": 0.02, + "volume_ratio_min": 0.9, + "volume_ratio_max": 1.4, + "min_market_cap_proxy": 10000000000, + "max_market_cap_proxy": 100000000000, + "document_quality_score_min": 0.5, + "parse_confidence_overall_min": 0.45, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.03, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 15, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": false, + "veto_parse_confidence_min_override": 0.45, + "per_trade_risk_pct_override": 0.23, + "stop_atr_multiplier_override": 3, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 30, + "_disabled_reason": "LOO v7.132: +37pp delta" + }, + { + "engine_id": "next_open_long_megacap_material_contract_orderly", + "event_types": [ + "material_contract", + "other_material_event" + ], + "event_directions": [ + "unknown", + "mixed" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 8, + "engine_risk_budget_pct": 0.03, + "reaction_day_return_min": 0.02, + "reaction_day_return_max": 0.12, + "close_location_min": 0.55, + "volume_ratio_min": 1, + "min_market_cap_proxy": 100000000000, + "document_quality_score_min": 0.45, + "parse_confidence_overall_min": 0.4, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.05, + "gap_size_min": -0.01, + "gap_size_max": 0.05, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 2, + "early_failure_no_progress_r_override": 0.1, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 3, + "target_1_fraction_override": 0.15, + "trailing_warmup_days_override": 8, + "enabled": true, + "veto_parse_confidence_min_override": 0.4, + "per_trade_risk_pct_override": 0.57, + "stop_atr_multiplier_override": 2.5, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 28 + }, + { + "engine_id": "next_open_long_other_material_mixed_orderly", + "_disabled_reason": "LOO: zero CW contribution on ftb_fix_v2", + "event_types": [ + "other_material_event" + ], + "event_directions": [ + "mixed" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.02, + "reaction_day_return_min": -0.04, + "reaction_day_return_max": 0.06, + "close_location_min": 0.45, + "gap_size_min": -0.03, + "gap_size_max": 0.05, + "volume_ratio_min": 1, + "min_market_cap_proxy": 6000000000, + "document_quality_score_min": 0.54, + "parse_confidence_overall_min": 0.5, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.04, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 1, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": false, + "veto_parse_confidence_min_override": 0.5, + "veto_oneoff_penalty_override": 0, + "per_trade_risk_pct_override": 0.23, + "stop_atr_multiplier_override": 3, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 30 + }, + { + "engine_id": "next_open_long_unknown_ome_orderly", + "_disabled_reason": "LOO: removing adds +336pp CW on ftb_fix_v2", + "event_types": [ + "other_material_event" + ], + "event_directions": [ + "unknown" + ], + "guidance_statuses": [ + "not_provided" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 12, + "engine_risk_budget_pct": 0.04, + "reaction_day_return_min": 0, + "reaction_day_return_max": 0.12, + "close_location_min": 0.55, + "volume_ratio_min": 1, + "min_market_cap_proxy": 4000000000, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "next_open_gap_cap_pct": 0.04, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 1, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "enabled": false, + "veto_parse_confidence_min_override": 0.4, + "per_trade_risk_pct_override": 0.13, + "stop_atr_multiplier_override": 4, + "use_reaction_day_low_stop_override": false, + "macro_vix_max": 30 + }, + { + "engine_id": "next_open_long_bullish_raised_recovery_broad_oneoff", + "event_types": [ + "earnings_release" + ], + "event_directions": [ + "bullish" + ], + "guidance_statuses": [ + "raised" + ], + "filing_time_buckets": [ + "post_market" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "max_holding_days": 10, + "engine_risk_budget_pct": 0.03, + "reaction_day_return_min": 0.01, + "reaction_day_return_max": 0.1, + "close_location_min": 0.3, + "close_location_max": 0.62, + "gap_size_min": 0.01, + "gap_size_max": 0.12, + "volume_ratio_min": 1.3, + "volume_ratio_max": 3.2, + "min_market_cap_proxy": 30000000000.0, + "document_quality_score_min": 0.5, + "parse_confidence_overall_min": 0.5, + "score_threshold_override": 0, + "residual_reserve_selected": true, + "veto_parse_confidence_min_override": 0.5, + "veto_oneoff_penalty_override": 0.75, + "allow_oneoff_downsizing_override": true, + "oneoff_downsize_floor_override": 0.15, + "next_open_gap_cap_pct": 0.12, + "early_failure_close_below_entry_and_reaction_close_override": false, + "early_failure_no_progress_days_override": 10, + "early_failure_no_progress_r_override": 0, + "early_failure_no_progress_fraction_override": 1, + "target_1_r_override": 5, + "target_1_fraction_override": 0.1, + "trailing_warmup_days_override": 12, + "per_trade_risk_pct_override": 0.55, + "stop_atr_multiplier_override": 3, + "use_reaction_day_low_stop_override": false, + "enabled": true, + "macro_vix_max": 30, + "max_position_value_pct_override": 1.0, + "_v8_change": "v8.7+: cap this drawdown-driving broad oneoff engine at 92% of equity." + }, + { + "engine_id": "next_open_long_guidance_mixed_micro_postmarket", + "enabled": false, + "post_allocation_idle_only": true, + "_opt_disabled_reason": "v7.373 candidate: block preset-injected negative engine" + }, + { + "engine_id": "er_silo", + "event_types": [ + "earnings_runup_preevent" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "engine_risk_budget_pct": 1.0, + "score_threshold_override": 0.0, + "max_holding_days": 7, + "macro_vix_max": 30.0, + "earnings_runup_enabled": true, + "earnings_runup_days_to_earnings_min": 2, + "earnings_runup_days_to_earnings_max": 8, + "earnings_runup_attention_zscore_20d_min": 1.5, + "earnings_runup_dollar_volume_zscore_20d_min": 1.0, + "earnings_runup_min_avg_dollar_volume": 50000000.0, + "earnings_runup_stop_pct": 0.04, + "earnings_runup_target_pct": 0.08, + "earnings_runup_trailing_activate_pct": 0.05, + "earnings_runup_trailing_giveback_pct": 0.03, + "earnings_runup_calendar_buffer_days": 1, + "enabled": true, + "capital_bucket_id": "er_silo", + "capital_bucket_allocation_pct": 0.25 + }, + { + "engine_id": "xsmom_silo", + "event_types": [ + "xsmom_12_1" + ], + "timing_class": "after_close", + "direction": "long_only", + "entry_timing_policy": "next_open", + "engine_risk_budget_pct": 1.0, + "score_threshold_override": 0.0, + "max_holding_days": 21, + "xsmom_enabled": true, + "xsmom_lookback_days": 252, + "xsmom_skip_days": 21, + "xsmom_top_n": 20, + "xsmom_holding_days": 21, + "xsmom_momentum_min": 0.0, + "xsmom_min_avg_dollar_volume": 10000000.0, + "xsmom_min_price": 5.0, + "xsmom_volatility_20d_max": 0.08, + "xsmom_stop_pct": 0.1, + "xsmom_target_pct": 0.3, + "xsmom_vix_max": 30.0, + "xsmom_spy_sma_filter_period": 50, + "enabled": true, + "capital_bucket_id": "xsmom_silo", + "capital_bucket_allocation_pct": 0.05 + } + ], + "splits": [ + { + "kind": "named_snapshot", + "params": { + "name": "train" + } + }, + { + "kind": "named_snapshot", + "params": { + "name": "valid" + } + }, + { + "kind": "named_snapshot", + "params": { + "name": "test" + } + } + ], + "tags": [ + "de-risk", + "drawdown-reduction", + "fixed-capital", + "no-buying-power-leverage", + "no-leverage", + "pead-rebuild", + "pead-v8", + "return-max", + "tqqq-allowed", + "v6new", + "hybrid-3way", + "er-silo", + "xsmom-silo" + ], + "notes": "2026-05-12 PEAD v8 improvement from v8.4. TQQQ is allowed only through cash parking; buying_power_multiplier remains 1.0. ORB/intraday configs are intentionally untouched.", + "aliases": [ + "v9.3.2b-champion" + ], + "version_family": "v9", + "created_at": "2026-05-12T15:00:00", + "created_by": "ai_agent", + "status": "promoted", + "generation": 3, + "changelog": "v9.3.2b: ER days [2,8] (wider entry window)", + "parent": "return_max_long_v9.3.1_er25_xs5_fc", + "id": 1381, + "performance_summary": {}, + "has_journal_entry": false, + "metadata": { + "parent": "return_max_long_v9.3_v92_er30_xs10", + "validation_snapshot": "pead_dualconv_ftb_fix_v2_probe", + "performance_fixed_capital": { + "total_return_pct": 585.97, + "sqs": 93.2, + "risk_score": 72.8, + "trades": null + } + }, + "lineage": { + "parent": "return_max_long_v8.4_composed_gld_tqqq_return", + "changes": [ + "Set next_open_long_earnings_mixed_inline_orderly early_failure_no_progress_days_override from 15 to 8", + "Set next_open_long_earnings_mixed_inline_orderly early_failure_no_progress_r_override from 0 to 0.05", + "Set next_open_long_bullish_raised_recovery_broad_oneoff max_position_value_pct_override to 0.92", + "Keep buying_power_multiplier at 1.0; TQQQ remains cash-parking overlay only" + ] + } +} diff --git a/libs/backtest/cross_sectional_momentum.py b/libs/backtest/cross_sectional_momentum.py index 6eaeca4..9f1b5bd 100644 --- a/libs/backtest/cross_sectional_momentum.py +++ b/libs/backtest/cross_sectional_momentum.py @@ -22,7 +22,10 @@ from __future__ import annotations import datetime as dt import statistics from dataclasses import dataclass, field -from typing import Any, Iterable, Protocol +from typing import TYPE_CHECKING, Any, Iterable, Protocol + +if TYPE_CHECKING: + from libs.backtest.xsmom_cache import XsmomRankCache from libs.backtest.domain import ( Candidate, @@ -212,17 +215,65 @@ def evaluate_universe_gates( # --------------------------------------------------------------------------- +def _build_candidates_from_cache( + rows: list[dict[str, Any]], + decision_date: dt.date, + next_trading_date: dt.date, + engine: StrategyEngineConfig, + top_n: int, +) -> list[Candidate]: + """Build top-N candidates from cached ranked rows (already post-quality-gate).""" + rows_sorted = sorted(rows, key=lambda r: float(r["momentum_12_1"]), reverse=True) + top = rows_sorted[:top_n] + total_ranked = len(rows_sorted) + + candidates: list[Candidate] = [] + for rank, row in enumerate(top, start=1): + last_bar_date = dt.date.fromisoformat(str(row["last_bar_date"])) + _assert_strictly_before(str(row["symbol"]), decision_date, [last_bar_date]) + inputs = CrossSectionalMomentumInputs( + symbol=str(row["symbol"]), + decision_date=decision_date, + next_trading_date=next_trading_date, + last_bar_date=last_bar_date, + last_bar_timestamp=dt.datetime.fromisoformat(str(row["last_bar_timestamp_iso"])), + last_close=float(row["last_close"]), + momentum_12_1=float(row["momentum_12_1"]), + volatility_20d=float(row["volatility_20d"]), + avg_dollar_volume_20d=float(row["avg_dollar_volume_20d"]), + ) + candidates.append(_build_candidate(inputs, engine, rank=rank, total_ranked=total_ranked)) + + if candidates: + logger.info( + "cross_sectional_momentum_rebalance", + decision_date=decision_date.isoformat(), + universe_scanned=total_ranked, + top_n_emitted=len(candidates), + top_score=float(top[0]["momentum_12_1"]) if top else None, + bottom_score=float(top[-1]["momentum_12_1"]) if top else None, + cache_hit=True, + ) + return candidates + + def build_candidates( decision_date: dt.date, next_trading_date: dt.date, universe_symbols: Iterable[str], engine: StrategyEngineConfig, bar_provider: BarHistoryProvider, + *, + cache: "XsmomRankCache | None" = None, ) -> list[Candidate]: """Emit top-N synthetic momentum candidates on rebalance days only. On non-rebalance days, returns []. The universe is scanned once per rebalance day, ranked, and the top-N pass through. + + If ``cache`` is provided: on rebalance days, tries to serve from the disk + cache (populated on prior runs). Cache miss triggers the full universe scan + and saves the ranked universe for future runs. """ if not getattr(engine, "xsmom_enabled", False): return [] @@ -235,17 +286,13 @@ def build_candidates( lookback = int(getattr(engine, "xsmom_lookback_days", 252) or 252) skip = int(getattr(engine, "xsmom_skip_days", 21) or 21) top_n = int(getattr(engine, "xsmom_top_n", 20) or 20) - holding_days = int(getattr(engine, "xsmom_holding_days", 21) or 21) momentum_min = float(getattr(engine, "xsmom_momentum_min", 0.0) or 0.0) fetch_lookback = lookback + skip + 5 - # First, check rebalance gate using ANY symbol's bars (they all share the - # same trading calendar). Use the first symbol with enough history. scored: list[tuple[float, CrossSectionalMomentumInputs]] = [] seen: set[str] = set() rebalance_checked = False - is_rebalance = False for raw_symbol in universe_symbols: symbol = str(raw_symbol).strip().upper() @@ -270,6 +317,13 @@ def build_candidates( rebalance_checked = True if not is_rebalance: return [] + # Rebalance confirmed: try cache before scanning remaining universe. + if cache is not None: + cached_rows = cache.get_date(decision_date) + if cached_rows is not None: + return _build_candidates_from_cache( + cached_rows, decision_date, next_trading_date, engine, top_n + ) last_close = float(last_bar.get("close", 0.0)) if last_close <= 0: @@ -312,6 +366,22 @@ def build_candidates( scored.sort(key=lambda t: t[0], reverse=True) top = scored[:top_n] + # Save full ranked universe to cache (pre-top_n) for future runs. + if cache is not None and scored: + cache.save_date(decision_date, [ + { + "decision_date": decision_date.isoformat(), + "symbol": inp.symbol, + "momentum_12_1": inp.momentum_12_1, + "volatility_20d": inp.volatility_20d, + "avg_dollar_volume_20d": inp.avg_dollar_volume_20d, + "last_close": inp.last_close, + "last_bar_date": inp.last_bar_date.isoformat(), + "last_bar_timestamp_iso": inp.last_bar_timestamp.isoformat(), + } + for _, inp in scored + ]) + candidates: list[Candidate] = [] for rank, (_, inputs) in enumerate(top, start=1): candidates.append(_build_candidate(inputs, engine, rank=rank, total_ranked=len(scored))) diff --git a/libs/backtest/snapshot_store.py b/libs/backtest/snapshot_store.py index 728df18..359c56b 100644 --- a/libs/backtest/snapshot_store.py +++ b/libs/backtest/snapshot_store.py @@ -104,6 +104,7 @@ class SnapshotStore: self._macro = macro_by_date or {} self._price_bar_cache: dict[str, list[Any]] = {} self._market_feature_cache: dict[tuple[str, dt.date], dict[str, Any]] = {} + self.snapshot_dir: Path | None = None # ------------------------------------------------------------------ # Public query interface @@ -263,6 +264,7 @@ class SnapshotStore: for date, rows in sliced._candidates_by_reaction_date.items() if start_date <= date <= end_date } + sliced.snapshot_dir = self.snapshot_dir return sliced # ------------------------------------------------------------------ @@ -295,7 +297,7 @@ class SnapshotStore: ) snapshot_path = Path(snapshot_dir) - return cls._load_with_runtime_cache( + store = cls._load_with_runtime_cache( snapshot_path=snapshot_path, split_names=[split_name], scoring_fn=scoring_fn, @@ -303,6 +305,8 @@ class SnapshotStore: cls._async_load(snapshot_path, split_name, oracle_url, db_dsn, scoring_fn) ), ) + store.snapshot_dir = snapshot_path + return store @classmethod def load_merged( @@ -326,7 +330,7 @@ class SnapshotStore: ) snapshot_path = Path(snapshot_dir) - return cls._load_with_runtime_cache( + store = cls._load_with_runtime_cache( snapshot_path=snapshot_path, split_names=split_names, scoring_fn=scoring_fn, @@ -334,6 +338,8 @@ class SnapshotStore: cls._async_load_merged(snapshot_path, split_names, oracle_url, db_dsn, scoring_fn) ), ) + store.snapshot_dir = snapshot_path + return store @classmethod def materialize_snapshot_dir( diff --git a/libs/backtest/xsmom_cache.py b/libs/backtest/xsmom_cache.py new file mode 100644 index 0000000..1524c77 --- /dev/null +++ b/libs/backtest/xsmom_cache.py @@ -0,0 +1,199 @@ +"""Disk-based cache for xsmom cross-sectional momentum ranked-universe results. + +Caches the full pre-ranked universe per rebalance date so that re-runs with +different top_n values can skip the expensive per-symbol bar scan (900+ symbols +× 278-bar lookback) and just slice the cached ranking. + +Cache key: (snapshot_fingerprint, param_hash, XSMOM_CACHE_VERSION) +Cache file: /.runtime_cache/xsmom_v{N}__{param_hash}.parquet + +The cache stores rows that have already passed all universe-quality gates +(min_price, min_adv, vol_max, momentum_min). Only top_n selection is deferred +to read time so a single cache file serves runs with different top_n values. +""" +from __future__ import annotations + +import datetime as dt +import hashlib +import json +import os +from pathlib import Path +from typing import Any +from uuid import uuid4 + +import pyarrow as pa +import pyarrow.parquet as pq + +from libs.common.logging import get_logger + +logger = get_logger(__name__) + +XSMOM_CACHE_VERSION = 1 + +# Params that determine the cached content. +# top_n is NOT here — it only slices the cached ranking. +_CACHE_KEY_PARAMS = ( + "xsmom_lookback_days", + "xsmom_skip_days", + "xsmom_min_avg_dollar_volume", + "xsmom_min_price", + "xsmom_volatility_20d_max", + "xsmom_momentum_min", +) + +_SCHEMA = pa.schema([ + pa.field("decision_date", pa.string()), + pa.field("symbol", pa.string()), + pa.field("momentum_12_1", pa.float64()), + pa.field("volatility_20d", pa.float64()), + pa.field("avg_dollar_volume_20d", pa.float64()), + pa.field("last_close", pa.float64()), + pa.field("last_bar_date", pa.string()), + pa.field("last_bar_timestamp_iso", pa.string()), +]) + + +def compute_snapshot_fingerprint(snapshot_dir: Path) -> str: + """SHA-256 fingerprint of snapshot manifest + parquet files (size + mtime_ns).""" + parts: list[str] = [f"xsmom_v{XSMOM_CACHE_VERSION}"] + manifest = snapshot_dir / "manifest.json" + if manifest.exists(): + s = manifest.stat() + parts.append(f"manifest:{s.st_size}:{s.st_mtime_ns}") + for pq_path in sorted(snapshot_dir.glob("*.parquet")): + s = pq_path.stat() + parts.append(f"{pq_path.name}:{s.st_size}:{s.st_mtime_ns}") + return hashlib.sha256("|".join(parts).encode()).hexdigest()[:32] + + +def build_param_hash(engine: Any) -> str: + """16-char hex hash of the cache-key params from an engine config.""" + params = {k: getattr(engine, k, None) for k in _CACHE_KEY_PARAMS} + raw = json.dumps(params, sort_keys=True, default=str) + return hashlib.sha256(raw.encode()).hexdigest()[:16] + + +class XsmomRankCache: + """Per-snapshot-dir disk cache for xsmom rebalance-day ranked universes. + + Lifecycle: + 1. Construct once per backtest run (lazy, on first rebalance day). + 2. Pass to build_candidates() on every call. + 3. Call close() after the backtest loop to flush new rows to disk. + """ + + def __init__( + self, + snapshot_dir: Path, + snapshot_fingerprint: str, + param_hash: str, + ) -> None: + self._cache_dir = snapshot_dir / ".runtime_cache" + self._fingerprint = snapshot_fingerprint + self._param_hash = param_hash + self._cache_path = ( + self._cache_dir + / f"xsmom_v{XSMOM_CACHE_VERSION}__{param_hash}.parquet" + ) + # None = not yet attempted; {} = loaded (possibly empty due to miss) + self._by_date: dict[str, list[dict[str, Any]]] | None = None + self._new_rows: list[dict[str, Any]] = [] + + # ------------------------------------------------------------------ + # Internal: lazy load + # ------------------------------------------------------------------ + + def _ensure_loaded(self) -> None: + if self._by_date is not None: + return + if not self._cache_path.exists(): + logger.info( + "xsmom_cache_miss", + reason="file_missing", + cache_file=str(self._cache_path), + ) + self._by_date = {} + return + try: + table = pq.read_table(str(self._cache_path)) + meta = table.schema.metadata or {} + stored_fp = (meta.get(b"xsmom_fingerprint") or b"").decode() + if stored_fp != self._fingerprint: + logger.info( + "xsmom_cache_miss", + reason="fingerprint_mismatch", + cache_file=str(self._cache_path), + ) + self._by_date = {} + return + by_date: dict[str, list[dict[str, Any]]] = {} + for row in table.to_pylist(): + d = str(row["decision_date"]) + by_date.setdefault(d, []).append(row) + self._by_date = by_date + logger.info( + "xsmom_cache_hit", + cache_file=str(self._cache_path), + dates=len(by_date), + rows=table.num_rows, + ) + except Exception as exc: + logger.warning( + "xsmom_cache_read_failed", + cache_file=str(self._cache_path), + error=str(exc), + ) + self._by_date = {} + + # ------------------------------------------------------------------ + # Public API + # ------------------------------------------------------------------ + + def get_date(self, decision_date: dt.date) -> list[dict[str, Any]] | None: + """Return cached ranked rows for decision_date, or None on miss.""" + self._ensure_loaded() + return self._by_date.get(decision_date.isoformat()) + + def save_date(self, decision_date: dt.date, rows: list[dict[str, Any]]) -> None: + """Buffer ranked rows for this rebalance date. Flushed by close().""" + self._new_rows.extend(rows) + + def close(self) -> None: + """Flush buffered rows to disk via atomic write. No-op if nothing new.""" + if not self._new_rows: + return + all_rows: list[dict[str, Any]] = [] + if self._by_date: + for date_rows in self._by_date.values(): + all_rows.extend(date_rows) + all_rows.extend(self._new_rows) + + table = pa.Table.from_pylist(all_rows, schema=_SCHEMA) + existing_meta = dict(table.schema.metadata or {}) + table = table.replace_schema_metadata( + {**existing_meta, b"xsmom_fingerprint": self._fingerprint.encode()} + ) + self._cache_dir.mkdir(parents=True, exist_ok=True) + _write_table_atomic(table, self._cache_path) + logger.info( + "xsmom_cache_written", + cache_file=str(self._cache_path), + total_rows=len(all_rows), + new_dates=len({r["decision_date"] for r in self._new_rows}), + ) + self._new_rows = [] + + +# ------------------------------------------------------------------ +# Atomic write (mirrors libs/intraday/cache.py pattern) +# ------------------------------------------------------------------ + +def _write_table_atomic(table: pa.Table, path: Path) -> None: + tmp = path.with_suffix(f".{uuid4().hex}.tmp") + try: + pq.write_table(table, str(tmp), compression="snappy") + os.replace(str(tmp), str(path)) + except Exception: + if tmp.exists(): + tmp.unlink(missing_ok=True) + raise