Mandag gjorde vi det ansvarlige. Agenten havde en momentumstrategi på en mid-cap USDT-M perpetual, der klippede 25,000 USDT pr. handel, og det første backtest uden volumenfilter fyldte hvert signal, som om bogen var BTC. Så vi lagde den klassiske port ind: tyve 1-minuts bars med dollarvolumen skulle overstige tyve gange clippet, før en ordre kunne sendes ud. Tyve minutter, en halv million dollars tape. Mønten printede omkring $40 million på en travl dag. Filteret beholdt de fleste af signalerne. Equity-kurven blev mindre takket. Vi sendte den til paper.
Elleve timer senere spiste et 25,000 USDT-køb 8,400 af bid og stoppede. Den tyve-bars volumen på det minut var $1.14 million. Filteret havde sagt ja.
Mandag: filteret, der fik os til at føle os ærlige
Agentens note på pull requesten lød "kapacitetstjek tilføjet, 20× notional." Jeg godkendte den. Jeg har godkendt den sætning før. Det er den slags regel, man skriver, efter nogen viser dig et backtest, der handlede en $4,000-OI-mønt i $50,000 clips, og alle i rummet laver en grimasse, og man lægger et volumenmultiplum på, så det ikke kan ske igen.
Mandag gjorde reglen, hvad den altid gør i et backtest. Den droppede de døde timer. Den beholdt timerne, hvor børsens eget volumental så larmende ud. Omsætningen faldt med omkring en tredjedel. Gennemsnitlig handelsstørrelse blev ved 25,000, fordi fill-modellen er en kujon: den tager hele clippet til last-plus-et-par-bps, når porten er åben. Ingen spurgte bogen, om der faktisk sad 25,000.
Jeg farer stadig sammen, når en mønts 24h-volumen er et rundt tal ved siden af tynd open interest. Det er rester fra 2021, da Discord-"market making"-bots var to underkonti, der handlede med hinanden og pastedede volumen-screenshottet i #brag. Tapen ser ud som en fest. Bogen er pap. Jeg bildte mig ind, at et 20× filter på 1-minuts bars var måden at vokse fra det. Det er det ikke. Det er sådan, man gennemsnitter pappet til et glattere tal.
Tirsdag: paper, så en rest
Paper startede venligt. De første fem clips blev fyldt på 2–4 hop ned ad ask. Grimt, men overstået. Så 14:07 UTC, et long-signal, 25,000 USDT, top of book 1,100, næste niveau 2,400, så luft. Vi fik 8,400 fyldt som taker og 16,600 resting. Fyrre sekunder senere blev resten annulleret på vores egen time-in-force. Strategien troede, den var long et fuldt clip. Kontoen var long en tredjedel af ét.
Men filteret havde sagt ja. Jeg hentede barren. Dollarvolumen i de tyve minutter frem til 14:07 var $1.14 million, behageligt over $500k. Omkring $380k af de $1.14 million var par af prints: samme pris, samme size, modsatte aggressor-flags, 2–8 millisekunder fra hinanden, og bid/ask-size på den pris rørte sig ikke. De handler betalte gebyrer til hinanden. De tilbød os ikke et 25,000 USDT-hul.
Onsdag: at matche tapen til bogen
Onsdag var den langsomme dag, den jeg næste gang ville sætte dobbelt så lang tid af til. Vi tog fem hverdage med handler og L2-snapshots på samme perp, 100ms bogfotos, og klassificerede hvert print mod bogen et snapshot før og et snapshot efter.
- Hvis size på handelsprisen faldt med cirka handelsstørrelsen, rørte den bogen. Tæl den.
- Hvis et køb og et salg af samme size printede til én pris uden bogsændring, kald det wash og smid det ud af ethvert kapacitetstal.
- Hvis en handel gik gennem flere niveauer, og de niveauer forsvandt, er det en rigtig taker. Tæl den, og lad være med at lade som om du også kan tage den likviditet; nogen har allerede gjort det.
- Hvis handlen er tagget som en likvidation, er det rigtig size, og det er den sidste size, du vil bruge som bevis for, at du kan clippe 25,000. Den tvungne ordre kører om kap med dig.
Snapshottene lyver lidt. Alt, der fyldes og genopfyldes inden for 100ms, ser ud som et spøgelse, og nogle ægte market-makers cancel-replacer så hurtigt. Vi samplede senere et par minutter med 10ms-bøger, og wash-andelen flyttede sig et par point, ikke med en faktor to. Jeg kan leve med et par point. Jeg kan ikke leve med at behandle børsens volumen-ticker som en likviditetstælling.
AggTrades kollapser allerede én taker, der rammer flere makers til én pris. De kollapser ikke to underkonti, der washer. Hvis dit "rene" feed er aggregerede handler, har du stadig det her problem. Du har det bare med færre rækker.
Og 24h-volumen på ticker-API'en er den samme beskidte sum, forsinket, og det er derfor research-agenter elsker den. Ét felt. Altid til stede. Ligner en feature. Det er en marketingstatistik, der tilfældigvis ligger i market-data-protobuf'en.
Torsdag: ugen i én tabel
Fem sessioner, samme clip, samme 20×-regel, samme fill-model i backtestet. Paper fill-ratio er fyldt notional over tiltænkt notional for de ordrer, vi faktisk sendte den session. Mandags-paper er blank, fordi vi stadig var i backtestet.
| Session | Børstape | Bogflyttende | Wash-agtig | Liq.-prints | Filteret sagde kør | Paper-fill |
|---|---|---|---|---|---|---|
| Man | $38.4m | $22.6m | $13.5m | $2.3m | 41 / 48 signaler | n/a |
| Tir | $41.1m | $24.2m | $15.2m | $1.7m | 36 / 40 | 0.61 |
| Ons | $29.6m | $20.1m | $8.1m | $1.4m | 22 / 31 | 0.77 |
| Tor | $44.8m | $25.6m | $17.4m | $1.8m | 39 / 44 | 0.54 |
| Fre | $33.2m | $22.3m | $9.4m | $1.5m | 28 / 35 | 0.71 |
Wash-agtige prints var 34% af ugens tape. De var ikke jævnt fordelt. Torsdag, den session det oprindelige filter kunne lide mest, var den beskidteste. Det er den fejltilstand, jeg bekymrer mig om. Porten overvurderer ikke bare likviditet i gennemsnit. Den åbner sig bredere de dage, wash-botsene kører, fordi det er de dage, det rå tal ser sundest ud.
Vi kørte backtestet om med kun bogflyttende volumen, samme 20×-multiplum. Signalerne faldt fra 198 i ugen til 121. Mange af de kasserede sad i de der torsdagsagtige timer, hvor tapen var larmende, og top of book var 1,100 USDT. Den oprindelige Sharpe brugte 198 fulde fills. Jeg vil ikke citere den nye, som om det var et fund om strategien. Det er et fund om fill-modellen: når man holder op med at bevilge 25,000 USDT til en pris, bogen ikke havde, er en del af "edgen" bare gennemførte ordrer, der ville have været rester.
Fredag: det vi faktisk shipper, og det jeg ville springe over
Porten, vi beholdt, er kedelig. Rullende bogflyttende notional, talt kun fra prints, der tog size af et niveau, skal klare 20× clippet, og vi måler det på barsene før beslutningsbaren, så det aktuelle minuts wash ikke kan stemme. Likvidationsprints får et separat loft: hvis mere end en fjerdedel af den nylige bogflyttende volumen er likvidationer, står strategien af. Tvungen flow er rigtig size, der kører om kap med dig.
Impact fik den samme diæt. Den gamle model udledte en Kyle lambda fra børsvolumen og vores clip. Fodér den med wash, og lambda falder, fordi markedet ser dybt ud. Fodér den med bogflyttende volumen, og det samme clip er en langt større andel af det, der faktisk ændrede bogen. Paper-slippage på de næste par sessioner lå tættere på det grimmere tal. Tættere, ikke identisk. Vi ser stadig ikke queue, og et 100ms-foto misser stadig noget ægte size.
Det, jeg ville springe over næste gang, er hele den første mandag. Start ikke fra tickeren, start ikke fra 24h-volumen, lad ikke agenten putte rå dollarvolumen i feature store og i porten, som om det var to idéer. Det er én beskidt serie, brugt to gange. Byg den bogkonsistente tape først, selv om det betyder, at du researcher i to dage på en enkelt mid-cap, før du har et univers. Et univers filtreret på wash er en liste over mønter, der er gode til at se travle ud.
Det andet skip: enhver fill-model, der behandler et bestået volumentjek som et fill. Tirsdagens rest var strategien. Filteret kan kun svare "har nogen handlet." Det kan ikke svare "vil dine 25,000 ligge eller forsvinde." Det andet spørgsmål kræver bogen, en rest og en time-in-force, som er en anden dagbog, og den, vi burde have skrevet før denne.
← Alle indlæg


