Chasse aux stops sur les plus hauts et plus bas de la veille
Chaque chiffre de la note, et d'où il vient : assez de méthode pour vérifier l'arithmétique à la main ou pour reconstruire une étude équivalente à partir des archives publiques de Binance et d'OKX. Les extraits illustrent la logique plutôt qu'ils ne reproduisent le code de production.
Données
Les données Binance viennent de data.binance.vision/data/futures/um/, qui est public et ne demande aucun identifiant :
- les klines d'une minute par contrat, la seule série de prix que l'étude lit ;
- les événements de funding à leurs véritables horodatages de règlement, avec l'intervalle publié pour chaque événement ;
- les fichiers aggTrades quotidiens, utilisés deux fois : pour le spread mesuré de chaque contrat-mois et pour établir l'ordre des transactions à l'intérieur des minutes ambiguës ;
- les klines d'une minute du mark price pour les dix contrats les plus traités chaque mois.
Les données OKX viennent de l'archive publique de la bourse, à static.okx.com/cdn/okex/traderecords/:
- les fichiers mensuels de chandeliers d'une minute pour les swaps USDT, depuis septembre 2021, y compris les contrats retirés par la suite ;
- les fichiers de transactions quotidiens, utilisés pour résoudre les minutes ambiguës.
Les deux séries OKX arrivent en mois et jours UTC+8. Les fichiers sont concaténés et dédoublonnés sur l'heure d'ouverture du chandelier, et chaque fichier de transactions est rattaché à la journée UTC+8 qu'il couvre.
Les prix Binance sont stockés en flottants 32 bits, de sorte que chaque contact compare des valeurs stockées des deux côtés, et les niveaux en chiffres ronds, seuls niveaux qui ne proviennent pas d'une barre stockée, sont convertis à la même précision avant comparaison, tandis que les prix OKX sont lus et comparés en flottants 64 bits.
Univers
Le premier jour de chaque mois, chaque perpétuel Binance margé en USDT disposant d'au moins 45 jours d'historique est classé par volume quotidien médian en dollars sur les 30 jours précédents, et les 50 premiers forment l'univers du mois, à l'exclusion des perpétuels d'indice BTCDOMUSDT, DEFIUSDT, FOOTBALLUSDT et BLUEBIRDUSDT. Les perpétuels USDT adossés à des matières premières ou à des actions restent inclus dès qu'ils se classent : 25 contrats-mois, surtout PAXG et l'or.
Le classement porte sur l'historique complet des listings de l'archive, et non sur la liste de contrats actuelle de la bourse, de sorte que les contrats morts par la suite comptent aux dates où ils se traitaient. Moins de 50 contrats se qualifient avant novembre 2020 (2 en février 2020, 8 en mars, entre 21 et 40 jusqu'en octobre). Le résultat est de 3,751 contrats-mois sur 308 contrats, de février 2020 à septembre 2026.
Pour OKX, l'univers est le swap OKX portant sur le même sous-jacent que chaque membre Binance, trouvé en retirant les préfixes multiplicateurs comme 1000 et en faisant correspondre à BASE-USDT-SWAP, partout où OKX dispose de données. Cela donne 2,697 contrats-mois sur 201 swaps, d'octobre 2021 à septembre 2026, les terciles de liquidité étant repris du classement Binance.
Niveaux
Les barres journalières sont construites à partir des barres d'une minute sur des journées UTC, et une journée est complète à partir de 1,380 barres. L'échelle de volatilité A du jour D est le true range moyen des jours D−14 à D−1, qui doivent tous les 14 être complets ; tout niveau activé le jour D utilise le A de ce jour.
TR[d] = max(H[d], C[d-1]) - min(L[d], C[d-1]) # H - L when day d-1 has no bars A[D] = mean(TR[D-14 : D]) # requires all 14 days complete
| Niveau | Définition | Fenêtre d'activité |
|---|---|---|
| Visible (V) | plus haut et plus bas de la journée UTC D−1 | D 00:00 à D+1 00:00 |
| I10, I13 | plus haut et plus bas de la fenêtre de 24 h s'achevant à 10:00 ou 13:00 UTC le jour D | 24 h à partir de l'ancrage |
| Hebdomadaire visible | plus haut et plus bas de la semaine ISO précédente | toute la semaine |
| Contrôle hebdomadaire | fenêtre de 7 jours s'achevant le jeudi à 10:00 UTC | les 7 jours suivants |
| Chiffre rond | multiple de g = 10^(floor(log10 C[D−1]) − 1) le plus proche au-dessus et en dessous de la clôture précédente, à au moins 0.1·A | jour D |
| Contrôle de chiffre rond | la même règle sur la grille (k + 0.37)·g | jour D |
Un niveau n'est éligible que si la première ouverture de sa fenêtre d'activité se situe à au moins 0.1·A du côté proche. Deux niveaux coïncident lorsqu'ils sont du même côté, tous deux actifs à la barre de contact et à moins de 0.1·A l'un de l'autre. Le test n'utilise que les niveaux actifs à la barre de contact de l'événement lui-même, et ne lit donc rien de ce qui suit le contact.
Les deux contrôles
Contrôle enregistré. Il regroupe I10 et I13 ; tout événement visible coïncidant avec un niveau I10 ou I13 est écarté, de même qu'un événement de contrôle qui coïncide avec un niveau visible journalier ou hebdomadaire. Lorsqu'un niveau I10 et un niveau I13 coïncident, c'est l'enregistrement I10 qui est conservé.
Contrôle propre. C'est le sous-ensemble des niveaux I10 et I13 dont l'extrême a été fixé le jour D−1. La minute d'extrême est la première minute de la fenêtre qui atteint l'extrême, et un niveau est propre lorsque cette minute tombe avant 00:00 UTC de son jour d'activation :
clean = kind.isin([I10, I13]) & (extreme_minute < activation_day * 1440)
Une fenêtre s'achevant à 10:00 UTC contient les dix premières heures de la journée UTC en cours, et un extrême fixé dans ces heures est le plus haut ou le plus bas courant du jour, qu'un chandelier journalier trace. Sur l'échantillon Binance, 57.7% des contacts de contrôle enregistrés résolus sont de ce type : 29,387 contre 21,578 propres. Ils sont rapportés comme un groupe à part.
L'encadrement de résultat
À la première barre d'une minute, à l'intérieur de la fenêtre d'activité, qui traite au travers du niveau, un encadrement symétrique de h = 0.1·A enregistre le premier passage. Barrière haute U = L + h et barrière basse D = L − h, décrites ici pour un plus bas, les plus hauts étant symétriques, sur un horizon de 1,440 barres.
# touch bar b0 if low[b0] <= D: outcome = AMBIG_A1 if close[b0] >= U else CONT # A2 flag if high[b0] >= U elif close[b0] >= U: outcome = REV else: continue to later bars # A3 flag if high[b0] >= U # later bars: both barriers in one bar -> AMBIG_A4; else the first barrier hit decides
Les événements sont écartés lorsqu'une série de cinq minutes manquantes ou plus survient avant la résolution, ou lorsque l'horizon est atteint sans résolution, ce qui laisse des parts non résolues inférieures à 0.01% dans les deux bras.
Résolution au tick
Les indicateurs A1 à A4 marquent les minutes dont l'ordre interne compte, ce qui couvre 11.0% des contacts visibles et 12.7% des contacts de contrôle enregistrés sur Binance. Le contrôle propre sur Binance est à 14.8%, et OKX à 10.2% en visible et 13.3% en propre.
Comme la part dépasse partout le seuil de déclenchement enregistré de 3%, un échantillon aléatoire stratifié d'au plus 400 événements marqués par bras est résolu transaction par transaction. Le fichier journalier de chaque événement est téléchargé puis réduit aux minutes nécessaires :
- la première transaction au niveau ou au travers constitue le contact ;
- la barrière que les transactions atteignent en premier ensuite décide du résultat ;
- la comparaison de contact admet une tolérance relative de 1e-6 pour le stockage en 32 bits des extrêmes de barre.
Chaque événement marqué reprend ensuite le taux de son couple bras-indicateur. Une cellule comptant moins de 10 événements au tick est regroupée avec l'autre indicateur à deux barrières (A1 avec A4) à l'intérieur de son bras, règle qui ne s'applique qu'aux estimations à contrôle propre.
| Échantillon | Événements résolus | Graine |
|---|---|---|
| Test enregistré, Binance | 799 sur 799 | 7 |
| Contrôle propre, Binance (événements visibles comme ci-dessus ; 200 événements propres du même échantillon plus 201 autres) | 800 sur 800 | 17 pour le tirage supplémentaire |
| Contrôle propre, OKX | 802 sur 802 | 7 |
Strates et pondérations
L'écart est Δ = Σ ws (pV,s − pC,s) / Σ ws, où ws est le nombre d'événements visibles résolus dans la strate s. Une strate comptant moins de 10 événements dans l'un ou l'autre bras est écartée, et chaque point de coupure des terciles provient de l'échantillon visible et de contrôle regroupé de cette place.
| Estimateur | Dimensions | Strates | Événements écartés |
|---|---|---|---|
| Enregistré | côté × bloc de 4 heures du contact × époque × liquidité × distance × vitesse (terciles) | 972 | 49% |
| Contrôle propre, principal | côté × époque × liquidité × distance × vitesse × temps écoulé (terciles) | 486 | 3.9% Binance, 7.6% OKX |
Le bloc d'heure d'horloge sépare presque les bras, parce que les niveaux visibles s'activent à 00:00 et les contrôles à 10:00 ou 13:00, ce qui explique que la moitié de l'échantillon enregistré se trouve dans des strates où un bras manque. L'estimateur à contrôle propre remplace l'heure d'horloge par le temps écoulé entre l'activation et le contact. La vitesse d'approche vaut |log(ouverture au contact / ouverture 60 barres plus tôt)| divisé par A / C[D−1].
Inférence
Les intervalles du test enregistré proviennent d'un bootstrap par grappes sur les semaines calendaires ISO, tous les contrats d'une semaine ensemble, avec 10,000 répliques et la graine 20261008. L'intervalle à deux étages retire en plus les événements résolus au tick à l'intérieur de chaque cellule bras-indicateur dans chaque réplique, puis recalcule les taux avant Δ :
for b in range(10_000):
w = np.bincount(rng.integers(0, W, W), minlength=W) # weeks
rates = {cell: rng.choice(x, len(x)).mean() for cell, x in tick.items()}
draws[b] = delta(w, rates)Sur l'échantillon enregistré, cela reproduit exactement l'estimation ponctuelle enregistrée, −0.019865, et élargit l'intervalle de [−0.0366, −0.0053] à [−0.0399, −0.0026], avec 53.2% des tirages à −0.02 ou en dessous. Les tests à contrôle propre l'utilisent comme intervalle principal (graine 20261009). Les p-values bilatérales valent deux fois la plus petite part de queue des tirages.
Tests de méthode
| Test | Exigence | Binance | OKX |
|---|---|---|---|
| Null par brassage, 20 graines | Δ moyen à ±0.005 près | enregistré +0.0015 (ET 0.0060) ; propre −0.0011 | propre −0.0005 |
| Test de pollution, 200 événements | niveau, A, éligibilité, coïncidence, strates et minute d'extrême identiques au bit près | 200/200 (les deux protocoles) | 200/200 |
| Niveau fuité (plus haut ou plus bas du jour D lui-même) | |Δ| > 0.1 | +0.506 | n/a |
| Placebo d'ancrage horaire (I10 contre I13) | l'intervalle contient 0, ou |Δ| < 0.01 | enregistré +0.011 [−0.015, +0.037] ; propre +0.008 [−0.021, +0.038] | propre −0.013 [−0.054, +0.027] |
| Noyau compilé contre référence en Python pur | 0 divergence | 0 sur 30,000 (ETH, BTC, 1000PEPE) | même code |
Le brassage permute des barres d'une minute entières en tant que formes relatives (de l'ouverture au plus haut, au plus bas et à la clôture) à l'intérieur de chaque mois civil, puis les enchaîne depuis la première ouverture de la série de sorte que chaque barre ouvre à la clôture brassée précédente ; les niveaux, A, les strates et les résultats sont recalculés avec un code inchangé.
La puissance est faible pour le placebo d'ancrage : sa demi-largeur d'environ 2.6 points dépasse l'effet enregistré, de sorte qu'il ne peut écarter que des effets d'ancrage horaire supérieurs à environ 3.7 points.
Résultats par test
| Test | Δ | Intervalle à 95% | Événements visibles entrants / résolus | Étiquette |
|---|---|---|---|---|
| Enregistré, corrigé au tick | −0.0199 | −0.0366 à −0.0053 | 18,689 / 37,355 | enregistré : "réel mais non significatif" |
| Enregistré, intervalle à deux étages | −0.0199 | −0.0399 à −0.0026 | idem | n/a |
| Enregistré, à la minute | −0.0190 | −0.0371 à −0.0034 | 18,511 | n/a |
| Contrôle propre, Binance | −0.0511 | −0.0673 à −0.0362 | 35,707 / 37,551 | continuation significative |
| Contrôle propre, OKX | −0.0436 | −0.0625 à −0.0267 | 22,717 / 24,841 | continuation significative |
Les étiquettes du contrôle propre suivent le tableau fondé sur les intervalles de l'addendum : significatif signifie que l'intervalle se situe sous zéro et que l'estimation ponctuelle atteint ou dépasse −0.02.
| Variante | Binance | OKX |
|---|---|---|
| Strates enregistrées | −0.041 (−0.061 à −0.022) | −0.034 (−0.059 à −0.012) |
| Strates principales plus âge du niveau | −0.031 (−0.048 à −0.017) | −0.037 (−0.055 à −0.022) |
| Sans strates de temps | −0.046 (−0.060 à −0.032) | −0.035 (−0.052 à −0.020) |
| Non stratifié | −0.046 (−0.059 à −0.032) | −0.034 (−0.050 à −0.020) |
| Événements visibles coïncidant avec des niveaux hebdomadaires écartés | −0.048 (−0.064 à −0.034) | −0.041 (−0.059 à −0.025) |
| I10 propre seulement | −0.045 (−0.062 à −0.029) | −0.035 (−0.055 à −0.016) |
| I13 propre seulement | −0.077 (−0.102 à −0.054) | −0.064 (−0.096 à −0.035) |
| L'extrême courant du jour comme contrôle | +0.001 (−0.013 à +0.013) | −0.009 (−0.026 à +0.007) |
| Protocole enregistré appliqué à OKX | n/a | −0.028 (−0.051 à −0.007) |
Variantes du contrôle propre, Δ avec son intervalle à 95%.
Exploratoire, après les résultats du contrôle propre. Les niveaux de contrôle propre touchés le jour de leur activation, à l'intérieur de la plage de la veille, donnent −0.049 (−0.065 à −0.035) sur Binance et −0.052 (−0.074 à −0.034) sur OKX. Touchés le lendemain, en tant que cassure de l'extrême de la veille, les mêmes niveaux donnent −0.004 (−0.024 à +0.015) et −0.015 (−0.038 à +0.009).
Tests secondaires.
- Profil de décalage (à la minute, contrôle enregistré). −0.019 au niveau, −0.027 à 0.05 ATR, −0.020 à 0.1 ATR, −0.002 à 0.2, +0.005 à 0.3 et −0.010 à 0.5. Les décalages de 0.75 et 1.0 ATR ne sont pas rapportés, parce que moins de 2,000 événements visibles entrent dans ces estimations.
- Niveaux hebdomadaires. −0.039 (−0.060 à −0.019).
- Chiffres ronds. −0.029 (−0.034 à −0.024) sur 80,987 contacts ronds et 82,121 contacts de contrôle ; la grille de contrôle se retourne à 0.517. Les résultats hebdomadaires comme ceux des chiffres ronds rejettent sous Holm.
- Hétérogénéité. Chaque époque, chaque côté, chaque tercile de liquidité et chaque bloc d'heure de contact est négatif, de −0.002 à −0.028.
Règles de trading, coûts et funding
Deux règles tournent sur chaque contact de l'échantillon principal, un trade par niveau et par règle :
- Fade de sweep. Dans les 60 barres suivant le contact, la première barre qui referme à l'intérieur alors que l'excursion la plus profonde reste dans 0.3·A. L'entrée se fait à l'ouverture suivante, le stop se place 0.05·A au-delà de l'excursion et l'objectif au double du risque.
- Breakout. La première clôture à au moins 0.1·A au travers du niveau dans les 60 barres, avec entrée à l'ouverture suivante, stop à L + 0.05·A et objectif au double du risque.
Les sorties lisent l'OHLC complet à la minute, le stop étant retenu lorsque stop et objectif tombent dans la même barre, un gap au travers de l'un ou de l'autre étant exécuté à l'ouverture, avec une sortie en temps 1,440 minutes après l'entrée. La variante walk-forward choisit parmi neuf configurations sur 12 mois et teste les 3 suivants, en avançant d'un trimestre à la fois depuis le T1 2021 ; l'entraînement utilise l'heure d'entrée sans purge, ce qui laisse 729 trades sur 1,059,975 sortir à l'intérieur du trimestre de test suivant.
gross = direction * (exit / entry - 1) fee = 2 * 5e-4 # taker, both fills slip = 2 * 0.75 * spread_month # half spread plus half again, per fill fund = -direction * sum(rate_k for settlement k in (entry, exit]) net = gross + fund - fee - slip
Le spread est le rebond médian entre transactions lors des changements d'agresseur, mesuré le 8 et le 22 de chaque contrat-mois avec jusqu'à trois reports vers l'avant. Sur les 3,751 contrats-mois, 2,123 ont été mesurés pour cette étude et 4 n'ont pas de fichier de transactions, le reste provenant d'une mesure antérieure avec le même estimateur, validée contre bookTicker sur BTCUSDT pour le 15 juillet 2023 à 0.0330 bp.
Les quatre tests sur les niveaux visibles forment une seule famille Benjamini-Hochberg, tous les quatre avec p unilatéral = 1.0, et le Sharpe déflaté des books walk-forward avec 9 essais est effectivement nul.
Les plans scellés
Trois documents ont été scellés par SHA-256. Ils sont disponibles sur demande à daniel@daru.finance.
| Document | SHA-256 | Scellé (UTC) |
|---|---|---|
| Pré-enregistrement (PREREG.md) | 51a8744e512bb0423f9d7f39f013d6c03186049fcab506b2427c795dc99dcc2f | 2026-10-08 21:03:57 |
| Révision consignant chaque écart par rapport à lui (PREREG-v2.md) | 3694a506513d74a900a5f2b354ccae96b54fd70d2820fb520f6a93222d04889a | 2026-10-09 02:37:03 |
| Plan du contrôle propre, d'OKX et du test en avant (ADDENDUM-A.md) | d5f046bb6f53183e583448a20aa6d1c48613e290101681016109476af0f726b1 | 2026-10-09 02:39:06 |
sha256sum PREREG.md PREREG-v2.md ADDENDUM-A.md
Le pré-enregistrement a été scellé avant tout calcul de résultat, tandis que la révision a été écrite après l'existence des résultats enregistrés et le dit dès sa première ligne. Le test à contrôle propre sur Binance a été enregistré après les résultats v1 ; la réplication OKX a été enregistrée avant tout calcul de niveau ou de résultat sur OKX.
Verdict enregistré, mot pour mot : "Réel mais non significatif." Le modèle de réponse enregistré qui l'accompagne, "Mesurable, trop petit pour déplacer un stop", est retiré dans la révision parce que l'intervalle s'étend jusqu'à −0.037, au-delà du seuil de matérialité de 0.02.
Ligne de réponse produite par la règle scellée de l'addendum : "Non : ils cassent plus souvent, d'environ 4 points". Ses conditions sont toutes réunies : tous les intervalles sont sous zéro et les deux tests à contrôle propre sont significatifs, avec N le plancher de la plus petite estimation, 4.36.
Ligne de réponse affichée avec la note : "Non : ils cassent au moins aussi souvent que les autres niveaux". Elle n'affirme que ce que chaque spécification soutient, puisque le découpage exploratoire montre que la taille de 4 points tient face aux niveaux non tracés situés à l'intérieur de la plage de la veille et disparaît largement face aux niveaux non tracés dont le contact casse aussi un extrême récent.
Écarts par rapport au pré-enregistrement
La révision consigne chacun d'eux avec son empreinte.
- Construction du brassage. Le texte scellé réenchaîne chaque mois à partir de la première ouverture d'origine de ce mois, ce qui place un saut de prix à 00:00 UTC le premier de chaque mois, parce qu'un mois brassé ne finit jamais exactement là où commence le mois réel suivant. Les niveaux encore actifs de la veille sont touchés par cette barre de saut, 54,391 fois sur 20 graines avec retournement dans 2% à 3% des cas, de sorte que le test de brassage tel que scellé a renvoyé +0.0323 et a échoué, et que sous la lettre du texte scellé le test enregistré est "non crédité : méthode". Enchaîner le chemin brassé de façon continue d'un mois à l'autre supprime le saut, après quoi le test renvoie +0.0015 ; chaque résultat de la note utilise la construction continue.
- Précision des chiffres ronds. Les niveaux ronds et de contrôle ont d'abord été comparés en précision 64 bits à des extrêmes de barre en 32 bits, ce qui écarte certaines impressions exactes au niveau. En précision 32 bits, l'estimation passe de −0.0331 à −0.0292, et la décision de Holm reste inchangée.
- La règle de l'échantillon trop petit. Exigeant 20,000 événements visibles résolus, la règle est appliquée aux événements résolus avant le filtre de strates : 37,355 visibles et 50,662 de contrôle. Comptés après le filtre, 18,689 événements visibles entrent dans l'estimation, et sous cette lecture le test enregistré serait "trop petit pour juger".
- Lectures d'implémentation. La liste des indices, le premier true range, les points de coupure, l'époque, la tolérance au tick, la coïncidence pour les niveaux hebdomadaires et ronds, la portée de la correction au tick et la barre d'entrée des règles de trading sont inscrits dans la révision. Certains ont été consignés après la course, avec des horaires tirés des horodatages de fichiers.
- Moment de la vérification du noyau. La comparaison du noyau compilé avec une référence en Python pur a été exécutée après la course complète plutôt qu'avant comme prévu, avec 0 divergence.
- Ajouts et retraits dans le compte rendu. L'intervalle à deux étages est ajouté. Le découpage par mark price, lu comme stops contre liquidations, est retiré parce que les contacts vus seulement sur le dernier prix sont par construction des mèches peu profondes, de sorte que le découpage mesure la profondeur de pénétration. Les décalages au-delà de 0.5 ATR ne sont pas rapportés.
- Une analyse exploratoire. Le découpage du contrôle propre par jour de contact a été fait après les résultats du contrôle propre et porte la mention exploratoire partout où il apparaît.
Test en avant
Défini dans l'addendum et pas encore exécuté. Il couvre les niveaux Binance et OKX activés à partir du 19 septembre 2026, avec l'estimateur à contrôle propre, la place ajoutée comme strate et la même table de décision.
Il tourne à la première fin de mois comptant au moins 30,000 événements visibles résolus, places confondues. Il s'en accumule environ 10,700 par an, ce qui situe l'échéance vers 2029 ; si le seuil n'est pas atteint au 31 décembre 2029, le test tourne à cette date avec la mention sous-puissant.
Limites
- Extrêmes de plage. La visibilité et le statut d'extrême de plage ne sont pas séparés par ce protocole.
- Frontières de journée. 00:00 UTC est aussi une heure de funding chez Binance, et les chandeliers par défaut d'OKX utilisent UTC+8.
- OKX n'est pas un historique indépendant. Ses prix évoluent de concert avec ceux de Binance sur les mêmes sous-jacents, de sorte que la réplication n'est pas un historique de prix indépendant.
- Ordres non observés. Les stops et les liquidations ne sont jamais observés.
- Univers. Il compte moins de 50 contrats en 2020 et inclut 25 contrats-mois non crypto.
- Coïncidence aux bords de l'univers. Les niveaux du premier ou du dernier jour du passage d'un contrat dans l'univers ne sont vérifiés que contre des niveaux construits pour des jours d'univers, ce qui touche moins de 2% des événements.
- Cellules de tick peu fournies. Les cellules de tick A1 et A4 reposent sur 5 à 17 événements chacune.
Demander le pipeline complet
Les figures de la note sont tracées à partir de la table de résultats publiée de l'étude. Les journaux trade par trade, les tables d'événements et le pipeline complet ne sont pas distribués depuis cette page ; pour les demander, écrivez à daniel@daru.finance.

