← Retour à la note
Reproductibilité

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éeGranularitéSert à
Chandeliers1 minuteprix, rendements, volatilité, volume
Indice de prime1 minutevariables de base
Financement réalisépar événementflux de trésorerie sur sa barre de règlement
Intérêt ouvert1 heurevariables 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 only

Le 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ètreValeur
Frais preneur5 pb par exécution
Dérapage de base2 pb par exécution
Impactracine carrée de la participation, mise à l’échelle par la volatilité réalisée
Plafond de participation5 % du volume en dollars de l’intervalle
Financementtaux réalisé, appliqué une fois sur sa barre d’événement
Compte100 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.

ConceptionRémunèreQuand
Résultat net par transactionle résultat réalisé après les coûts propres à la transactionà la clôture
Signe de chaque transactionplus un par clôture gagnante, moins un par perdanteà la clôture
Rendement logarithmiquela variation horaire de la valeur du comptechaque heure
Rendement moins perte maximaleidem, diminué d’une pénalité sur la profondeur sous le plus hautchaque heure
Ratio de Sharpe directementSharpe différentiel, mis à jour en continuchaque heure
Rendement mis à l’échelle de la volatilitéle rendement horaire divisé par la volatilité récentechaque 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 == net

Contrô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ôleCe qu’il intercepte
Invariance à la troncatureune variable qui anticipe, en exigeant que l’historique tronqué reproduise l’historique complet
Cible implantéeun dispositif incapable de détecter une fuite même lorsqu’on en injecte une
Fidélité du noyaula dérive du simulateur rapide face à une implémentation lente et indépendante
Invariants comptablesdix-sept vérifications dont un indice équipondéré calculé à la main
Identité d’échantillondes branches d’une même comparaison reposant sur des lignes différentes
Dégénérescenceune exécution qui n’est qu’un agent de référence portant le nom d’une politique
Intégrité de la réserveune 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.

← Retour à la note