15 november 2026 · onderzoek

Hoe backtest je cryptovolume als wash trades de tape opblazen?

Hoe backtest je cryptovolume als wash trades de tape opblazen?

Maandag deden we wat je hoort te doen. De agent had een momentumstrategie op een mid-cap USDT-M perpetual, clips van 25,000 USDT per trade, en de eerste backtest zonder volumefilter vulde elk signaal alsof het boek BTC was. Dus zetten we de leerboekpoort erop: twintig 1-minuutbars dollarvolume moesten twintig keer de clip overschrijden voordat een order eruit mocht. Twintig minuten, een half miljoen dollar tape. De coin printte op een drukke dag ongeveer $40 miljoen. Het filter liet de meeste signalen door. De equitycurve werd minder grillig. We zetten het op paper.

Elf uur later at een buy van 25,000 USDT 8,400 van de bid op en bleef steken. Het twintig-bar-volume op die minuut was $1.14 miljoen. Het filter had ja gezegd.

34%van de gerapporteerde tape verplaatste nooit een book-level
11 uurpaper voordat de eerste clip vastliep
20×clip-tot-volume-regel die toch ja zei

Maandag: het filter dat ons eerlijk deed voelen

De notitie van de agent op de pull request was "capaciteitscheck toegevoegd, 20× notional." Ik keurde hem goed. Ik heb die zin eerder goedgekeurd. Het is het soort regel dat je schrijft nadat iemand je een backtest laat zien die een $4,000-OI-coin in clips van $50,000 tradete, en iedereen in de kamer een vies gezicht trekt, en je een volumemultiple toevoegt zodat het niet nog eens kan gebeuren.

Op maandag deed de regel wat hij in een backtest altijd doet. Hij gooide de dode uren eruit. Hij hield de uren waarin het eigen volumenummer van de exchange luid oogde. De turnover daalde met ongeveer een derde. De gemiddelde tradesize bleef 25,000 omdat het fill-model een lafaard is: hij pakt de hele clip op last-plus-een-paar-bps wanneer de poort openstaat. Niemand vroeg het boek of er daadwerkelijk 25,000 lag.

Ik huiver nog steeds als het 24h-volume van een coin een rond getal is naast dun open interest. Dat is restant uit 2021, toen Discord-"market making"-bots twee subaccounts waren die met elkaar tradeden en de volumescreenshot in #brag plakten. De tape ziet eruit als een feest. Het boek is karton. Ik vertelde mezelf dat een 20×-filter op 1-minuutbars was hoe je dat ontgroeit. Dat is het niet. Het is hoe je het karton wegmiddelt tot een gladder getal.

Dinsdag: paper, toen een restant

Paper begon vriendelijk. De eerste vijf clips vulden in 2–4 hops de ask af. Lelijk, maar klaar. Toen 14:07 UTC, een long-signaal, 25,000 USDT, top of book 1,100, volgende level 2,400, daarna lucht. We kregen 8,400 gevuld als taker en 16,600 rustend. Veertig seconden later werd het restant gecanceld op onze eigen time-in-force. De strategie dacht dat hij een volle clip long was. Het account was een derde van één long.

Maar het filter had ja gezegd. Ik pakte de bar erbij. Het dollarvolume in de twintig minuten tot en met 14:07 was $1.14 miljoen, ruim boven $500k. Grofweg $380k van die $1.14 miljoen waren paren prints: dezelfde prijs, dezelfde size, tegengestelde aggressor flags, 2–8 milliseconden uit elkaar, en de bid/ask-size op die prijs bewoog niet. Die trades betaalden fees aan elkaar. Ze boden ons geen gat van 25,000 USDT.

Woensdag: de tape matchen met het boek

Woensdag was de trage dag, die ik de volgende keer twee keer zo lang zou inplannen. We namen vijf weekdagen trades en L2-snapshots op dezelfde perp, 100ms-boekfoto's, en classificeerden elke print tegen het boek een snapshot ervoor en een snapshot erna.

  1. Als de size op de tradeprijs met ongeveer de tradesize daalde, raakte hij het boek. Tel hem.
  2. Als een buy en een sell van gelijke size op één prijs printten zonder boekverandering, noem het wash en gooi het uit elk capaciteitsgetal.
  3. Als een trade door meerdere levels liep en die levels verdwenen, is dat een echte taker. Tel hem, en doe niet alsof jij die liquiditeit ook nog kunt nemen; iemand deed dat al.
  4. Als de trade als liquidation is getagd, is het echte size, en het is de laatste size die je wilt gebruiken als bewijs dat jij 25,000 kunt clippen. De forced order racet tegen je.

De snapshots liegen een beetje. Alles wat binnen 100ms vult en aanvult ziet eruit als een ghost, en sommige echte market-makers doen een cancel-replace zo snel. Later namen we een steekproef van een paar minuten 10ms-boeken en het wash-aandeel schoof een paar punten, niet met een factor twee. Ik kan leven met een paar punten. Ik kan niet leven met het behandelen van de volume-ticker van de exchange als een liquiditeitstelling.

AggTrades vouwen al één taker in die meerdere makers op één prijs raakt. Ze vouwen niet twee subaccounts in die wassen. Als je "schone" feed aggregated trades is, heb je dit probleem nog steeds. Je hebt het alleen met minder rijen.

En het 24h-volume op de ticker-API is dezelfde vuile som, vertraagd, daarom houden research-agents ervan. Eén veld. Altijd aanwezig. Ziet eruit als een feature. Het is een marketingstatistiek die toevallig in de market-data-protobuf zit.

Als een volumenummer niet te herleiden is tot een verandering in het boek, hoort het niet thuis in een capaciteitscheck, een impactmodel of een universe-filter. De 24h-ticker is de slechtste kopie van dat getal, omdat het al is opgeteld, afgerond en van tijd ontdaan.

Donderdag: de week in één tabel

Vijf sessies, dezelfde clip, dezelfde 20×-regel, hetzelfde fill-model in de backtest. Paper-fill-ratio is gevulde notional over beoogde notional voor de orders die we die sessie daadwerkelijk verstuurden. Maandag-paper is leeg omdat we nog in de backtest zaten.

SessieExchange-tapeBoek-bewegendWash-achtigLiq.-printsFilter zei gaanPaper-fill
ma$38.4m$22.6m$13.5m$2.3m41 / 48 signalenn.v.t.
di$41.1m$24.2m$15.2m$1.7m36 / 400.61
wo$29.6m$20.1m$8.1m$1.4m22 / 310.77
do$44.8m$25.6m$17.4m$1.8m39 / 440.54
vr$33.2m$22.3m$9.4m$1.5m28 / 350.71

Wash-achtige prints waren 34% van de tape van de week. Ze waren niet gelijk verdeeld. Donderdag, de sessie die het originele filter het meest beviel, was het vuilst. Dat is de failure mode die me interesseert. De poort overschat liquiditeit niet alleen gemiddeld. Hij gaat wijder open op de dagen dat de wash-bots werken, omdat dat de dagen zijn waarop het ruwe getal het gezondst oogt.

We runden de backtest opnieuw met alleen boek-bewegend volume, dezelfde 20×-multiple. Signalen daalden van 198 in de week naar 121. Veel van de weggegooide zaten in die donderdag-achtige uren waarin de tape luid was en de top of book 1,100 USDT was. De originele Sharpe gebruikte 198 volle fills. Ik ga de nieuwe niet citeren alsof het een bevinding over de strategie was. Het is een bevinding over het fill-model: zodra je stopt met 25,000 USDT toekennen op een prijs die het boek niet had, is een stuk van de "edge" gewoon voltooide orders die remainders zouden zijn geweest.

Vrijdag: wat we daadwerkelijk shippen, en wat ik zou overslaan

De poort die we aanhielden is saai. Rollende boek-bewegende notional, alleen geteld van prints die size van een level afhaalden, moet 20× de clip halen, en we meten het op de bars vóór de beslissingsbar zodat de wash van de huidige minuut niet kan meestemmen. Liquidation-prints krijgen een aparte cap: als meer dan een kwart van het recente boek-bewegende volume liquidations is, blijft de strategie aan de kant. Forced flow is echte size die tegen je racet.

Impact kreeg hetzelfde dieet. Het oude model leidde een Kyle-lambda af uit exchange-volume en onze clip. Stop er wash in en lambda daalt, omdat de markt diep lijkt. Stop er boek-bewegend volume in en dezelfde clip is een veel groter aandeel van wat het boek daadwerkelijk veranderde. Paper-slippage op de volgende paar sessies zat dichter bij dat lelijkere getal. Dichterbij, niet identiek. We zien nog steeds geen queue, en een 100ms-foto mist nog steeds wat echte size.

Wat ik de volgende keer zou overslaan is de hele eerste maandag. Begin niet bij de ticker, begin niet bij 24h-volume, laat de agent niet rauw dollarvolume in de feature store én in de poort zetten alsof dat twee ideeën waren. Het is één vuile reeks, twee keer gebruikt. Bouw eerst de boek-consistente tape, zelfs als dat betekent dat je twee dagen research doet op één enkele mid-cap voordat je een universe hebt. Een universe gefilterd op wash is een lijst coins die er goed in zijn om druk te lijken.

De andere skip: elk fill-model dat een gehaalde volumecheck als een fill behandelt. Het restant van dinsdag wás de strategie. Het filter kan alleen antwoorden "heeft er iemand getraded." Het kan niet antwoorden "zal jouw 25,000 rusten of verdwijnen." Die tweede vraag heeft het boek nodig, een remainder en een time-in-force, en dat is een ander dagboek, en het dagboek dat we vóór dit hadden moeten schrijven.

wash tradingvolumecryptobacktestenmarktmicrostructuur
← Alle artikelen