33 · Portfolio Backtest — Per Market + Combined
Generated: 2026-05-17T16:30:30.679Z
Methodology
Time-series portfolio with monthly cohorts and 90-day equal-weight holds.
- For each calendar month, take every BUY declaration with
signalScore ≥ THRESHOLD(primary = 40). - Each cohort earns
mean(returnFromPub90d)over its 90-day window. - 4 non-overlapping cohorts per year ⇒ annualized Sharpe =
(μ_excess / σ) · √4with rf = 4 % / yr. - MDD computed on compounded NAV through the cohort sequence.
- Calmar = CAGR / |MDD|. Cohort win rate = % of cohorts beating quarterly rf.
- Bootstrap Sharpe CI95: 2000 resamples, seed 42.
- Bailey-López de Prado DSR applied on the headline portfolio (combined ≥40) with N_trials = 6 (3 thresholds × 2 markets including combined).
Eligible markets (n priced ≥ 1000)
Of the 8 ISIN-country groups present in priced declarations, only the following pass the gate:
- FR (n = 14106)
Ineligible (kept for the combined portfolio only):
- QS: n=691
- CH: n=51
- GB: n=116
- IT: n=72
- US: n=67
- ES: n=67
- GR: n=1
Per-market portfolio @ threshold ≥40
| Market | n priced | n trades (≥40) | Cohorts | SR ann | CI95 | MDD % | Calmar | Trade win % | CAGR % |
|---|---|---|---|---|---|---|---|---|---|
| FR | 14106 | 2525 | 50 | 0.333 | [-0.188, 0.896] | -35.16 | 0.27 | 55.5 | 9.51 |
Combined-universe portfolio (sensitivity)
| Threshold | n trades | Cohorts | SR ann | CI95 | MDD % | Calmar | Trade win % | CAGR % |
|---|---|---|---|---|---|---|---|---|
| ≥30 | 6550 | 50 | 0.047 | [-0.552, 0.562] | -44.85 | 0.07 | 48.2 | 3.35 |
| ≥40 | 2612 | 50 | 0.26 | [-0.274, 0.82] | -35.45 | 0.22 | 55.3 | 7.72 |
| ≥50 | 629 | 42 | 0.691 | [0.156, 1.269] | -46.35 | 0.56 | 68.2 | 26.12 |
Per-currency attribution at primary threshold
| Currency | n | Share % | Mean 90d % |
|---|---|---|---|
| EUR | 2602 | 99.6 | 4.9 |
| USD | 9 | 0.3 | -12.56 |
| GBP | 1 | 0 | -3.26 |
Walk-forward (train 2022-2024 → test 2025-2026)
| Market | Train SR | Train n | Test SR | Test n | Δ Sharpe |
|---|---|---|---|---|---|
| FR | 0.311 | 1664 | 0.367 | 585 | 0.06 |
| COMBINED | 0.207 | 1718 | 0.331 | 590 | 0.12 |
Deflated Sharpe (combined ≥40)
- DSR probability: 0 (probability that the true Sharpe is positive after correcting for 6 trials)
- SR floor under null: 1.3
- Cohort sample skewness: 0.34, kurtosis: 2.73
Verdict
- FR: SR ann 0.333 (CI95 [-0.188, 0.896]), MDD -35.16 %, Calmar 0.27, OOS SR 0.367 → preview only.
- COMBINED: SR ann 0.26, MDD -35.45 %, Calmar 0.22, OOS SR 0.331 → preview only.
Caveats
- SEC Form 4 (n=126k) ingested but has no BacktestResult linkage — no price/return tracking. Per-market portfolio for SEC requires the price ingestion job to run first.
- 15 multi-market staging tables (BaFin, RNS, FSMA, etc.) total ~10k filings but also have no price tracking — same blocker.
- Cohorts ≥3 picks/month; thresholds below 30 lower the bar so much that the strategy collapses to the universe mean. Above 50 leaves only ~75 picks total, too sparse to form monthly cohorts.
- The combined-universe Sharpe shares almost all its support with FR (≈93 % of priced rows). It is not a true multi-market diversifier today.
Reproducibility
node --env-file=.env.local scripts/portfolio-backtest-per-market.mjs
Raw output: /tmp/portfolio-backtest-per-market.json