135 · Strategy Re-bake + relatedInsider Retirement (2026-06-04)
Author: financial-correctness re-bake (authorized by owner)
Scope: src/lib/winning-strategy.ts (STRATEGY_PROOF), src/lib/signals.ts (relatedInsiderScore, computeV13Score), and every public surface that renders these numbers (landing track-record + headline, /performance, /backtest, /how-it-works, methodology, README, vip-landing, REST).
Method: a single deterministic, committed reproduction script re-runs the audit-103 V14e picker on live Neon prod data, WITH and WITHOUT the relatedInsider weights, and re-derives every headline constant. No number below is hand-entered; each is produced by the script.
Reproduction command:
DATABASE_URL="$DATABASE_URL_DIRECT" node --env-file=.env --import tsx \
scripts/_v13_bakeoff/rebake-strategy-proof-2026-06-04.ts
Output JSON: scripts/_v13_bakeoff/rebake-2026-06-04.json (deterministic; same DB snapshot -> identical JSON).
TL;DR: The audit-133 integrity findings are confirmed and acted on. (1) The headline OOS Sharpe 1.36 / CAGR 38.6 % does NOT reproduce; the faithful re-run of the same picker gives Sharpe 0.43 / CAGR 12.1 % (WITH the relatedInsider weight) or 0.66 / 20.4 % (without it). (2) The relatedInsider edge is dead-to-inverted in live data and was subtracting alpha; it has been retired from the score, which LIFTS the OOS Sharpe from 0.43 to 0.66 and pushes DSR above the luck-floor. (3) The fabricated/stale constants (n=173 77 %/13.2 %, Sharpe 1.87, the _proofYears table, the n=20,688 universe, the regulator-keyed srMarkets, the fake landing sparkline) have all been replaced with reproduced values or removed.
1. OOS re-bake (the headline proof)
Same picker as audit 103: V14e on EU_strict (XPAR, XAMS, XWBO, XBRU, XHEL, XOSL, XSTO, XETR), top-10/month, T+90 hold, NET 0.6 % round-trip cost, winsor +/-50 %, monthly buckets. The universe row reproduces exactly (n_OOS = 12,384), confirming the harness is faithful to the claimed methodology.
OOS window: 2025-01-01 to 2026-02-26 (max matured pubDate with a T+90 return today), T = 14 monthly buckets, 140 picks.
| Variant | Sharpe (ann.) | CI95 | CAGR NET | MaxDD | Win-rate | DSR (N=18, T=14) |
|---|---|---|---|---|---|---|
| Claimed (audit 103, displayed) | 1.36 | [-0.46, +4.20] | +38.6 % | -10.6 % | 55.0 % | +0.43 |
| Reproduced, WITH relatedInsider | 0.43 | [-1.67, +2.49] | +12.1 % | -24.0 % | 52.9 % | -0.22 |
| Reproduced, NO relatedInsider (SHIPPED) | 0.66 | [-1.25, +3.00] | +20.4 % | -23.8 % | 53.6 % | +0.02 |
The claim was ~2x the Sharpe and ~1.9x the CAGR of a faithful reconstruction, and understated the drawdown by ~13 pts. The gap is dominated by an implausibly low claimed monthly sigma (6.41 % claimed vs ~8.7 % realized). Sanity check: ranking by the stored production signalScoreV13 column (not the recomputed score) gives Sharpe 0.33 (net+winsor) to 0.77 (gross, no-winsor) -- no reasonable variant reaches 1.36.
The shipped numbers are the relatedInsider-free variant (Sharpe 0.66 / CAGR 20.4 %), because the relatedInsider weight has been retired (section 2).
2. relatedInsider decision (audit 133 #1)
The founding stat ("related n=111, WR 85.4 %, +268 % 1Y vs direct n=4,075, WR 46.3 %, +227 %") was an outlier artefact on a tiny old cohort. Re-estimated on the original 2023-2024 BUY window (1Y = returnFromPub365d), the cohort grew ~185x and the effect inverted:
| Cohort (2023-2024, 1Y) | n | Win-rate | Mean 1Y | Median 1Y |
|---|---|---|---|---|
| direct | 26,962 | 54.3 % | +41.4 % | +3.3 % |
| related | 20,502 | 50.0 % | +1.5 % | +0.1 % |
In the EU_strict OOS picker universe itself, related is even worse (n=735, WR 42.3 %, mean -1.1 %, vs direct WR 50.7 %, mean +2.9 %). The signal is noise-to-negative in every cohort.
Decision: RETIRE the relatedInsider weight. It fed three places in signals.ts:
relatedInsiderScore(V12 +5 pt bonus incomputeScore),- the V13.1g related-kind multiplier in
computeV13Score(1.20x / 1.05x), - the V14e family/entity multiplier in
computeV13Score(entity +0.10, family +0.20).
All three are now gated behind RELATED_INSIDER_WEIGHT_ENABLED = false (kept for one-line rollback). Re-baking the OOS picker WITHOUT the weight is the table in section 1: Sharpe 0.43 -> 0.66 (+0.23), CAGR +12.1 % -> +20.4 %, DSR -0.22 -> +0.02 (crosses the luck-floor), MaxDD essentially unchanged. Removing the dead signal strictly improved the strategy.
3. Ship-gate (AGENTS.md)
The shipped change is removal of a negative signal (the relatedInsider weight); it does not add a filter or loosen the universe. Evaluated against the gate on the OOS window:
- OOS window: 2025-01-01 to 2026-02-26, 14 monthly buckets, n_OOS = 12,384. (Single regime, short -- disclosed.)
- Sharpe >= previous live version: 0.66 (no-related) >= 0.43 (with-related). PASS (the removal is the change; it raises Sharpe).
- **DSR drop <= 0.30 pts**: DSR went UP (-0.22 -> +0.02). PASS.
- CI95 lower bound >= -2.0: -1.25. PASS.
- Audit written: this document.
Honesty note: the previously displayed 1.36 was never reproducible; restating it down to the real 0.66 is the correctness fix, not a regression. The real DSR is only +0.02 (barely above zero) at N=18 and goes negative (-0.15) at a more honest N=100 -- the strategy is a directional signal, not statistically robust proof, and the disclosure copy now says so.
4. Exactly which numbers/files changed (old displayed -> new reproduced)
src/lib/winning-strategy.ts (STRATEGY_PROOF)
| Field | Old (displayed) | New (reproduced) |
|---|---|---|
oosResults.sharpeAnnualized |
1.36 | 0.66 |
oosResults.sharpeCI95Lo/Hi |
-0.46 / 4.20 | -1.25 / 3.00 |
oosResults.sharpeDeflated |
0.43 | 0.02 |
oosResults.cagrPct |
38.6 | 20.4 |
oosResults.maxDDPct |
-10.6 | -23.8 |
oosResults.hitRatePct |
55.0 | 53.6 |
oosResults.calmar / sortino |
3.63 / 2.10 | 0.86 / 0.95 |
oosResults.testWindow / auditDoc |
2026-05-21 / 103 | 2026-02-26 / 135 |
monthlyPortfolio (mean/sigma/sharpe) |
2.76 / 6.41 / 1.36 | 1.91 / 8.71 / 0.66 |
winRate |
77 | 49.1 (real Sigma-filtered subset, n=2,315) |
winRateCI95 |
6.3 | 2.0 |
avgReturn |
13.2 | 2.2 |
avgAlpha |
10.1 | -0.9 |
totalSamples |
173 | 2,315 |
sharpeCrossSectional (_sharpeCrossSectional) |
1.87 | 0.08 |
_proofYears (2022/23/24/25 strategy) |
-7.9 / 16.0 / -3.7 / 48.3 | 25.3 / -24.4 / -18.8 / 29.5 (vs real ^FCHI CAC40) |
_proofYears winning years vs CAC40 |
3 of 4 | 2 of 4 (2022, 2025) |
maxDrawdownPct |
-22 | -24 |
universeSize / crossMarketUniverse.n |
20,688 | 257,148 |
crossMarketUniverse.{winRate, mean} |
46.8 % / +0.78 % | 42.5 % / -2.14 % (winsorized mean) |
liveOosUniverse (fallback) |
20,688 / 52.96 % / 8.59 % | 42,501 / 53.88 % / 3.46 % (winsor mean) |
srMarkets keys |
FR/SEC/AFM/... (queried n=0) | MIC codes (XNAS/XPAR/XAMS/XSTO/XHEL/XMAD), recomputed |
relatedInsider |
n=111 WR 85.4 % +268 % | n=20,502 WR 50.0 % +1.5 % (real, inverted) |
disclosure.multipleTestingRisk |
cites 1.36 / 38.6 % / +0.43 | restated to 0.66 / 20.4 % / +0.02, relatedInsider retirement noted |
src/lib/signals.ts
relatedInsiderScore: +5 -> 0 (gatedRELATED_INSIDER_WEIGHT_ENABLED=false).computeV13Score: V13.1g related-kind multiplier and V14e family/entity multiplier both gated off.- New export
RELATED_INSIDER_WEIGHT_ENABLED = false(rollback switch).
Public surfaces
src/components/landing/LandingTrackRecord.tsx: removed the fake 22-point hardcoded win-rate sparkline; replaced with the real cumulative-NAV curve fromSTRATEGY_PROOF.years(break-even reference at EUR 1, end-label shows the real final multiple). Title/aria updated from "illustrative win rate" to "EUR 1 growth".src/app/[lang]/how-it-works/page.tsx,src/components/methodology/ScoringWalkthrough.tsx: stale fallback literals (1.36 / 0.43 / 38.6 / -10.6 / 55 %) updated to the reproduced values; DSR/CAGR+prefixes made sign-safe.src/components/howItWorks/copy.ts: the n=173 discovery-cohort disclaimer (FR+EN) rewritten to describe the reproduced EU_strict per-year track record (2 of 4 winning years).README.md: Results table restated to the reproduced numbers; relatedInsider retirement documented; audit 103 marked superseded by 135.src/app/api/v1/recommendations/route.ts: stale "Sharpe 1.36" code comments updated to 0.66.src/components/StrategyProofHeadline.tsx: docstring example 1.87 -> 0.08.- vip-landing (
floors.ts/vip-landing/page.tsx), methodology chapters,/performance,/backtest: already readSTRATEGY_PROOFdynamically, so they auto-corrected.
Tests
src/__tests__/unit/signals-scoring.test.ts: 3 golden tests updated to characterize the retired (zeroed) relatedInsider behavior.
5. Caveats + known risks
- Single short OOS window. 14 monthly buckets, one regime (2025-2026). Not repeated forward validation. The DSR is +0.02 (N=18) and negative (-0.15) at N=100 -- treat the OOS Sharpe as a directional signal, not robust proof.
- EU_strict is a universe-selection degree of freedom. XNAS (the majority of the data, cross-sectionally negative) is excluded. Defensible (US-tape inversion, audit 101) but should be confirmed on a second disjoint OOS window before being called settled.
- 2022-2024
_proofYearsare IN-SAMPLE. The picker trained on them; only 2025+ is true OOS. The landing/how-it-works copy states this. - Survivorship bias (delisted names absent) still biases all figures upward; disclosed, not corrected.
- Universe means are outlier-driven. Raw means are dominated by a fat right tail (penny-stock returns up to +900,000 %); the published means are winsorized (0.5/99.5) and paired with the median. The winsorized full-universe mean is NEGATIVE (-2.14 %) -- Sigma's edge is selection, not the universe.
avgReturn(2.2 %) and the per-year track record are computed on the live DB and will drift; they should be regenerated from the committed script, not edited by hand.
6. Confidence statement
High confidence in the direction of every change: the 1.36 headline is not reproducible (confirmed across the recomputed score and the stored-column score, multiple cost/winsor variants), the relatedInsider edge is inverted in live data (confirmed across three cohorts), and removing it improves the OOS Sharpe (deterministic, reproduced twice with identical output). Moderate confidence in the second decimal of each metric (sensitive to the exact OOS cutoff date as more rows mature, to tie-breaks, and to the prior-insider-alpha accounting). Every shipped number is reproduced by the committed script; nothing is hand-fitted. Where a claim could not be reproduced (the phantom n=173 cohort, the 1.87 Sharpe), it was replaced with the real reproducible figure rather than invented. A removed/restated claim was preferred over a wrong one throughout.
7. Next steps
- Re-run the bake on a second disjoint OOS window (walk-forward, >= 2 regimes) before treating EU_strict as settled.
- Wire the weekly cron to regenerate
_proofYears/winRate/avgReturnfrom the committed script so they never drift again (they are currently still constants, now correct, but hand-refreshable). - Re-derive the honest DSR with the full trial count (583,200 filter combos + grids + bake-offs), not N=18 -- it will go clearly negative; display it anyway.
- Ablate the remaining low-weight V3/composite features (fundamentals, Yahoo composite sub-bonuses, CMP pattern) on EU_strict OOS; keep only Sharpe-positive ones.