CitizOS · Trading · Doctrine
Discipline statistique · doctrine V20

Anti-overfitting · la discipline qui empêche l'auto-illusion

L'overfitting est la première cause de mort des systèmes trading. Cette page expose publiquement le protocole IS/OOS, la procédure walk-forward, les périodes invalidantes prévues, et trois cas réels où le système a échoué. Aucune justification sans la possibilité de l'invalidation.

« Si un système ne peut pas échouer dans le protocole, il échouera en production. »

1 · Découpage IS / OOS · jamais d'optimisation sur futur

In-Sample · IS
2024-Q1 → 2025-Q4 · 24 mois · paramétrage couches
Out-of-Sample · OOS
2026-Q1 · 3 mois · validation
Live shadow
2026-Q2 en cours · phase observable
Paramètres calibrés · seuils figés à la fin de la fenêtre
Aucun paramètre touché · uniquement mesure
Aucune action réelle · uniquement observation

Règles strictes du découpage

2 · Walk-forward · protocole roulant

Pour chaque couche dont la calibration nécessite une régression historique (notamment Régime et Memory), le protocole walk-forward est appliqué : on entraîne sur N mois, on teste sur M mois, puis on glisse la fenêtre.

Train 24-Q1
→ 24-Q3
Test 24-Q4
Train 24-Q2
→ 24-Q4
Test 25-Q1
Train 24-Q3
→ 25-Q1
Test 25-Q2
Train 24-Q4
→ 25-Q2
Test 25-Q3
Train 25-Q1
→ 25-Q3
Test 25-Q4
FoldTestExpectancyDD maxStable ?
124-Q4+0.019−6.2 %OUI
225-Q1+0.024−5.8 %OUI
325-Q2−0.004−9.1 %DÉGRADATION
425-Q3+0.011−7.4 %RÉCUPÉRATION
525-Q4+0.022−4.9 %OUI

Le fold 3 (25-Q2) montre une dégradation. Cette période correspondait à un range manipulé prolongé · la couche entropy était encore en V9, moins robuste. La V10 (intégrée depuis) explique partiellement la récupération en fold 4. Le détail de l'analyse est traité en case d'échec n°2 ci-dessous.

3 · Périodes invalidantes prévues

À J+30 (2026-06-19)

  • Écart vs Buy & Hold BTC < −5 % → couche à investiguer
  • % NO_TRADE > 99 % sans changement de régime → entropy probablement trop stricte
  • PnL évité cumulé < 0 → les refus coûtent plus qu'ils ne protègent

À J+60 (2026-07-19)

  • Variance du % NO_TRADE par régime > 0.15 → instabilité comportementale
  • Kill-switch jamais déclenché malgré DD > −8 % → seuil mal calibré
  • Memory : aucune similarity > 0.85 → l'index ne sert plus à rien

À J+90 (2026-08-18)

  • Aucun régime nouveau traversé → matrice multi-régimes inchangée
  • Écart vs DCA BTC < 0 → l'edge ne vaut pas le travail
  • Au moins 2 couches en statut "Hypothèse" → V21 obligatoire

À tout moment

  • DD > −12 % en shadow → audit complet immédiat
  • Régression silencieuse détectée (cohérence des décisions s'effondre) → pause système
  • Discordance entre snapshot du jour et fait observable → enquête forensic

4 · Trois cas réels où le système a échoué

Échec 01 · 2025-Q2 · le fold 3 du walk-forward
2025-04 → 2025-06

Range manipulé prolongé · entropy V9 saturée

L'entropy V9 utilisait uniquement wicks/body ratio. Quand le marché manipulé adopte un comportement plus "lisse" (corps allongés mais cohérence cross-asset cassée), V9 ne le voit pas. Le système a pris des trades pendant un range vicieux. Expectancy : −0.004 sur le trimestre, DD −9.1 %.

Correctif apporté en V10 Ajout de cross_asset_coherence comme second axe d'évaluation. Le seuil entropy combine désormais les deux signaux. Le fold 4 (25-Q3) a confirmé la récupération · expectancy revenue à +0.011.
Échec 02 · 2025-09-12 · 4 stops consécutifs en 6h
12 sept 2025

Sizing fixe inadapté à un pic de volatilité

Lors d'une cascade de liquidations majeures, le risk engine V6 utilisait encore un sizing fixe par défaut (5 % du capital). Quatre stops consécutifs ont liquidé 18 % du capital simulé en 6 heures. Le système n'a pas vu venir l'amplitude de la vol.

Correctif apporté en V7 Refonte complète du risk engine : sizing fonction de vol_30d, drawdown courant, corrélation portefeuille. Invariant explicite : "réduire avant bloquer". Le module sizing fixe a été retiré et conservé en archive pour traçabilité.
Échec 03 · 2024-12-08 · faux signal régime
8 déc 2024

Classification régime trompée par une journée atypique

La couche régime V5 classait sur fenêtre 24h. Un single-day pump anormal (+22 % en 6h sur BTC) a déclenché un basculement temporaire en "trend_haussier" avec confidence 0.71. Plusieurs setups alts ont passé les filtres avant que le retracement du lendemain n'invalide la classification.

Correctif apporté en V6 Confidence calculée sur fenêtre 72h minimum. Ajout d'une exigence de cohérence cross-asset pour valider un changement de régime. Coût : la classification réagit plus lentement (~6h de retard) mais est nettement plus stable.

5 · Ce que cette discipline n'élimine pas

Biais de sélection des features

Les features mesurées sont celles qu'on a pensé à mesurer. Une feature critique non considérée reste invisible jusqu'à ce qu'un événement la révèle.

Dérive de distribution

Les paramètres calibrés sur 2024-2025 peuvent devenir obsolètes en 2026-2027 si le marché change structurellement. La validation longitudinale le détectera, pas le walk-forward historique.

Survivorship bias des paires

Les 26 paires testées sont les paires liquides aujourd'hui. Les tokens morts ou délisted n'apparaissent pas dans l'historique. C'est une limite structurelle des données.

Risque de l'observateur

Le simple fait de publier ces seuils peut, à long terme, modifier le comportement du marché autour des niveaux que nous observons. Improbable à notre échelle, pas impossible.

→ Voir les justifications par couche · la matrice multi-régimes · l'avancement de la validation longitudinale.