Comment nous validons — et ce que nous avons rejeté
Chaque mesure publiée par StrateForge passe par le même protocole avant d'être servie. Et quand un cadre échoue, nous le publions aussi : un rejet documenté vaut plus qu'une courbe soigneusement choisie.
Les 5 mesures — ce que chaque chiffre veut dire
Cinq objets utilisent une échelle voisine de 0 à 100 sans signifier la même chose. Ce tableau est la référence : chaque mesure garde son libellé, partout — site, indicateurs, livraisons.
Guides de lecture Cinq pages pédagogiques réelles détaillent les deux échelles, la mesure en direct et les données : « Probabilité ou percentile : ne jamais comparer les niveaux bruts » · « Lire le forward test : journal, frais, hit rate » · « L'effet des frais : pourquoi la rotation quotidienne a été rejetée » · « Les limites de l'approximation Pine : rangs oui, niveaux non » · « Données, exports et API de mesure : le dictionnaire ».
| Mesure | Libellé affiché | Explication |
|---|---|---|
| Sortie probabiliste du serveur | « Probabilité estimée de l'événement défini » | Événement exact : rendement avant 24h > 0,75×ATR%14 (moyenne simple du True Range sur 14 périodes, rapportée à la clôture) — horizon 24h (1D), modèle réentraîné le 1r octobre 2026 (walkforward-initial en forward test depuis le 23/09/2026). Calibration isotonique côté serveur ; statut de calibration : section Calibration ci-dessous. |
| Rang dans l'univers | « Rang N sur 81 » (ou percentile) | Position relative dans l'univers du jour : aucune garantie sur le niveau absolu. |
| Score Pine | « Indice composite — 0 à 100 » | Approximation distincte du modèle serveur ; ce n'est PAS une probabilité calibrée. Centré ~50 par construction (±16 sur la validation), seuils 66/36 = quantiles empiriques — comparer les rangs, jamais les niveaux. |
| Mesure short miroir | « Mesure expérimentale — validation séparée » | Une transformation miroir ne démontre pas une capacité prédictive équivalente : forward test dédié en cours, verdict rendu par les données. |
| Mesure 6h | « Contexte 6h » | Rôle et validation distincts de ceux du daily : AUC 0,521, 20 actifs historiques, affichée en contexte croisé avec le 1D, jamais seule. |
Quatre questions distinctes
Quatre questions différentes sont régulièrement fusionnées dans les textes de ce secteur. Pour chacune : la définition exacte et la réponse de StrateForge.
Le protocole
Les 6 validations du moteur
| Cadre testé | Résultat | Verdict |
|---|---|---|
| Classement journalier 1D | AUC 0,588 en validation walk-forward (273 jours OOS, déc 2025 → août 2026) ; forward test public en direct depuis le 23/09/2026 | VALIDÉ — en production |
| Classement 6h | AUC 0,521 | VALIDÉ LIMITÉ — mesure contextuelle, 20 actifs historiques, jamais affiché seul |
| Classement 4h | AUC 0,511 (barre : 0,54) | REJETÉ |
| Classement 1h | AUC 0,515 (barre : 0,54) | REJETÉ |
| Signaux transversaux 4h/1h (rangs percentiles) | AUC 0,536 / 0,510 | REJETÉ — chantier clos définitivement |
| Cadre complet « playbook » (entrées top 10, sortie top 30 ou stop 1,5×ATR, risque 1 %/position, frais 0,30 % aller-retour) | Expectancy nette −1,73 $/trade · CAGR −15,2 %/an · drawdown max −74 % · 2 402 trades | REJETÉ — 27/09/2026 |
Vérifier par vous-même
Chaque réentraînement mensuel régénère validation-folds.json : pour chaque fold de la validation walk-forward — période de test, AUC, logloss, nombre de lignes et de positifs. Le modèle est entraîné sur les mois strictement antérieurs au mois testé (mêmes hyperparamètres gelés que la production), donc chaque métrique porte uniquement sur des données jamais vues. N'importe qui peut recalculer nos chiffres de validation à partir de ce fichier.
Premier rapport complet : réentraînement du 1r octobre 2026 — puis chaque mois.
Calibration
La calibration répond à une question simple : quand le modèle dit 15 %, l'événement arrive-t-il 15 % du temps ? Trois instruments, trois statuts honnêtes — chiffres réels uniquement, rien d'autre.
chargement…
Empreinte SHA-256 des fichiers, date d'entraînement, cutoff, univers, features, cible (contrat commun), calibration, folds hors échantillon avec métriques agrégées ET dispersion — les folds défavorables (AUC < 0,5) sont affichés autant que les favorables. Source unique : forward-test/modeles.json (régénéré à chaque mesure). Trois mesures y sont séparées : AUC serveur (walk-forward), approximation Pine (indice composite 0-100, échelle différente), vérification prospective (forward test). L'ancienne référence « AUC 0,588 » y figure datée, jamais comme métrique actuelle — la métrique courante est le pooled OOS du mois avec sa dispersion.
chargement…
Mécanisme (depuis le 07/10/2026) : chaque jour, les
probabilités (calibrée, brute, par membre d'ensemble) sont enregistrées AVANT l'échéance dans un
journal interne horodaté ; à l'échéance, le label est calculé d'après la cible exacte du contrat
(tgt-rfwd-075atrpct, fiche 19) ; ce fichier public agrège uniquement les entrées
échues. Brier = moyenne de (p − y)². Source : forward-test/calibration.json (regénéré à chaque
mesure).
chargement…
10 bins de 0,10 définis à l'avance ; chaque bin affiche son effectif, sa fréquence observée et son IC95 de Wilson. Un bin à petit effectif est marqué comme tel ; tant que l'effectif total échu est sous le seuil pré-enregistré, la réponse affichée est « données insuffisantes » — le mécanisme est prouvé, l'effectif se constitue. Long et short sont séparés ; le short porte la qualification « calibration du miroir expérimental » (approximation assumée, tâche 1).
Le journal du forward test n'est pas un échantillon de calibration. Sa colonne gagnant mesure un événement différent du label du modèle (rendement net > 0 après frais, contre mouvement > 0,75×ATR%14). Deux questions distinctes — ne pas les fusionner.
Le forward test public — protocole écrit et public
Depuis le 3 octobre 2026, la mesure du forward test suit un protocole écrit et versionné : PROTOCOLE_FORWARD.md. Règles : panier protocolaire top 10 long + top 3 short du classement du jour, entrée à la clôture du dernier daily clôturé, sortie à la clôture suivante (≈ 24 h), portefeuille équipondéré de capital fictif 10 000 $. Frais — deux règles, deux périodes : les classements du 23/09/2026 au 02/10/2026 sont mesurés bruts (aucun frais déduit, ni à l'époque ni depuis) ; à partir du classement du 03/10/2026, les frais de 0,30 % aller-retour sont déduits de chaque ligne. Le 6h a ses frais déduits depuis sa création (règles propres du cadre 6h). Les résultats des deux périodes ne sont pas directement comparables : la période initiale est brute, la période courante est nette de frais. Le forward test public présente les deux séries séparément. Le journal public ne contient que les horizons clôturés ; le 6h reste un cadre contextuel séparé (top 10, clôture J → J+1, frais 0,30 % AR). Les publications initiales, les versions corrigées et les règles par période sont conservées dans les archives publiques, sans compte.
Engagement d'antériorité. Chaque jour, le hash SHA-256 du classement complet (plus un nonce aléatoire) est publié à 16h10 dans le post public et révélé le lendemain (nonce + classement complet) : quiconque peut vérifier que le classement diffusé n'a pas été réécrit après coup. L'engagement prouve l'antériorité du classement (son hash était public avant la clôture suivante) ; il ne prouve ni le rang futur, ni le rendement futur. Le hash garantit qu'un classement annoncé n'a pas été modifié entre l'engagement et la révélation. Il ne prouve ni l'heure exacte de première publication ni la qualité scientifique du protocole — c'est pourquoi nous conservons publiquement la trace de chaque engagement et la date de chaque publication. La chaîne d'engagement démarre le 2 octobre 2026 ; le registre permanent complet : engagements.json et engagements.html.
Deux mesures distinctes
Piste B — mesure reproductible à la publication (la preuve publique). Une ligne du forward test public n'existe que si le classement du jour J a été gelé (engagement hash ci-dessus) et publié avant la clôture 00h00 UTC fin J. La mesure démarre à la clôture réelle du jour J (entrée) et se termine à la clôture du jour J+1 (sortie). Un client qui découvre le classement à sa publication peut donc reproduire la mesure à l'identique, jour par jour, depuis les seuls artefacts publics (registre des engagements + révélations + journal B). Chaque ligne publiée du journal B porte l'engagement_hash du classement qu'elle mesure ; toute divergence entre le classement révélé et le hash engagé est une alerte bloquante de la chaîne de publication. Journal de la piste B : journal_b.csv. Les lignes publiées sont append-only : une correction ne réécrit jamais une ligne — elle crée une version supplémentaire (v2, v3…) avec horodatage et motif, la version initiale restant visible à jamais (immutabilite.json — manifeste scellé ligne à ligne à chaque publication ; versions.json — registre des corrections versionnées). La validation automatique de la chaîne échoue si une ligne scellée disparaît ou change de valeur sans version.
Piste A — évaluation statistique interne (conservée, étiquetée). Les mesures historiques prises avant la chaîne d'engagement (classements du 23/09/2026 au 01/10/2026, mesurées à 08h10 UTC sur un classement du jour précédent sans gel pré-fenêtre) ne sont pas reproductibles à la publication : elles restent visibles à jamais sous l'étiquette « évaluation statistique interne (piste A) », sans être effacées ni recalculées — marquage consigné dans errata.json (entrée t29-e1). Journal de la piste A : journal.csv (journal 6h séparé : journal_6h.csv). Les seules mesures présentées comme preuve publique reproductible sont les lignes de la piste B.
chargement…
Règle de lecture (fiche 21) : une seule journée B ne produit jamais une conclusion de robustesse — au premier jour évalué, la piste B montre un mécanisme, pas un résultat. Toute lecture statistique exige plusieurs fenêtres engagées puis échues.
Erratum du 3 octobre 2026, corrigé le 4 octobre (entrée t30-e1). Entre le 23 septembre et le 2 octobre 2026, deux protocoles de mesure coexistaient : la courbe « Long » mesurait l'univers entier du classement (entrée clôture J, sortie clôture J+1) tandis que la courbe « Short » mesurait déjà le panier top 3. Les deux mesures étaient honnêtes et publiques, mais ce n'était pas un objet unique comparable. Le protocole ci-dessus remplace les deux à compter du 3 octobre. Correction de présentation (04/10) : notre post d'erratum du 03/10 affirmait que les frais de 0,30 % AR avaient été déduits « rétroactivement sur tout l'historique », et cette déduction avait bien été exécutée sur le journal ce jour-là (1 386 lignes historiques à frais déduits pendant ~24 h). Elle a été annulée le 04/10 : la période initiale (23/09 → 02/10) est restaurée brute dans le journal public et dans le graphique (aucune mesure de prix réécrite — seul le champ de frais de ces lignes a été neutralisé, opération consignée dans l'errata). La période courante (à partir du 03/10) reste nette. Les résultats des deux périodes ne sont pas directement comparables : la période initiale est brute, la période courante est nette de frais. Le post initial reste consultable dans les archives, avec sa version corrigée ici.
Erratum du 4 octobre 2026 (entrée t30-e2). Les posts des 01/10 et 02/10 annonçaient des compteurs absents du JSON servi, et le post du 03/10 annonçait « 10 jours évalués, cumul panier −0,7 % » alors que le JSON servi annonçait « 9 jours, −0,459 % » : les statistiques n'étaient pas rafraîchies après la mesure quotidienne et aucun contrôle ne vérifiait les textes contre le JSON. Le journal public était exact en permanence. Corrigé le 04/10 : recalcul systématique après chaque mesure et contrôle automatique — tout écart entre un post et le JSON bloque la publication. Aucune réécriture de l'historique : les entrées d'errata sont datées et permanentes.
Ce que dit le rejet du playbook
Le cadre complet a été testé en walk-forward strict du 1er juin 2023 au 31 août 2026 : univers point-in-time (top 80 par volume médian 30 jours + 30 actifs historiques), 39 folds, règles pré-enregistrées appliquées à la lettre, capital fictif de 10 000 $.
Le détail compte : à brut, la moyenne observée est … $ par
trade, avec un intervalle à 95 % de … (bootstrap par blocs
temporels — protocole pré-enregistré bootstrap-blocs-semaine-v1, figé avant analyse).
Les 2 402 trades se chevauchent (jusqu'à 10 positions ouvertes, ~4,5 jours en moyenne) : ce ne sont
pas 2 402 observations indépendantes — les observations indépendantes sont les
… semaines calendaires d'entrée. Une moyenne positive dont
l'intervalle contient 0 est une observation, pas un avantage démontré. Chaque
rotation coûte … $ en moyenne (frais + slippage, ~2 trades par jour).
Le cadre gagne jusqu'à fin 2024 (pic : 21 569 $), puis saigne de façon continue en 2025-2026.
Trois conditions figées avant le run (expectancy positive, intervalle de confiance à 95 %
au-dessus de zéro, CAGR positif) échouent toutes les trois. Verdict :
cadre_valide = false. Brut et net sont publiés séparément,
avec chacun sa moyenne, son nombre d'observations indépendantes et son intervalle :
playbook-verdict.json, clé expectancy_detail.
Données machine complètes : playbook-verdict.json.
Rejets publiés
Deux chantiers complets ont abouti à un rejet — publiés ici avec la même précision que les validations. Un rejet documenté vaut plus qu'une courbe soigneusement choisie.
Ce qui a été testé. Le cadre d'exécution complet au-dessus du classement : entrée sur les actifs restant dans le top 10 deux jours de suite, sortie hors top 30 ou stop 1,5×ATR(14), taille de position fixée par l'ATR (risque 1 % du capital par position, 1,5×ATR), frais réels 0,30 % aller-retour. Walk-forward strict : 39 folds, période testée OOS du 1er juin 2023 au 31 août 2026, univers point-in-time, capital fictif de 10 000 $, 2 402 trades.
Verdict : REJET — expectancy nette −1,73 $/trade (IC95 par blocs temporels,
protocole v1 : intervalle qui contient 0 — détail dans playbook-verdict.json ; l'IC bootstrap iid
historique [−7,13 ; +4,23] est conservé daté sous methodes_historiques, hypothèse
d'indépendance non tenable), CAGR net −15,2 %/an, drawdown max −74 %.
Leçon. À brut, la moyenne est de +1,21 $/trade — mais son IC95 par blocs temporels contient 0 : observation, pas avantage démontré (2 402 trades regroupés en ~170 semaines indépendantes). Et chaque rotation coûte ~2,94 $/trade en moyenne (frais + slippage, ~2 trades par jour) : les frais punissent la rotation rapide. Le classement reste une mesure — pas une machine à tourner en boucle. Détail complet : playbook-verdict.json.
Ce qui a été testé. Trois effets documentés dans la littérature, à modèle zéro : E1 lead-lag BTC → alts (estimateur Hayashi-Yoshida, grille figée de 20 combinaisons), E2 momentum intraday (réplication Shen, Urquhart & Wang 2022, fenêtres d'ouverture recalculées en temps réel — look-ahead interdit), E3b réponse directionnelle aux déciles empiriques glissants du funding (hypothèse nouvelle, prior de rejet). Univers point-in-time : 36 mois de top-30 perpétuels USDT rééquilibré mensuellement (235 membres uniques, 706 entrées/sorties, table publiée). Fenêtre d'évaluation OOS : avril 2025 → août 2026. Règle de survie figée avant tout run : edge brute conditionnelle ≥ 1,3× les coûts aller-retour (14/9/4 bps selon le profil d'exécution) à la grille ×1 ET à la sensibilité ×2, sur ≥ 300 paris effectifs indépendants (compte par ratio de variance long terme — jamais le compte nominal).
Résultats. E1 : 44 510 587 paris nominaux, 42 489 467 effectifs — edge max 2,7 bps, soit moins d'un septième du coût maker. E2 : 91 113 nominaux, 83 174 effectifs — edge max 13,4 bps, seulement en maker ×1, aucune cellule significative après contrôle de multiplicité. E3b : 300 042 nominaux, 181 098 effectifs — edge max 311,9 bps mais t = 1,37 (l'intervalle de confiance contient 0), 0 cellule significative sur 824 après Bonferroni.
Verdict : REJET PUBLIÉ. Aucun effet n'établit une espérance brute mesurable au-delà des coûts. Protocole complet, chiffres et déviations consignées : intraday-protocole-phase0-1.md.