37 · Per-Country Backtest — Final (15-markets target)
Generated: 2026-05-17T17:37:49.297Z
Methodology
Monthly-cohort, equal-weight T+90 portfolio per ISIN-country market. Same engine as audit 33 with n_priced gate lowered from 1000 to 100 so that all markets with usable price coverage are included.
- Filter :
direction = BUY,signalScore ≥ 40. - Cohort : every BUY published in calendar month K (≥ 3 picks). Cohort return = mean of
returnFromPub90d(FX-invariant, % units). - Sharpe ann :
(μ_excess / σ) · √4, rf = 4% / yr. - CI95 : 2000-iter bootstrap, seed 42.
- Walk-forward : train [2022-01-01, 2025-01-01), test [2025-01-01, 2026-06-01).
- DSR : Bailey–López de Prado with N_trials = 2 (markets tested + combined).
Unified data audit (step 1)
| Check | Value | Pass |
|---|---|---|
| Currency EUR share | 95.44 % of 162,615 declarations | YES |
| Score coverage | 99.51 % (161,819 / 162,615) | YES |
Non-EUR currency breakdown (mostly SEC Form 4 USD):
- USD: 6,492
- GBP: 258
- CHF: 226
- DKK: 182
- SEK: 114
- null: 68
- CAD: 68
Market eligibility
| Market | n priced BUY (any score) | Eligible? |
|---|---|---|
| FR | 14106 | YES |
| QS | 691 | YES |
| GB | 116 | YES |
| IT | 72 | no |
| US | 67 | no |
| ES | 67 | no |
| CH | 51 | no |
| GR | 1 | no |
Eligible markets (≥ 100 priced BUY rows) : FR, QS, GB
Ineligible : IT (72), US (67), ES (67), CH (51), GR (1).
Per-market portfolio (threshold ≥ 40)
| Market | n priced | n trades (≥40) | Cohorts | SR ann | CI95 | MDD % | Calmar | Trade WR % | CAGR % | OOS SR | DSR-adj SR | Verdict |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| FR | 14106 | 2525 | 50 | 0.333 | [-0.19, 0.90] | -35.2 | 0.27 | 55.5 | 9.5 | 0.367 | -0.19 | PREVIEW |
| QS | 691 | 35 | — | — | — | — | — | — | — | — | — | NO-DATA |
| GB | 116 | 11 | — | — | — | — | — | — | — | — | — | NO-DATA |
Verdict legend :
- PROD-READY = SR>0.5 ∧ Calmar>0.5 ∧ |OOS−train ΔSR|<0.5 ∧ OOS>0 ∧ SR ≥ 0.7·SR_floor(DSR).
- PREVIEW = positive SR or positive OOS but does not clear PROD bar.
- PREVIEW-NEGATIVE = negative SR.
- NO-DATA = insufficient priced BUY rows or fewer than 6 valid monthly cohorts.
Combined universe portfolio
| Metric | Value |
|---|---|
| n trades (≥40) | 2612 |
| Cohorts | 50 |
| SR ann | 0.26 |
| CI95 | [-0.274, 0.82] |
| MDD % | -35.45 |
| Calmar | 0.22 |
| CAGR % | 7.72 |
| Trade WR % | 55.3 |
| Cohort WR % | 48 |
| OOS SR (walk-forward test) | 0.331 |
| Train SR | 0.207 |
| DSR probability | 0.0304 |
| DSR SR floor | 0.52 |
| Verdict | PREVIEW |
Cross-sectional per market (trade-level, all scores)
| Market | n | Mean T+90 % | Win rate % | Cross-sectional SR | t-stat |
|---|---|---|---|---|---|
| FR | 14106 | -0.74 | 43.9 | -0.026 | -3.09 |
| QS | 691 | 2.13 | 58.9 | 0.191 | 5.03 |
| GB | 116 | -19.3 | 6.9 | -0.888 | -9.56 |
| IT | 72 | 1.9 | 47.2 | 0.079 | 0.67 |
| US | 67 | -6.59 | 37.3 | -0.313 | -2.56 |
| ES | 67 | 7.07 | 47.8 | 0.292 | 2.39 |
| CH | 51 | 0.51 | 43.1 | 0.069 | 0.49 |
| GR | 1 | -3.16 | 0 | 0 | 0 |
Per-market attribution within combined
| Market | n trades (≥40) | Share % | Mean T+90 % |
|---|---|---|---|
| FR | 2525 | 96.67 | 5.09 |
| QS | 35 | 1.34 | 2.04 |
| IT | 28 | 1.07 | 6.5 |
| GB | 11 | 0.42 | -33.71 |
| US | 7 | 0.27 | -11.09 |
| CH | 6 | 0.23 | -2.82 |
Cross-market alpha analysis
Composite alpha score = 0.5·(SR_ann − SR_floor_DSR) + 0.3·OOS_SR + 0.2·(mean_T+90 / 10).
| Rank | Market | SR ann | DSR-adj SR | OOS SR | Share % | Mean T+90 % | Alpha score |
|---|---|---|---|---|---|---|---|
| 1 | FR | 0.333 | -0.19 | 0.367 | 96.7 | 5.09 | 0.118 |
Top 3 alpha contributors : FR (score 0.118)
Bottom 3 noise markets : FR (score 0.118)
Caveats
- The combined universe is dominated by FR (96.7 % of trades at threshold ≥40). Combined-universe Sharpe is therefore not a true cross-market diversification statistic.
- Markets ingested via the multi-market staging tables (BaFin, FSMA, RNS, AFM, DART, SGX, HKEX, etc.) but not yet wired to BacktestResult are reported in the "NO-DATA" verdict tier. Adding price coverage to these tables is the unblocker for the JP/KR/HK/SG/IN/BR expansion.
- DSR with N_trials = 2 produces an SR floor ≈ 0.52; only markets whose raw SR clears that floor produce a strictly positive DSR. We report a softer ≥ 0.7·floor pass as the "DSR-adj" indicator.
- Sample skewness/kurtosis on cohort returns is non-Gaussian (kurtosis > 3 in most thin markets) — bootstrap CI95 is preferred over t-based CI.
Reproducibility
node --env-file=.env.local scripts/backtest-all-markets.mjs
Raw JSON : /tmp/backtest-all-markets.json.