43 · Scoring rerun on enriched dataset (2026-05-17)
Walk-forward backtest on 162 k Declarations · 23,788 BUY rows with r90. Train window 2015-2024 (rolling 24-month priors, rebuilt quarterly). Test window 2025-01-01 to 2026-05-17.
Methodology
- Universe: every Declaration with a populated
BacktestResult.returnFromPub90dand a parseable BUY direction. - Scoring:
- v5.1 (production) — composite score (sig / wr / ret / rec), market-aware weights from MARKET_WEIGHTS table.
- v6 (candidate) — v5.1 + role-quality multiplier (CEO/CFO +5 pct), cluster premium (+10 pct), pub-delay freshness penalty (>14 days x 0.85).
- Portfolio: weekly top-10, equal-weight, hold 90 days. Monthly portfolio returns = arithmetic mean of picks within month.
- Stats: Sharpe / Sortino annualised from monthly returns (x sqrt 12). Calmar = annualised return / |maxDD|. Max DD on the monthly NAV. Hit rate = pct of picks with r90 > 0. Turnover = avg fraction of top-N replaced week-on-week.
- DSR (Bailey-Lopez de Prado): SR_def = SR - sqrt(2 ln(N)/T) with N = 9,420 effective trials (anchored on v5.1 grid 314 weights x alpha-r3 30 features) and T = monthly obs.
- Bootstrap CI95: 1000 resamples on monthly returns, seed 42, annualised by x sqrt 12.
v5.1 (production) walk-forward
| Market | Picks | Sharpe_ann | Sortino | Calmar | maxDD % | HitRate % | Turnover % | DSR | CI95 |
|---|---|---|---|---|---|---|---|---|---|
| FR | 595 | 1.685 | 3.928 | 9.649 | -19.9 | 52.4 | 99.8 | 0.648 | [0.385, 3.076] |
| US | 133 | 1.367 | 1.761 | 4.673 | -18.1 | 54.1 | 98.5 | 0.014 | [-0.831, 4.160] |
| NL | 484 | 1.840 | 3.594 | 7.371 | -6.4 | 58.1 | 100.0 | 0.736 | [0.305, 3.523] |
| BE | 225 | 0.836 | 0.967 | 1.233 | -35.0 | 60.0 | 92.6 | -0.233 | [-0.714, 2.820] |
| COMBINED | 662 | 1.319 | 2.015 | 4.090 | -17.9 | 52.0 | 99.6 | 0.311 | [-0.076, 2.785] |
v6 (candidate) walk-forward
| Market | Picks | Sharpe_ann | Sortino | Calmar | maxDD % | HitRate % | Turnover % | DSR | CI95 |
|---|---|---|---|---|---|---|---|---|---|
| FR | 595 | 1.246 | 2.473 | 5.469 | -25.0 | 49.6 | 99.6 | 0.209 | [-0.319, 2.588] |
| US | 133 | 1.334 | 1.705 | 4.490 | -18.1 | 54.1 | 98.5 | -0.019 | [-0.932, 4.098] |
| NL | 484 | 1.840 | 3.594 | 7.371 | -6.4 | 58.1 | 100.0 | 0.736 | [0.305, 3.523] |
| BE | 225 | 0.836 | 0.967 | 1.233 | -35.0 | 60.0 | 92.6 | -0.233 | [-0.714, 2.820] |
| COMBINED | 662 | 0.981 | 1.567 | 2.370 | -27.4 | 47.3 | 99.8 | -0.028 | [-0.634, 2.480] |
A/B summary v5.1 vs v6
| Market | dSharpe | dSortino | dCalmar | dMaxDD pp | dHitRate pp | dDSR |
|---|---|---|---|---|---|---|
| FR | -0.439 | -1.455 | -4.180 | -5.08 | -2.86 | -0.439 |
| US | -0.033 | -0.056 | -0.183 | 0.00 | 0.00 | -0.033 |
| NL | 0.000 | 0.000 | 0.000 | 0.00 | 0.00 | 0.000 |
| BE | 0.000 | 0.000 | 0.000 | 0.00 | 0.00 | 0.000 |
| COMBINED | -0.338 | -0.448 | -1.720 | -9.46 | -4.68 | -0.339 |
MARKET_WEIGHTS — refresh proposal
The pooled FR+SEC winner (30 / 35 / 25 / 10) was calibrated when AFM=4 330 / SEC=2 391. SEC is now 126 607 declarations and AFM is 6 392. AMF (FR) BUY at T+90 was mean -0.87 pct (negative). We re-grid-searched a small per-market neighbourhood (sig in {25,30,35,40}, wr in {30,35,40}, ret in {15,20,25}, rec in {5,10,15}) and kept the v5.1 baseline as the floor.
Deltas (only markets where the local optimum beats current by Sharpe_ann > 0.05 AND DSR remains best-in-class):
| Market | Current | Proposed | dSharpe_ann | Notes |
|---|---|---|---|---|
| FR | 30/35/25/10 | (kept) 30/35/25/10 | 0.000 | neighbour search did not clear honesty threshold (dSharpe > 0.05) |
| US | 30/35/25/10 | (kept) 30/35/25/10 | 0.000 | neighbour search did not clear honesty threshold (dSharpe > 0.05) |
| NL | 30/35/25/10 | (kept) 30/35/25/10 | 0.000 | neighbour search did not clear honesty threshold (dSharpe > 0.05) |
| BE | 30/35/25/10 | (kept) 30/35/25/10 | 0.000 | neighbour search did not clear honesty threshold (dSharpe > 0.05) |
Decision: keep MARKET_WEIGHTS unchanged. The dataset growth confirms the v5.1 plateau result from doc 11; per-market neighbour deltas remain inside noise after DSR.
Recommendation: v5.1 vs v6
v6 must beat v5.1 on DSR-deflated Sharpe AND on at least 3 of {Sortino, Calmar, hit rate, max DD} on the COMBINED portfolio.
COMBINED:
- v5.1: Sharpe_ann = 1.319 · DSR = 0.311 · Sortino = 2.015 · Calmar = 4.090 · HitRate = 52.0 pct · MaxDD = -17.9 pct
- v6: Sharpe_ann = 0.981 · DSR = -0.028 · Sortino = 1.567 · Calmar = 2.370 · HitRate = 47.3 pct · MaxDD = -27.4 pct
Recommendation: keep v5.1. DSR delta = -0.339. Secondary wins = 0/4 (need >= 3 AND positive DSR delta). v6 archived behind USE_SCORING_V6 flag (default off).
Reproducibility
node --env-file=.env.local --import tsx scripts/quant-2026-05-rerun.ts
Seed = 42. Bootstrap iter = 1000. Generated 2026-05-17T18:32:39.165Z.