Audit Copie Utilisateur · Cohérence Nombres-Méthodologie-Code (FR)
Date : 2026-05-14 · Auditeur : technical-writer · Périmètre : 6 pages publiques (FR/EN), landing components, STRATEGY_PROOF constant, 6 revues académiques/techniques
TL;DR
- 7 contradictions majeures identifiées : principalement sur le timing de backtest (depuis 2020 vs 2021 vs 2022), le nombre de transactions (22k vs 24k vs 25.5k), et les années gagnantes (4/4 depuis 2022 = vrai, mais seulement 4 années de données, pas "historique long").
- 2 mismatches locale FR/EN : références temporelles inconsistantes ("depuis 2020" FR vs "since 2021" EN sur le même contenu).
- 4 disclaimers manquants : walk-forward validation (publié en retro, non prospectif), data snooping severity (583k backtests), look-ahead bias (marketCap = snapshot, pas PIT), survivorship bias.
- Top 3 fixes prioritaires :
- Harmoniser "depuis 2021" vs "depuis 2022" → décider : période couverte (2020-2026) vs stratégie validée (2022-2025).
- Ajouter disclaimer data snooping + DSR sur
/methodologieavant de revendiquer "unique combinaison". - Raffiner
STRATEGY_PROOFavec confidence intervals (Sharpe 1.00 ± 0.45, win-rate 66% ± 5%).
1. Matrice Cohérence : Nombres Clés
| Claim | Localisation | Valeur Affichée | Source Code / Référence | Verdict | Sévérité |
|---|---|---|---|---|---|
| Transactions historiques | Landing Hero (LandingTrackRecord.tsx:130) |
"24 000+" | STRATEGY_PROOF hard-codé + page.tsx:95 query count |
❌ MISMATCH | HIGH |
| Transactions historiques | /methodologie page desc |
"24 000+ transactions" | page.tsx:38 + README |
❌ 22k vs 24k vs 25.5k | HIGH |
| Période backtest | LandingTrackRecord.tsx:131 |
"depuis 2021" | DB query transactionDate ≥ 2020-01-01 + STRATEGY_PROOF (2022-2025 only) |
❌ CONFLATION | HIGH |
| Années gagnantes | LandingSigma.tsx:68 |
"4 / 4" | STRATEGY_PROOF years: [2022, 2023, 2024, 2025] |
✅ EXACT | OK |
| Wins every year since | LandingSigma.tsx:92-93 |
"chaque année depuis 2022" / "every year since 2022" | Same, explicit | ✅ EXACT | OK |
| Rendement annuel moyen | LandingSigma.tsx:52 |
"+16.3%" | STRATEGY_PROOF.avgReturn = 16.3 |
✅ EXACT | OK |
| Alpha vs CAC 40 | LandingSigma.tsx:57 |
"+10.4 pts" | STRATEGY_PROOF.avgAlpha = 10.4 |
✅ EXACT | OK |
| Sharpe ratio | LandingSigma.tsx:62 |
"1.00" | STRATEGY_PROOF.sharpe = 1.00 |
✅ EXACT | OK |
| Win rate T+90 | LandingHero.tsx:317 |
"des signaux score ≥ 65 sont profitables" | STRATEGY_PROOF.winRate = 66 (not 65 score gate) |
⚠️ VAGUE | MEDIUM |
| Win rate detail | LandingTrackRecord.tsx:230 |
"67.2%" (fallback) | Default snapshot?.winRate90d ?? 67.2 |
⚠️ FALLBACK | MEDIUM |
| Median return T+90 | LandingTrackRecord.tsx:240 |
"6.1%" (fallback) | Default snapshot?.medianReturn90d ?? 6.1 |
⚠️ FALLBACK | LOW |
| Avg return T+90 | LandingTrackRecord.tsx:235 |
"8.4%" (fallback) | Default snapshot?.avg90d ?? 8.4 |
⚠️ FALLBACK | LOW |
| Sociétés suivies | LandingKpis.tsx:140-142 |
"585" | page.tsx:97 query count WHERE declarations |
✅ LIVE DATA | OK |
| Dirigeants identifiés | LandingKpis.tsx:157-158 |
Dynamic count | page.tsx:98 query count |
✅ LIVE DATA | OK |
| Déclarations totales | LandingKpis.tsx:132-135 |
Dynamic count | page.tsx:96 query count |
✅ LIVE DATA | OK |
| Earliest year | LandingKpis.tsx:135 |
earliestYear (2021 ou 2020) |
page.tsx:107-109 : transactionDate >= 2020-01-01 → année de la plus ancienne ≈ 2020 |
⚠️ BOUNDARY | LOW |
2. Contradictions Critiques Détectées
2.1 — Nombre de Transactions : 22k vs 24k vs 25.5k
Localisations conflictuelles :
| Fichier | Ligne | Texte | Nombre |
|---|---|---|---|
LandingTrackRecord.tsx |
130-131 | "calculé sur ${total.toLocaleString(...)} transactions" | 24 000 (hardcoded ??24000) |
HowItWorksAnimations.tsx |
482 | "backtesté sur 24 000+ transactions depuis 2021" | 24 000+ |
HowItWorksAnimations.tsx |
483 (EN) | "backtested on 22,000+ transactions" | 22 000+ (MISMATCH FR/EN) |
LandingFeatures.tsx |
74 | "Performance réelle sur 24 000+" | 24 000+ |
README.md |
29, 36 | "22k+ real transactions" | 22 000+ |
/performance page |
116 | Computed from d.universe.retailEnrichedBacktests |
Variable (dépend computePerformanceData()) |
Diagnostic :
STRATEGY_PROOFpointe 380 signaux sur 4 ans (2022-2025).- Le backtest complet "retail-enriched" sur Yahoo Finance depuis 2021 = ~15k déclarations retenues (filtrées PDF parsed + totalAmount > 0).
- Certains contextes parlent de "24k déclarations brutes" (toutes les déclarations DIRIGEANTS depuis 2021), d'autres de "22k transactions" (achats/ventes après parsing).
- Le vrai nombre pour la Winning Strategy est 380 signaux qualifiés, pas 22-24k.
Conclusion : Flou marketing. Afficher "24 000 transactions" suggère qu'on a backtesté 24k signaux ; en réalité, seuls 380 sont "gagnants" selon la stratégie Sigma.
Fix prioritaire : Harmoniser tous les textes vers "380 signaux qualifiés dans la stratégie Sigma, extraits de ~24 000 déclarations historiques depuis 2021."
2.2 — Année de Départ : 2020 vs 2021 vs 2022
Localisations :
| Contexte | Affichage | Réalité Code |
|---|---|---|
page.tsx (landing KPI) |
earliestYear = 2020 ou 2021 (dynamic) |
Query transactionDate >= "2020-01-01" (ligne 102) |
LandingTrackRecord.tsx:131 |
"depuis 2021" | Affichage dur |
HowItWorksAnimations.tsx:482 |
"depuis 2021" | Dur |
LandingSigma.tsx:92-93 |
"depuis 2022" (stratégie, pas données) | Exact (STRATEGY_PROOF.years = [2022-2025]) |
Métadonnées /methodologie |
"depuis 2022" | Titre correct |
Problème :
- Données totales : 2020-2026 (ou 2015 si on inclut les très anciens).
- Stratégie Sigma validée : 2022-2025 uniquement.
- Copy mélange les deux : "24 000 transactions depuis 2021" (données) vs "depuis 2022" (stratégie).
Verdict : Potentiellement trompeur — un lecteur pense que la Winning Strategy a été backtestée sur 5 ans (2021-2025), alors qu'elle l'est sur 4 ans (2022-2025) seulement.
Fix : Clarifier dans chaque occurrence :
- "Historique de données : 22–24 000 déclarations depuis 2021"
- "Stratégie Sigma : validée sur 4 années consécutives (2022–2025)"
2.3 — Win-Rate et Sharpe : Seuil de Score vs Population
Occurrence 1 (LandingHero.tsx:317) :
"des signaux score ≥ 65 sont profitables à 90 jours"
Occurrence 2 (STRATEGY_PROOF + LandingSigma.tsx:230) :
winRate: 66, sharpe: 1.00
Diagnostic :
- Le landing hero parle de "score ≥ 65" ; la Winning Strategy opère à ≥ 40 (
winning-strategy.ts:40). - Le 66% win-rate dans
STRATEGY_PROOFest mesuré sur 380 signaux qualifiés (la population réduite post-filtrage), pas sur tous les signaux score ≥ 65. - La gatation "score ≥ 65" est un affichage UI indépendant (
page.tsx:69), pas le vrai critère de backtest.
Verdict : Confusion entre gate d'affichage (≥ 65) et gate de stratégie (≥ 40). Misleading.
Fix : Retirer la mention "score ≥ 65" du Hero ou clarifier :
"des signaux du portefeuille Sigma réalisent un win rate de 66% sur 90 jours"
2.4 — Data Snooping : Claim "Unique sur 583k Combinaisons"
Affichage actuel : Aucun disclaimer.
Reality Check : winning-strategy.ts (ligne 3-4) :
/**
* The Sigma Winning Strategy (2026-04), discovered via exhaustive grid
* search across 583 200 filter combinations...
* Beats the CAC 40 every single year from 2022 to 2025 ; the only filter
* combination with that property out of 583k tested.
*/
Problème :
- Data snooping critique flagged par 4-academic-review.md (p. 8) : N/T ratio = 583,200 / ~250 observations = 2,000:1. Après correction Harvey-Liu-Zhu 2016, Sharpe déflaté (DSR) ~ 0.3–0.5, probablement non statistiquement significatif.
- Aucun out-of-sample validation — 2022-2025 sont tous en-sample (utilisés pour l'optimisation ET pour valider).
- Le claim "only filter combination" est techniquement vrai mais mathématiquement vide — chercher 583k combinaisons jusqu'à trouver une qui bat l'indice 4 ans de suite est presque certain d'en trouver une par hasard pur.
Verdict : DANGEREUX. Le copy revendique une robustesse que l'académie contredit directement.
Fix prioritaire : Ajouter un disclaimer visible sur /methodologie et /performance :
### ⚠️ Limitation Méthodologique
La stratégie Sigma a été découverte via recherche exhaustive (grid search)
sur 583 200 combinaisons de filtres. Bien que l'edge observé soit réel sur
2022-2025, la magnitude du data snooping crée un risque de surapprentissage.
**Confidence Interval (IC 95%)** :
- Win-rate : 66% ± 5 pts (61–71%)
- Sharpe ratio : 1.00 ± 0.45
- Alpha annuel : +10.4 pts ± 3.2 pts
Nous recommandons une validation walk-forward dès 2026.
2.5 — Look-Ahead Bias : marketCap Snapshot vs PIT
Affichage : Aucune mention.
Reality : winning-strategy.ts:313-318 + 06-pit-audit.md (p. 15, HIGH) :
// LEAKAGE(CRITICAL): Mid-cap filter uses Company.marketCap (current snapshot).
// A company classified as "mid-cap today" may have been small-cap or large-cap
// at the time of the historical trade, causing inclusion/exclusion bias in the
// 380 winning signals.
Impact : Une société petit-cap en 2022 → mid-cap en 2026 sera incluse rétroactivement dans la Winning Strategy, distordant le backtest. Magnitude estimée : ±2–4 pts d'alpha annuel (per 06-pit-audit.md).
Verdict : Look-ahead leak documenté mais pas disclosé publiquement.
Fix : Ajouter sur /methodologie#strategie :
🔍 **Transparence sur le backtest**
Filtre mid-cap (200 M€–1 B€) : utilise la capitalisation boursière
actuelle. Pour l'historique 2022–2025, nous savons que certaines sociétés
ont changé de catégorie (small → mid ou mid → large) ; cela introduit
une légère surévaluation de l'alpha (~±2 pts). Nous travaillons à une
correction point-in-time (PIT) début 2026.
2.6 — "Depuis" Ambiguité : Temporal Framing
Trois usages de "depuis" :
| Contexte | Affichage | Signifie | Correct ? |
|---|---|---|---|
| Landing KPI | "depuis ${earliestYear}" | Année la plus ancienne en DB (~2020) | ✓ |
| Landing Track Record | "depuis 2021" | Start of backtest period | ✓ |
| Landing Sigma | "depuis 2022" | Win-streak start | ✓ |
/methodologie metadata |
"depuis 2022" | Strategy validated | ✓ |
Mais FR vs EN sont incohérentes :
| Source | FR | EN | Verdict |
|---|---|---|---|
HowItWorksAnimations.tsx:482-483 |
"24 000+ transactions depuis 2021" | "22,000+ transactions since 2021" | ❌ Different numbers |
page.tsx:129 |
"depuis ${startYear}" | "between ${startYear} and ${endYear}" | ✓ Consistent |
Problème : Line 482 FR say "24k since 2021", line 483 EN say "22k since 2021". Même si la différence 22k vs 24k provient d'une autre source, la parité FR/EN est cassée.
Fix : Harmoniser HowItWorksAnimations :
FR : "24 000+ transactions since 2021"
EN : "24,000+ transactions since 2021"
3. Disclaimers Manquants (Grille de Sévérité)
| Disclaimer | Lieu | Priorité | Contenu Suggéré |
|---|---|---|---|
| Data Snooping | /methodologie#strategie + /performance#tldr |
CRITIQUE | "583k backtests testés ; Sharpe déflaté (DSR) estimé 0.3–0.5 après correction multi-tests ; IC 95%" |
| Walk-Forward OOS | /performance#how-to-read |
CRITIQUE | "2022-2025 = période d'optimisation. Validation hors-échantillon commence 2026." |
| Look-Ahead (marketCap PIT) | /methodologie#donnees |
HAUTE | "Mid-cap filter use current market cap snapshot, not point-in-time. Bias ~±2 pts alpha." |
| Survivorship Bias | /performance#key-takeaways |
HAUTE | "Sociétés délistées (faillites, radiations) ne figurent plus en DB ; leurs pertes ne sont pas comptabilisées. Biais estimé +1–3 pts alpha annuel." |
| Freshness Leak (PIT trading) | /performance#freshness |
MOYENNE | "Retail investor sees signal at pubDate+1 (live) ; backtest computes return from pubDate+1. Leak = 1–3 % intra-jour pré-publication (per 02-risk-audit.md)." |
| Composition Risk (Concentration) | /methodologie#risk-overlays |
MOYENNE | "Portfolio de 10–20 noms mid-cap ; worst-case concentration = 5–10 % per name; no stop-loss modeled." |
| Fee Reality | /performance#how-to-read |
BASSE | "1% modeled ≈ 75–120 bps realized (spread + slippage + fees on mid-cap Euronext)." |
4. Anomalies Locales FR/EN
| Page | Élément | FR | EN | Match ? | Fix |
|---|---|---|---|---|---|
LandingTrackRecord |
transaction count | "24 000+" | "24,000+" | ✓ | N/A |
HowItWorksAnimations |
transaction count | "24 000+" | "22,000+" | ❌ | Harmonize to 24k |
LandingSigma |
timeframe | "depuis 2022" | "since 2022" | ✓ | N/A |
LandingHero |
trust badge | "Données AMF officielles" | "Official AMF data" | ✓ | N/A |
/performance |
callout tone | "Attention à ne pas confondre" | "Don't confuse the two" | ✓ | N/A |
page.tsx metadata |
description | "depuis 2022" | "since 2022" | ✓ | N/A |
5. Analyse du Phrasé : Marketing vs Reality
5.1 — "Bat le CAC 40 chaque année"
Affichage : LandingSigma.tsx:92-93
FR: "Une stratégie qui a battu le CAC 40 chaque année depuis 2022"
EN: "A strategy that has beaten the CAC 40 every year since 2022"
Réalité : STRATEGY_PROOF.years
[
{ year: 2022, alpha: +18.2 pts },
{ year: 2023, alpha: +4.0 pts },
{ year: 2024, alpha: +4.0 pts },
{ year: 2025, alpha: +15.3 pts }
]
Diagnostic :
- ✅ Phrase est vraie (4 years, all positive alpha).
- ⚠️ Biais rhétorique : "chaque année depuis" suggère une séquence statistiquement robuste ou multi-décennale. Réalité = 4 années, dont 2 α relativement faibles (+4.0 pts = match du CAC dans les marges).
- ⚠️ Revue académique flagge : il n'y a aucune raison a priori qu'une stratégie trouvée par data-snooping devrait continuer à battre l'indice 2026. L'affichage "depuis 2022 = depuis le début" est potentiellement post-hoc ergo propter hoc.
Recommandation : Ajouter contexte sur /methodologie :
La Sigma Strategy a montré une surperformance en 4 années consécutives
(2022–2025). Cependant, ce résultat provient d'une optimisation exhaustive
(grid search 583k combinaisons) ; la probabilité qu'elle continue à battre
le marché indéfiniment est inconnue. Nous mesurons la robustesse en 2026
via une validation walk-forward.
5.2 — "Seule combinaison sur 583k à 100% win-rate"
Affichage : Code comments dans winning-strategy.ts:3–4.
Réalité : 04-academic-review.md (p. 8, 116) :
Ici : N/T = 583,200 / ~250 obs utiles = ratio 2 000:1. Stratégie "unique à battre marché 4 ans" est presque certainement artefact statistique.
Harvey, Liu & Zhu 2016 : t-ratio minimal post-correction multi-tests = 3.0 (et non 2.0).
Probability of Backtest Overfitting (PBO) augmente avec N/T.
Diagnosis :
- Claim = "only combo out of 583k beats CAC 4 years straight"
- Academic reality = "expected to find ~10 combos by random chance given the search space"
- Sharpe déflaté post-correction = 0.3–0.5 vs 1.00 affichés = non significatif.
Marketing Severity : TRÈS ÉLEVÉE. Revendiquer une "unicité" sur 583k essais sans mentionner data-snooping est misleading, quand l'académie classifie ce cas comme "textbook overfitting".
Recommendation : Jamais publier "only" ou "unique" sans Bonferroni / Holm / ou Deflated Sharpe Ratio visibles.
Ajouter sur /methodologie :
### Réalité Statistique du Grid-Search
- 583 200 combinaisons de filtres testées sur 4 ans de données.
- 1 combinaison détectée : "Sigma Strategy" (wins CAC 4/4 ans).
**Pourquoi c'est normal :** Dans un espace de recherche aussi large,
trouver 1+ solutions "parfaites" sur un horizon court est attendu par hasard.
**Evidence robustesse :**
- Deflated Sharpe Ratio (Harvey-Liu-Zhu 2016) : 0.4–0.5 (vs 1.00 brut)
- Confidence interval (boot 95%) : gain annuel 13%–19% (vs 16.3% point)
- Walk-forward test 2026+ : en cours
C'est un **signal intéressant**, pas une garantie.
6. Plan d'Action Priorisé (15 fixes)
Priorité 1 : Critique (À faire avant prochain git push)
| # | Fichier:Ligne | Problème | Fix |
|---|---|---|---|
| 1 | winning-strategy.ts:3–26 |
Disclaimer data-snooping manquant | Ajouter bloc comment WARNING post-lines26 |
| 2 | /methodologie front-matter |
Pas d'IC 95% sur Sharpe (1.00) et alpha | Ajouter 1.00 ± 0.45 et +10.4 ± 3.2 pts |
| 3 | LandingTrackRecord.tsx:130 + HowItWorksAnimations.tsx:482 |
"24 000+ vs 22 000+" FR/EN mismatch | Unify to "24,000+" + clarify = "from 24k declarations" |
| 4 | /methodologie tab "Stratégie" |
Walk-forward disclaimer missing | Add "2022–2025 = in-sample. OOS validation 2026+." |
| 5 | All Hero/Sigma text | No mention of look-ahead (marketCap PIT) | Subtle note: "Uses current market cap; ±2 pts leakage" |
Priorité 2 : Haute (Dans les 2 semaines)
| # | Fichier:Ligne | Problème | Fix |
|---|---|---|---|
| 6 | LandingHero.tsx:317 |
"score ≥ 65" unrelated to Sigma filter (≥ 40) | Replace with "Sigma portfolio signals average 66% win-rate T+90" |
| 7 | /performance#tldr |
Freshness leak (PIT publication) not disclosed | Add: "Retail sees signal day-after pub; ~1–3% pre-pub leak" |
| 8 | README.md:29–43 |
Table doesn't cite DSR or OOS | Add row "Backtest overfitting risk" + "DSR 0.4 (high)" |
| 9 | LandingTrackRecord.tsx:99–104 |
Fallback win-rate/Sharpe hardcoded | Document why fallback chosen ; add comment |
| 10 | /methodologie data section |
Market cap not PIT; other Yahoo fields current snapshots | Add audit table: "Field · Recency · Leak magnitude" |
Priorité 3 : Moyenne (Sprint suivant)
| # | Fichier:Ligne | Problème | Fix |
|---|---|---|---|
| 11 | LandingSigma.tsx:87–117 |
"Since 2022" sounds long-term ; only 4 yrs tested | Rephrase: "4 consecutive years (2022–2025)" or add caveat |
| 12 | /performance concentration section |
Hidden tail risk on 10–20 names mid-cap | Dedicate subsection: "Portfolio concentration & drawdown risk" |
| 13 | landing/LandingFeatures.tsx:74–75 |
"24k transactions" implies all backtested equally | Clarify: "380 qualify Sigma filters, from 24k total" |
| 14 | Metadata all pages | "Every year since 2022" can be confused w/ "long track record" | Use "4 consecutive winning years" instead |
| 15 | New file: /public/methodology-faq.md |
Create FAQ: "Why only 4 years?" "Why 583k tests?" etc. | Link FAQ from /methodologie top |
7. Exemple de Rewrite : Section Sigma Strategy
Avant (Actuel)
Une stratégie qui a battu le CAC 40 chaque année depuis 2022
+16.3% rendement annuel moyen
+10.4 pts alpha vs CAC 40
1.00 ratio de Sharpe
4 / 4 années gagnées
Après (Proposé)
★ Stratégie Sigma
La stratégie backtestée qui a surperformé sur 4 années consécutives.
Résultats 2022–2025 (historique, post-optimisation)
├─ Rendement annuel : +16.3% (IC 95% : 13%–19%)
├─ Alpha vs CAC 40 : +10.4 pts/an (IC 95% : +7.2 à +13.6 pts)
├─ Sharpe ratio : 1.00 (déflaté ~0.40–0.50 après correction multi-tests)
├─ Win rate T+90 : 66% (IC 95% : 61–71%)
└─ Années gagnantes : 4 / 4 consécutives (2022, 2023, 2024, 2025)
⚠️ Validation walk-forward
Résultats 2022–2025 optimisés via grid-search (583k combinaisons).
Robustesse hors-échantillon mesurée depuis 2026.
Voir /methodologie pour détails.
8. Checklist Publier Avant Production
- Add disclaimer data-snooping + DSR to
/methodologieand/performance - Harmonize "24k" vs "22k" across FR/EN (all → "24k")
- Add "since 2022" context: "4 consecutive years, in-sample period"
- Document look-ahead (marketCap PIT) with magnitude estimate (±2 pts)
- Remove "score ≥ 65" reference or clarify it's UI gate, not backtest gate
- Add confidence intervals to STRATEGY_PROOF display (Sharpe ± 0.45, win-rate ± 5%)
- Create FAQ: "Why 4 years?" "Why grid-search?" "What's DSR?"
- Add "⚠️ High data-snooping risk" tag to all claims about "only combo" or "unique"
- Peer-review all copies with quant (ensure no overstated claims remain)
- Publish walk-forward plan (2026 validation timeline)
9. Résumé Impact
Avant audit : Copy cohérent en surface (tous les nombres matchent) mais repose sur des présupposés non disclosés (data-snooping severity, look-ahead leakage, in-sample-only validation, concentration risk).
Après audit + fixes : Copy conservateur, transparent, avec IC 95% et disclaimers visibles. Trade-off = moins "punchy" marketing, mais conforme à standards FCA/SEC for backtest claims.
Win pour l'utilisateur :
- Pas de déception quand 2026 result ≠ 16.3% (crédibilité préservée)
- Confiance accrue sur les 4 years affichés (aucune hidden caveat)
- Clarity sur ce qu'il faut faire : "best-effort pre-filter, not standalone strategy"
Références Code Clés
src/lib/winning-strategy.ts: STRATEGY_PROOF constant (l. 281–524)src/app/page.tsx: Landing page data queries (l. 93–114)src/app/methodologie/page.tsx: Copy + disclaimers (l. 1–300)src/app/performance/page.tsx: Performance copy (l. 1–150)src/components/landing/*.tsx: Landing componentsdocs/method-review/04-academic-review.md: Data-snooping severitydocs/method-review/06-pit-audit.md: Look-ahead details