Funkce se jmenovala enter_pack. To mělo být varování. Výzkumný agent napsal BTC cash-and-carry: když perpetual obchodoval víc než osm bazických bodů nad spotem, koupit spot, shortnout perp, sedět. Funding a báze udělají zbytek. Backtest vyplnil obě nohy ve stejné milisekundě, na midu, plus tick zdvořilosti. Křivka equity byla schodiště. Nikdo by to nenazval vzrušujícím. To byl ten prodejní tahák.
V pondělí jsme ho povýšili na paper.
Pondělí: balíček, který se vždycky vyplnil
První signál dorazil v 11:17 UTC. Báze na obrazovce byla 9.4 bps, perp dražší. V backtestu enter_pack vrátila dvě plnění a reziduum nula. Na paperu vrátila spot fill 0.40 BTC na asku a visící short na perpu, který se neobchodoval.
Spot zaplatil 4 bp taker fee a zhruba 1 bp spread. Cena perpu, kterou jsme chtěli, byla ještě v knize, a pak nebyla. O dvacet sekund později byla kótovaná báze 5 bps, protože jsme právě liftli spot. O čtyřicet sekund později se perp vyplnil, po pohybu. Byli jsme zabalení. Byli jsme zabalení na bázi, která už nezaplatila vstup ani výstup.
Backtest by zaúčtoval „+9.4 bps carry, reziduum 0.“ Blotter měl 4 bps spot taker nákladů, nezajištěný long na 40 sekund a vstupní mezeru kolem 5. Měl jsem vzorek o velikosti jedna, a přesto příliš důvěry ve schodiště.
Úterý: otevřeli jsme funkci
enter_pack brala seznam nohou a cílový mid. Cyklovala, každou nohu vyplnila na mid * (1 ± slip) a zapsala jeden řádek portfolia. Druhý timestamp neexistoval. Neexistovala větev, ve které by druhá noha neexistovala. Unit test assertoval residual == 0.
To je test, ze kterého se člověk cítí jako dospělý. Nikdy neselže.
Rozbili jsme balíček na dva pokyny s vlastním stavem: odesláno, částečné, vyplněno, zrušeno. Incomplete se stalo objektem první třídy. Historický replay pořád neměl skutečnou knihu, tak jsme podváděli. Druhý fill zpozdit náhodným tahem z pondělního čekání (průměr 26 sekund, ocas, který se mi nelíbil) a driftovat jeho cenu o to, co v tom okně udělal spot. Hrubé, ale schodiště dostalo zářezy ještě před obědem: balíčky, které vstoupily na 3 bps, balíčky, které se nikdy balíčky nestaly.
Středa: tři sekundy, pak to shodit
Pokud druhá noha není na místě do tří sekund, zavřít první. Tím jsme měli začít. Zní to konzervativně, dokud si neoceníte abort. Zavření znamená, že jste křížili spot na vstupu a křížíte ho na výstupu. Dva taker poplatky, dva spready, žádný carry, žádný funding. V přepsaném replayi ty aborty nebyly vzácné. Shlukovaly se na barech, kde báze vypadala nejvíc „skutečně“, což jsou obvykle bary, kudy už něco teče skrz spot.
Ve středu večer jsme měli sedmnáct paper signálů, o které se dalo přít.
| Backtest, pondělí ráno | Paper, do středy | |
|---|---|---|
| Vstup | Obě nohy na midu, jeden timestamp | Spot na asku; perp o 5–40s později, nebo nikdy |
| Reziduum | Vždy 0 | Nezajištěno u 10 z 17 signálů |
| Poplatky u živého obchodu | Dva takery | Dva takery, nebo čtyři při abortu |
| Co táhne PnL | Báze + funding | Cokoli, co spot udělal, zatímco jsme čekali |
Kolega pořád má notebook, který s balíčkem zachází jako s kótovaným produktem, BTC_CARRY, s paušální 2 bp „exekuční daní“. Ten notebook se mi líbil. Produkoval stejné schodiště jako agent. Daň je průměr. Sirotci jsou rozdělení. Průměry se v řídké hodině nepřejedou; 0.40 BTC zbylého spotu ano.
Čtvrtek: zbytek, pak káva
Tři sekundy abortovaly skoro všechno, jakmile jsme navíc čekali ve frontě. Paper jsme povolili na patnáct. Ve čtvrtek v 02:11 UTC se vyplnil spot a perp ne. Ještě jsem byl ve fázi truchlení „vysedí, liftne se“, když jsem šel uvařit kávu.
02:11:08 vyplněno BTCUSDT 0.40 nákup
02:11:08 odesláno BTCUSDT-PERP 0.40 prodej, post-only
02:11:41 stále aktivní
02:26:00 mark rezidua −18.1 bps
BTC spadl o 18 bps v tichém okně. Reziduum bylo celý obchod. Funding, když se vytiskl, připsal perp, který jsme neměli. Spot tam jen seděl a byl long. Overnight dráha původního backtestu nikdy neobsahovala jednonohou pozici, takže nikdy nepoložila otázku, kterou klademe každé jiné knize: jaký nejhorší bar může tenhle zbytek vytisknout a kde je stop pro pozici, kterou jsme držet nechtěli?
Sedm kompletních balíčků taky nebylo žádnými hrdiny. Než se vytiskla druhá noha, náš vlastní lift spotu už se opřel do indexu a vstupní báze byla o 3–5 bps horší než snapshot, který signál spustil. Práh osm bps byl údaj o obrazovce.
Co bychom příště vynechali
Nenasadili bychom multi-leg jako jedinou fill funkci. Stejné pravidlo pro perp-spot carry, kalendář nebo call vertical, který agent podá jako dva limity a pak slaví, když se oba „vyplní“ na midu.
- Stav pokynu po nohách, včetně partialů. Balíček berte jako rodiče dvou tiketů.
- Timer max-orphan, který se opravdu spustí, a flatten cesta, která na výstupu zaplatí dva spready.
- Mark-to-book na reziduu, se stopem sizovaným na zbytek. Zabalené netto je špatný notionál.
- Žádný carry se nepřičítá, žádný funding se nenačítá, dokud nejsou obě nohy na místě. Incomplete je incomplete.
- Odmítnout mid-on-mid jako default u čehokoli, co má dva tikety. Pokud musíte hádat, hádejte hůř na řídké noze a později u druhého fillu.
A test_pack_is_atomic bychom do repa nepustili. Atomic je vlastnost matching enginu, ne pomocné funkce. BTC spot a BTC perpetual jsou dvě knihy, které občas rýmují. Paper je místo, kde přestanou rýmovat, a to je jediný důvod, proč to schodiště kdy bylo zajímavé.



