3. november 2026 · eksekvering

Vi paper-handlede en basis-trade. Ét ben blev filled.

Vi paper-handlede en basis-trade. Ét ben blev filled.

Funktionen hed enter_pack. Det burde have været advarslen. En research-agent havde skrevet en BTC cash-and-carry: når perpetualen handlede mere end otte basispoint over spot, køb spot, short perpen, sid stille. Funding og basis ville klare resten. Backtesten fillede begge ben i samme millisekund, til mid, plus et tick af høflighed. Equity-kurven var en trappe. Ingen ville kalde den spændende. Det var salgsargumentet.

Vi promoverede den til paper en mandag.

Mandag: pakken, der altid blev filled

Det første signal landede kl. 11:17 UTC. Basis på skærmen var 9.4 bps, perp dyr. I backtesten returnerede enter_pack to fills og en residual på nul. I paper returnerede den et spot-fill på 0.40 BTC til ask og en hvilende short på perpen, der ikke handlede.

Spot havde betalt et 4 bp taker-gebyr og omkring et 1 bp spread. Den perp-pris, vi ville have, lå stadig på bogen, og så var den det ikke. Tyve sekunder senere var den viste basis 5 bps, fordi vi netop havde løftet spot. Fyrre sekunder senere blev perpen filled, efter bevægelsen. Vi var pakket. Vi var pakket til en basis, der ikke længere betalte for at komme ind og ud.

Backtesten ville have bogført "+9.4 bps carry, residual 0." Blotteren havde 4 bps i spot-taker-omkostning, en 40-sekunders uafdækket long og et entry-gap på omkring 5. Jeg havde et sample på én og alligevel for meget tillid til trappen.

Tirsdag: vi åbnede funktionen

enter_pack tog en liste af ben og en target mid. Den loopede, fillede hvert ben til mid * (1 ± slip) og skrev én porteføljerække. Der var intet andet tidsstempel. Der var ingen gren, hvor ben to ikke eksisterede. Unittesten assertede residual == 0.

Det er en test, der får dig til at føle dig voksen. Den fejler aldrig.

Vi brød pakken op i to ordrer med deres egen state: submitted, partial, filled, canceled. Incomplete blev et first-class-objekt. Det historiske replay havde stadig ikke en rigtig bog, så vi snydte. Forsink det andet fill med et træk fra mandagens ventetid (gennemsnit 26 sekunder, en hale jeg ikke brød mig om), og lad prisen drifte med det, spot gjorde i det vindue. Groft, men trappen fik hak før frokost: pakker, der gik ind til 3 bps, pakker, der aldrig blev pakker.

Onsdag: tre sekunder, så dump den

Hvis det andet ben ikke er på inden for tre sekunder, flatten det første. Vi burde have startet der. Det lyder konservativt, indtil du prissætter aborten. At flatten betyder, at du krydsede spot for at komme ind, og at du krydser den for at komme ud. To taker-gebyrer, to spreads, ingen carry, ingen funding. I det omskrevne replay var de aborts ikke sjældne. De klumpede sig på de bars, hvor basis så mest "ægte" ud, hvilket som regel er de bars, hvor noget allerede flyder gennem spot.

Onsdag aften havde vi sytten paper-signaler at strides med.

17paper-signaler på fire dage
7pakker med begge ben filled
18 bpssenere bevægelse imod en overskydende long
Backtest, mandag morgenPaper, onsdag
IndgangBegge ben til mid, ét tidsstempelSpot til ask; perp 5–40s senere, eller aldrig
ResidualAltid 0Uafdækket på 10 af 17 signaler
Gebyrer på en fungerende tradeTo takersTo takers, eller fire hvis vi aborterer
PnL-driverBasis + fundingDet, spot gjorde, mens vi ventede
En pakke er komplet, når begge ordrer er filled, ellers er det en retningsbestemt position, du ikke har dimensioneret til. Markér residualen mod den live bog, hele den tid den eksisterer. Hvis du ikke kan markere den, kan du ikke køre strategien.

En kollega har stadig en notebook, der behandler pakken som et noteret produkt, BTC_CARRY, med en fast 2 bp "eksekveringsskat." Jeg kunne lide den notebook. Den producerede den samme trappe, som agenten gjorde. En skat er et gennemsnit. Orphans er en fordeling. Gennemsnit bliver ikke kørt over i en tynd time; 0.40 BTC overskydende spot kan.

Torsdag: overskydende, så kaffe

Tre sekunder aborterede næsten alt, da vi også ventede i en kø. Vi løsnede paper til femten. Kl. 02:11 UTC torsdag blev spot filled, og perpen blev det ikke. Jeg var stadig i "den hviler, den lifter"-fasen af sorgen, da jeg gik hen for at lave kaffe.

02:11:08 filled BTCUSDT 0.40 buy
02:11:08 submitted BTCUSDT-PERP 0.40 sell, post-only
02:11:41 stadig aktiv
02:26:00 residual-mark −18.1 bps

BTC faldt 18 bps i et stille vindue. Residualen var hele traden. Funding, da den printede, krediterede en perp, vi ikke havde. Spot sad bare der og var long. Den oprindelige backtests overnight-forløb indeholdt aldrig en enbenet position, så den havde aldrig stillet det spørgsmål, vi stiller til alle andre bøger: hvad er den værste bar, dette overskydende kan printe, og hvor er stoppet for en position, vi ikke havde tænkt os at holde?

De syv fulde pakker var heller ikke helte. Da det andet ben printede, havde vores eget spot-lift allerede lagt pres på indekset, og entry-basis var 3–5 bps dårligere end det snapshot, der havde affyret signalet. Tærsklen på otte bps var et tal på en skærm.

Hvad vi ville springe over næste gang

Vi ville ikke shipe en multi-leg som en enkelt fill-funktion. Samme regel for en perp-spot-carry, en calendar eller den call vertical, en agent submitter som to limits og derefter fejrer, når begge "filler" til mid.

  1. Ordrestate per ben, inklusive partials. Behandl pakken som parent af to tickets.
  2. En max-orphan-timer, der faktisk fyrer, og en flatten-sti, der betaler to spreads på vejen ud.
  3. Mark-to-book på residualen, med et stop dimensioneret til det overskydende. Den pakkede netto er den forkerte notional.
  4. Ingen carry krediteret, ingen funding optjent, før begge ben er på. Incomplete er incomplete.
  5. Afvis mid-on-mid som default for noget, der har to tickets. Hvis du skal gætte, så gæt værre på det tynde ben og senere på det andet fill.

Og vi ville ikke lade test_pack_is_atomic komme ind i repoen. Atomic er en egenskab ved en matching engine, ikke en hjælpefunktion. BTC-spot og BTC-perpetual er to bøger, der nogle gange rimer. Paper er der, hvor de holder op med at rime, hvilket er den eneste grund til, at trappen nogensinde var interessant.

backtestingcash-and-carryeksekveringpaper tradingkrypto-futures
← Alle indlæg