15. november 2026 · forskning

Hvordan backtester du kryptovolum når wash-handler blåser opp tapen?

Hvordan backtester du kryptovolum når wash-handler blåser opp tapen?

Mandag gjorde vi det ansvarlige. Agenten hadde en momentumstrategi på en mid-cap USDT-M-perpetual, med klipp på 25,000 USDT per handel, og den første backtesten uten volumfilter fylte hvert signal som om boken var BTC. Så vi la til den klassiske porten: tjue ett-minuttsbarer med dollarvolum måtte overstige tjue ganger klippet før en ordre fikk gå ut. Tjue minutter, en halv million dollar i tape. Coinen printet om lag $40 million på en travel dag. Filteret beholdt de fleste signalene. Equity-kurven ble mindre hakkete. Vi sendte den til paper.

Elleve timer senere spiste et 25,000 USDT-kjøp 8,400 av bid og stoppet. Tjuebars-volumet på det minuttet var $1.14 million. Filteret hadde sagt ja.

34%av rapportert tape flyttet aldri et boknivå
11 hrspaper før det første fastkjørte klippet
20×klipp-til-volum-regel som likevel sa ja

Mandag: filteret som fikk oss til å føle oss ærlige

Agentens merknad på pull requesten var «kapasitetssjekk lagt til, 20× notional.» Jeg godkjente den. Jeg har godkjent den setningen før. Det er den typen regel du skriver etter at noen viser deg en backtest som handlet en $4,000-OI-coin i $50,000-klipp, og alle i rommet grimaserer, og du legger til en volummultippel slik at det ikke kan skje igjen.

Mandag gjorde regelen det den alltid gjør i en backtest. Den kuttet de døde timene. Den beholdt timene der børsens eget volumnnummer så bråkete ut. Omsetningen falt med om lag en tredjedel. Gjennomsnittlig handelsstørrelse ble værende 25,000 fordi fill-modellen er en feiging: den tar hele klippet til last pluss noen få bps når porten er åpen. Ingen spurte boken om 25,000 faktisk lå der.

Jeg rykker fortsatt til når 24h-volumet på en coin er et rundt tall ved siden av tynn open interest. Det er etterslep fra 2021, da Discord-«market making»-boter var to underkontoer som handlet med hverandre og limte inn volum-skjermbildet i #brag. Tapen ser ut som en fest. Boken er papp. Jeg sa til meg selv at et 20×-filter på ett-minuttsbarer var slik du vokser fra det. Det er det ikke. Det er slik du glatter pappen ut til et jevnere tall.

Tirsdag: paper, så en rest

Paper startet snilt. De første fem klippene ble fylt på to til fire hopp nedover ask. Stygt, men gjort. Så 14:07 UTC, et long-signal, 25,000 USDT, topp av boken 1,100, neste nivå 2,400, så luft. Vi fikk 8,400 fylt som taker og 16,600 restende. Førti sekunder senere ble resten kansellert på vår egen time-in-force. Strategien trodde den var long et fullt klipp. Kontoen var long en tredjedel av ett.

Men filteret hadde sagt ja. Jeg hentet baren. Dollarvolumet i de tjue minuttene frem til 14:07 var $1.14 million, godt over $500k. Om lag $380k av de $1.14 million var par av printer: samme pris, samme størrelse, motsatte aggressor-flagg, to til åtte millisekunder fra hverandre, og bid/ask-størrelsen på den prisen rørte seg ikke. De handlene betalte gebyrer til hverandre. De tilbød oss ikke et 25,000 USDT-hull.

Onsdag: matching av tapen mot boken

Onsdag var den trege dagen, den jeg neste gang ville sette av dobbelt så lang tid til. Vi tok fem ukedager med handler og L2-snapshots på samme perp, 100ms bokbilder, og klassifiserte hver print mot boken ett snapshot før og ett snapshot etter.

  1. Hvis størrelsen på handelsprisen falt med om lag handelsstørrelsen, rørte den boken. Ta den med.
  2. Hvis et kjøp og et salg av lik størrelse printet på én pris uten bokendring, kall det wash og dropp det fra ethvert kapasitetstall.
  3. Hvis en handel gikk gjennom flere nivåer og de nivåene forsvant, er det en ekte taker. Ta den med, og later ikke som om du også kan ta den likviditeten; noen har allerede gjort det.
  4. Hvis handelen er merket som en likvidasjon, er det ekte størrelse, og det er den siste størrelsen du vil bruke som bevis på at du kan klippe 25,000. Den tvungne ordren kappkjører med deg.

Snapshotene lyver litt. Alt som fylles og fylles på igjen innen 100ms ser ut som et spøkelse, og noen ekte market-makere cancel-replace så fort. Vi samplet noen minutter med 10ms-bøker senere, og wash-andelen flyttet seg et par poeng, ikke med en faktor på to. Jeg kan leve med et par poeng. Jeg kan ikke leve med å behandle børsens volum-ticker som en likviditetstelling.

AggTrades slår allerede sammen én taker som treffer flere makere på én pris. De slår ikke sammen to underkontoer som washe. Hvis den «rene» feeden din er aggregerte handler, har du fortsatt dette problemet. Du har det bare med færre rader.

Og 24h-volumet på ticker-APIet er den samme skitne summen, forsinket, og det er derfor research-agenter elsker det. Ett felt. Alltid til stede. Ser ut som en feature. Det er en markedsføringsstatistikk som tilfeldigvis ligger i market-data-protobufen.

Hvis et volumnnummer ikke kan avstemmes mot en endring i boken, hører det ikke hjemme i en kapasitetssjekk, en impact-modell eller et universfilter. 24h-tickeren er den verste kopien av det tallet, fordi det allerede er summert, avrundet og strippet for tid.

Torsdag: uken i én tabell

Fem sesjoner, samme klipp, samme 20×-regel, samme fill-modell i backtesten. Paper-fill-ratio er fylt notional over tiltenkt notional for ordrene vi faktisk sendte den sesjonen. Mandagens paper er blank fordi vi fortsatt var i backtesten.

SesjonBørstapeBokflyttendeWash-aktigLikv.-printerFilteret sa kjørPaper-fill
Man$38.4m$22.6m$13.5m$2.3m41 / 48 signalern/a
Tir$41.1m$24.2m$15.2m$1.7m36 / 400.61
Ons$29.6m$20.1m$8.1m$1.4m22 / 310.77
Tor$44.8m$25.6m$17.4m$1.8m39 / 440.54
Fre$33.2m$22.3m$9.4m$1.5m28 / 350.71

Wash-aktige printer utgjorde 34% av ukens tape. De var ikke jevnt fordelt. Torsdag, sesjonen det opprinnelige filteret likte best, var den skitneste. Det er feilmodusen jeg bryr meg om. Porten overdriver ikke bare likviditeten i gjennomsnitt. Den åpner seg videre på dagene wash-botene jobber, fordi det er da det rå tallet ser sunnest ut.

Vi kjørte backtesten på nytt med bare bokflyttende volum, samme 20×-multippel. Signalene falt fra 198 i uken til 121. Mange av de forkastede satt i de torsdagsaktige timene der tapen var bråkete og toppen av boken var 1,100 USDT. Den opprinnelige Sharpe brukte 198 fulle fills. Jeg kommer ikke til å sitere den nye som om det var et funn om strategien. Det er et funn om fill-modellen: når du slutter å innvilge 25,000 USDT til en pris boken ikke hadde, er en slump av «edgen» bare fullførte ordrer som ville vært rester.

Fredag: det vi faktisk ruller ut, og det jeg ville hoppet over

Porten vi beholdt er kjedelig. Rullerende bokflyttende notional, telt bare fra printer som tok størrelse av et nivå, må klare 20× klippet, og vi måler det på barene før beslutningsbaren slik at inneværende minutts wash ikke kan stemme. Likvidasjonsprinter får et eget tak: hvis mer enn en fjerdedel av det nylige bokflyttende volumet er likvidasjoner, står strategien over. Tvungen flyt er ekte størrelse som kappkjører med deg.

Impact fikk samme diett. Den gamle modellen utledet en Kyle-lambda fra børsvolum og klippet vårt. Gi den wash, og lambda går ned, fordi markedet ser dypt ut. Gi den bokflyttende volum, og det samme klippet er en mye større andel av det som faktisk endret boken. Paper-slippage på de neste sesjonene lå nærmere det styggere tallet. Nærmere, ikke identisk. Vi ser fortsatt ikke køen, og et 100ms-bilde går fortsatt glipp av noe ekte størrelse.

Det jeg ville hoppet over neste gang, er hele den første mandagen. Ikke start fra tickeren, ikke start fra 24h-volum, ikke la agenten putte rått dollarvolum i feature store og i porten som om det var to ideer. Det er én skitten serie, brukt to ganger. Bygg den bokkonsistente tapen først, selv om det betyr at du bruker to dager på research på én enkelt mid-cap før du har et univers. Et univers filtrert på wash er en liste over coins som er flinke til å se travle ut.

Det andre jeg ville hoppet over: enhver fill-modell som behandler en bestått volumsjekk som en fill. Tirsdagens rest var strategien. Filteret kan bare svare «har noen handlet.» Det kan ikke svare «vil dine 25,000 ligge eller forsvinne.» Det andre spørsmålet trenger boken, en rest og en time-in-force, som er en annen dagbok, og den vi burde ha skrevet før denne.

wash tradingvolumkryptobacktestingmarkedsmikrostruktur
← Alle innlegg