Comment l’étude a été construite
De quoi vérifier un chiffre de la note à la main, ou reconstruire une étude équivalente à partir des données publiques Binance. Toutes les entrées sont gratuites et publiques.
Données
Trois sources publiques, toutes issues de l’archive publique Binance et de son point d’accès metrics, couvrant les contrats perpétuels USD-M. Rien de payant ni de propriétaire.
| Entrée | Granularité | Sert à |
|---|---|---|
| Chandeliers | 1 minute | prix, rendements, volatilité, volume |
| Indice de prime | 1 minute | variables de base |
| Financement réalisé | par événement | flux de trésorerie sur sa barre de règlement |
| Intérêt ouvert | 1 heure | variables de positionnement |
Les quatre entrées sont publiques et gratuites. Le financement est un flux de trésorerie et non une variable explicative, car un modèle qui voit son propre financement peut apprendre à négocier autour du règlement.
Deux particularités de l’archive doivent être traitées, faute de quoi le panneau se désaligne silencieusement. Les fichiers de chandeliers changent de convention d’en-tête en cours d’historique, et une période ancienne horodate en microsecondes plutôt qu’en millisecondes. Les deux sont normalisées à la lecture.
La couverture de l’intérêt ouvert est un plafond dur et non une limite de collecte. La plateforme ne publie les métriques du deuxième contrat en taille qu’à partir de décembre 2021, et les dates antérieures renvoient une absence pour la plupart des contrats. Une extension rétrospective sur les 354 contrats a tourné 148 minutes et ajouté zéro ligne. C’est pourquoi la comparaison de variables se limite aux fenêtres tardives.
Univers
354 contrats, dont 56 retirés avant la fin de l’échantillon et conservés aux dates où ils se sont effectivement négociés. La sélection se fait à la date : à chaque frontière de mois, les contrats sont classés par volume quotidien moyen en dollars sur les 30 jours strictement antérieurs, et les 40 premiers sont éligibles.
Les filtres d’éligibilité s’appliquent avant le classement, de sorte qu’ils ne peuvent dépendre d’un résultat. La devise de cotation doit être l’USDT, les contrats à échéance sont exclus, et les sous-jacents non crypto le sont également.
# history eligibility is tested on genuinely traded volume, not file existence,
# because the archive pads a contract's file after its last real trade
traded = bars.filter(pl.col("quote_volume") > 0)
last_real = traded["open_time"].max()
bars = bars.filter(pl.col("open_time") <= last_real)Observation et action
Une décision par heure. L’action est composée de 20 nombres compris entre moins un et plus un, un par emplacement, lus comme la fraction cible du compte à détenir sur ce contrat. Positif signifie acheteur, négatif vendeur, et la vente à découvert est permise puisqu’il s’agit de contrats perpétuels.
Quatre règles s’appliquent ensuite dans l’ordre. Tout ce qui se situe entre moins et plus deux centièmes est ramené à zéro exact, de sorte que ne rien détenir soit un choix accessible plutôt qu’un équilibre instable. Chaque contrat est plafonné au quart du compte. Si la somme des poids en valeur absolue dépasse un, l’ensemble est réduit proportionnellement : il n’y a donc pas d’effet de levier. Les emplacements portant un contrat qui ne se négocie pas à cette heure sont forcés à zéro.
L’observation comprend, par contrat, ses colonnes de variables plus trois grandeurs propres à l’agent : le poids qu’il détient, s’il est en gain ou en perte sur cette position, et depuis combien de temps il la détient. Suivent douze grandeurs au niveau du compte : exposition brute et nette, perte depuis le plus haut, logarithme de l’équité, nombre de contrats actifs et détenus, avancement dans l’épisode, résultat réalisé, taille moyenne des transactions, coût et financement cumulés, et le plafond brut.
Les positions sont réduites de force au marché si l’exposition brute dépasse une fois et demie le plafond, et un épisode se termine si l’équité tombe sous le quart de sa valeur initiale.
Coûts et financement
Les coûts sont portés dans la récompense plutôt que soustraits après coup, ce qui importe car les deux récompenses par transaction y seraient autrement aveugles, et une récompense par transaction aveugle aux coûts enseigne de façon démontrable la sur-négociation.
fee = taker_fee * traded_notional # 5 bp per fill
slippage = (base_slip + impact_k * sigma * sqrt(participation)) * traded_notional
participation = traded_notional / max(interval_dollar_volume, 1.0) # capped at 5%
funding = position_notional * funding_rate # on the true settlement bar onlyLe terme d’impact est mis à l’échelle par la volatilité réalisée du contrat plutôt que par la seule participation. Sans le terme de volatilité, l’expression est dimensionnellement fausse : une version antérieure facturait 2,3 % de dérapage à une transaction de dix mille dollars sur le plus gros contrat.
La participation est mesurée face à une taille de compte fixe plutôt qu’à des fractions d’équité, sans quoi le plafond ne mord jamais. Les transactions inférieures à un millionième du compte sont annulées, ce qui empêche le bruit d’arrondi en simple précision d’être enregistré comme environ mille transactions fantômes par exécution.
| Paramètre | Valeur |
|---|---|
| Frais preneur | 5 pb par exécution |
| Dérapage de base | 2 pb par exécution |
| Impact | racine carrée de la participation, mise à l’échelle par la volatilité réalisée |
| Plafond de participation | 5 % du volume en dollars de l’intervalle |
| Financement | taux réalisé, appliqué une fois sur sa barre d’événement |
| Compte | 100 000 USD, fixe |
Paramètres de coûts. Tous sont facturés à chaque exécution, au poids réel de la position.
Validation glissante
Vingt fenêtres glissantes. Chacune prend 18 mois d’entraînement, 3 de validation et 3 de test, avec une purge de 7 jours et un embargo d’un jour à chaque frontière. La longueur de purge correspond au plus long historique requis par une variable, de sorte qu’aucune ligne d’entraînement ne puisse voir une barre chevauchant une cible de test.
La normalisation est ajustée sur les seules lignes d’entraînement. Le point de contrôle est choisi d’après l’équité de validation sur quatre segments d’entraînement, jamais d’après le test. Le test est touché une fois par configuration.
Le criblage a utilisé les fenêtres 1, 3, 5, 8, 11, 14, 17 et 19. La période hors échantillon s’étend du 17 novembre 2021 au 17 août 2026.
# features from completed bar t -> decision after bar t -> fill at bar t+1
# a rotation into a slot whose contract changed must NOT settle against the
# previous contract's price, which is the single worst defect found in build
rotated = (sym_id[t+1, k] != sym_id[t, k]) or (not live[t+1, k])
step_ret = 0.0 if rotated else (px[t+1, k] / px[t, k] - 1.0)Fonctions de récompense
Six conceptions, identiques par ailleurs. Deux ne s’expriment qu’à la clôture d’une position, quatre s’expriment chaque heure.
| Conception | Rémunère | Quand |
|---|---|---|
| Résultat net par transaction | le résultat réalisé après les coûts propres à la transaction | à la clôture |
| Signe de chaque transaction | plus un par clôture gagnante, moins un par perdante | à la clôture |
| Rendement logarithmique | la variation horaire de la valeur du compte | chaque heure |
| Rendement moins perte maximale | idem, diminué d’une pénalité sur la profondeur sous le plus haut | chaque heure |
| Ratio de Sharpe directement | Sharpe différentiel, mis à jour en continu | chaque heure |
| Rendement mis à l’échelle de la volatilité | le rendement horaire divisé par la volatilité récente | chaque heure |
Les six conceptions. Les deux premières correspondent à la spécification d'origine et sont réglées nettes des frais, du dérapage et du financement propres à la transaction.
Agents de référence
Sept, exécutés sur le même environnement et le même modèle de coûts. Ne rien détenir, acheter et conserver l’univers, acheter et conserver un seul contrat, l’équipondération, une règle de suivi de tendance, une règle de retour à la moyenne, et un agent aléatoire.
C’est l’agent aléatoire qui compte. Il est apparié à la rotation mesurée de la politique à laquelle il est comparé, en conservant son portefeuille aléatoire pendant le nombre de pas qui reproduit cette intensité de négociation. Comparer une politique à une position achetée et conservée la flatterait, puisqu’elle paie bien davantage de coûts. Une échelle d’agents aléatoires à plusieurs durées de détention est également produite, afin que chaque politique soit jugée face au barreau le plus proche de sa propre rotation.
Ne rien détenir est conservé même si cet agent ne négocie jamais. Ne rien faire est ici une stratégie légitime, et le disqualifier faute de transactions supprimerait la référence qui détecte un agent ayant appris à rester à l’écart.
Inférence
La statistique enregistrée est le 25e centile du rendement ajusté du risque hors échantillon agrégé sur les points de départ aléatoires, et non la médiane. Un classement sur la médiane laisserait présenter comme un avantage un résultat porté par trois départs chanceux sur cinq, ce qui s’est précisément produit une fois dans cette étude et a été intercepté par cette règle.
Le nombre d’essais pour toute correction de multiplicité est le nombre de configurations distinctes, jamais le nombre d’exécutions. Les points de départ d’une même configuration ne sont pas des essais indépendants. Les séries hors échantillon agrégées sont notées directement ; les chiffres par fenêtre ne sont jamais moyennés en un chiffre principal, et le nombre de fenêtres n’est jamais multiplié dans un décompte de stratégies.
La probabilité de surapprentissage du backtest est calculée par validation croisée combinatoire symétrique sur la famille de configurations. L’erreur par famille est contrôlée par Holm et par Benjamini-Hochberg. Le Sharpe déflaté utilise le nombre de configurations distinctes comme nombre d’essais.
# per-window fractions each restart at 1.0, so they must not be summed across
# windows. The MEAN across windows is additive and the parts reconcile; a
# median of each column separately does not sum to the median net.
gross = mean(w.total + w.cost - w.funding for w in windows)
cost = mean(w.cost for w in windows)
net = mean(w.total for w in windows) # gross - cost + funding == netContrôles
Ils s’exécutent avant toute lecture de résultat, et un échec interrompt l’étude au lieu de produire une note de bas de page.
| Contrôle | Ce qu’il intercepte |
|---|---|
| Invariance à la troncature | une variable qui anticipe, en exigeant que l’historique tronqué reproduise l’historique complet |
| Cible implantée | un dispositif incapable de détecter une fuite même lorsqu’on en injecte une |
| Fidélité du noyau | la dérive du simulateur rapide face à une implémentation lente et indépendante |
| Invariants comptables | dix-sept vérifications dont un indice équipondéré calculé à la main |
| Identité d’échantillon | des branches d’une même comparaison reposant sur des lignes différentes |
| Dégénérescence | une exécution qui n’est qu’un agent de référence portant le nom d’une politique |
| Intégrité de la réserve | une fenêtre réservée touchée par une exécution |
| Reproductibilité | une réexécution ne reproduisant pas exactement ses chiffres enregistrés |
Chaque contrôle s'exécute avant toute lecture de résultat, et un échec interrompt l'étude. Un test qui ne peut pas échouer n'est pas un contrôle : le témoin à cible implantée doit donc s'améliorer nettement, sinon c'est le dispositif lui-même qui est défaillant.
Le contrôle comptable est celui qui a justifié sa place. Il a intercepté un prix fictif servant à régler une rotation vers un emplacement dont le contrat avait changé, ce qui annonçait un rendement multiplié par 31 là où la vérité calculée à la main était de 1,46.
Exécutions et écarts
219 exécutions, aucun échec. La comparaison des récompenses est équilibrée à cinq points de départ aléatoires par conception ; une conception a ensuite été portée à quarante pour l’expérience sur les coûts, et cette extension est présentée séparément plutôt que mêlée à un tableau à cinq départs.
Trois écarts au plan sont consignés. Deux des vingt fenêtres réservées ont été utilisées lors du criblage, ce qui les a consommées et a ramené la réserve à deux fenêtres intactes. La comparaison de variables a été relancée sur un jeu de fenêtres plus tardif dès qu’il est apparu que la couverture de l’intérêt ouvert aurait autrement fait reposer ses branches sur des échantillons différents. Enfin, une grille de cadence secondaire a été abandonnée car elle représentait environ 26 heures pour un budget de quatre heures, de sorte que la question de la cadence est traitée par les seuls agents de référence, ce qui constitue une preuve plus faible qu’une grille de politiques.
Un chiffre publié a été corrigé après coup. Une première version de la décomposition des coûts sommait les colonnes du registre des transactions à la fois sur les fenêtres et sur les points de départ, ce qui compte double et additionne des fractions de capital qui repartent chacune de un. Le registre est en premier entré, premier sorti et ne retient que le réalisé : sa somme diffère donc légitimement du rendement total par la valorisation de l’inventaire encore ouvert en fin de fenêtre. Les décompositions proviennent désormais des accumulateurs du simulateur.

