13. září 2026 · exekuce

Jakou latenci přidat do backtestu? Změřili jsme každou svou milisekundu

Jakou latenci přidat do backtestu? Změřili jsme každou svou milisekundu

Čtyři čísla, všechna naměřená v naší vlastní paper tradingové infrastruktuře, pro jednu strategii, signály na 1minutovém perpetualu BTCUSDT, za 31 dní a 1,418 objednávek. Medián času od uzavření svíčky do potvrzení objednávky burzou: 195 ms. 99. percentil: 2,970 ms. Medián v 1 % minut s nejvyšší realizovanou volatilitou: 840 ms. A konstanta latence, která po většinu předchozího roku byla v konfiguraci backtestu: 0.

195 msmedián od uzavření svíčky po potvrzení objednávky
2,970 msp99, stejná cesta
840 msmedián v minutách s volatilitou v horním 1 %

Tři z těch čísel jsou nudná. Každý ví, že nula je špatně, každý ji nakonec něčím nahradí a tím něčím bývá téměř vždy konstanta, kterou někdo vybral od oka. 100 ms, 250 ms, „buďme raději opatrní, 500“. Číslo, na kterém skutečně záleží, je 840, protože ukazuje, že latence závisí na stavu trhu a že ve stavech trhu, kdy prudce roste, váš signál zároveň usoudí, že objevil příležitost.

Kam se těch 195 milisekund poděje

Tady je celý rozpočet, naměřený po jednotlivých fázích pomocí časových značek z monotónních hodin zaznamenaných při každém předání. Server běží jako instance AWS v ap-northeast-1, ve stejné oblasti jako koncové body burzy. Pro běžnou infrastrukturu bez kolokace je to zhruba to nejlepší, co lze zařídit.

Fáze p50 p95 p99
Uzavření svíčky → přijetí události WS kline-closed 128 ms 402 ms 1,940 ms
Parsování + aktualizace stavu příznaků 3 ms 9 ms 28 ms
Rozhodnutí: vyhodnocení modelu + kontroly rizik 11 ms 22 ms 60 ms
Odeslání objednávky → potvrzení burzou 47 ms 180 ms 1,100 ms
Od začátku do konce (naměřeno, nikoli sečteno) 195 ms 690 ms 2,970 ms

Než se dostaneme k zajímavé části, stojí za zmínku 2 věci. Zaprvé, mediány se nesčítají: 128 + 3 + 11 + 47 = 189, zatímco naměřený medián celého procesu je 195. Percentily nejsou aditivní a když odhad latence sestavíte sečtením p99 jednotlivých fází, dostanete 3,128 ms, přestože skutečné p99 je 2,970. Tady je to dost blízko, ale když jsou fáze korelované opačně, může být odhad úplně mimo. Měřte celou cestu.

Zadruhé, podívejte se na první řádek. Dvě třetiny mediánu připadá na čekání, až vám burza oznámí, že se svíčka uzavřela. Nejde o síť, váš kód ani směrování objednávky. Burza seskupuje obchody do kline, rozhodne, že minuta skončila, a odešle událost. Před tímto odesláním čeká zpráva ve frontě, kterou sdílí se všemi ostatními odběrateli daného streamu.

Těch 840

Rozdělte všech 1,418 objednávek podle realizované volatility minuty, která vytvořila signál, a rozdělení se úplně změní.

Pásmo volatility svíčky se signálem Objednávky p50 od začátku do konce p99 od začátku do konce
Dolní kvartil 201 141 ms 488 ms
Prostřední 2 kvartily 796 183 ms 1,210 ms
Horní kvartil 407 312 ms 2,880 ms
Horní 1 % všech minut 14 840 ms 4,100 ms

Všechny fáze se zhoršují současně, takže se dopad násobí. Zátěž párovacího enginu ovlivňuje frontu burzy pro agregaci a distribuci, takže minuta s 11,000 obchody se odešle později než minuta se 600. Váš proces ve stejném časovém okně zpracovává více aktualizací hloubky trhu a více záznamů obchodů, takže aktualizace příznaků, která obvykle trvá 3 ms, zabere 28. Cesta objednávek přes REST soupeří s panikou všech ostatních a občas se objeví chyba 503 a opakovaný pokus, které vám samy o sobě vezmou celou sekundu. Korelační koeficient mezi počtem obchodů v signální svíčce a latencí od začátku do konce byl v našem vzorku 0.41. Není nijak obrovský. Ale na znehodnocení konstanty stačí.

Strategie, které projdou prvotním sítem, jsou převážně ty, které obchodují průrazy, obraty, cenové dislokace a likvidační kaskády. Spouštějí se přesně v pásmu, kde je latence nejhorší. Momentum signál, který se aktivuje jen při pohybu ceny o 40 bps za minutu, je signál, který je ze své podstaty vždy obsloužen nejpomalejší verzí vaší infrastruktury.

Jednou jsme celý den pátrali po odlehlé hodnotě 3.6 sekundy, která se objevovala každý večer zhruba ve stejnou dobu. Příčinou byl logrotate, který kopíroval a zkracoval 2 GB soubor na stejném svazku EBS, na který proces zapisoval, a tím zablokoval event loop. Trh za to nemohl. Nejdřív měřte, pak obviňujte mikrostrukturu.

Jak to ovlivní plnění

Během čekání se cena posouvá. V náhodné minutě byl průměrný nepříznivý pohyb za náš medián 195 ms přibližně 1.1 bps proti směru signálu. V minutách horního kvartilu při 312 ms to bylo 5.8 bps. V minutách horního 1 % při 840 ms šlo o zhruba 14 bps nepříznivého pohybu, než se objednávka vůbec dostala do knihy.

U BTC perpetualů se spreadu tento problém téměř netýká: jeden tick při kotaci 84,000 odpovídá 0.012 bps, takže škodu způsobuje nepříznivý pohyb ceny, nikoli náklady na překročení spreadu. Přesuňte stejnou strategii na perpetual se střední kapitalizací a druhý faktor se projeví — spread na nejlepších cenách v našem vzorku vzrostl z 1.4 bps v klidných minutách na 6.2 bps v horním kvartilu a hloubka na těchto cenách klesla o více než polovinu. Platíte za pohyb ceny, širší spread i menší hloubku současně, protože mají společnou příčinu.

Když jsme stejných 31 dní přehráli s latencí podmíněnou jednotlivými svíčkami místo konstantních 200 ms, průměrná vstupní cena v backtestu se zhoršila o 3.1 bps, téměř výhradně u 9 % obchodů. Rozdíl vstupních cen mezi backtestem a paper tradingem klesl ze 4.2 bps na 0.9 bps. Sharpe strategie v IS kleslo z 1.7 na 1.1. To je poctivé číslo, které platilo od začátku.

Co tedy vlastně dát do konfigurace

Žádnou skalární hodnotu. Teď používáme toto:

  1. Vzorkujte, nenastavujte. Latenci pro každou simulovanou objednávku losujte z empirického rozdělení podmíněného aktivitou dané svíčky — počet obchodů a absolutní výnos stačí; obojí už obsahuje standardní kline. Model odhadněte jednou pro každou burzu a typ objednávky a aktualizujte ho měsíčně.
  2. Zachovejte chvost rozdělení. Nepřizpůsobujte lognormální rozdělení a nepovažujte práci za hotovou: p99 vzniká při bouři opakovaných pokusů a pauzách GC, které žádné hladké rozdělení nezachytí. Používáme empirické kvantily a nad p95 chvost převzorkujeme.
  3. Latence platí i pro rušení. Výměna stopu nebo zrušení hedgingové objednávky podléhá stejnému zpoždění a na rychlém trhu vaše zrušení soupeří s vyplněním. Pokud váš simulátor ruší okamžitě, váš model rizika si vymýšlí.
  4. Přidejte kontrolu zastaralosti a simulujte ji. Náš systém zahodí každý signál, jehož svíčka je při přijetí starší než 1.5 sekundy. Jde o skutečné chování se skutečnými náklady — tiše odstraňuje obchody a musí odstranit ty samé i v backtestu.
  5. Rekalibrujte podle paper tradingu. Paper trading vám poskytne skutečná data. U každé objednávky zaznamenávejte časové značky všech 4 předání a každý týden porovnávejte rozdělení se simulátorem.

Stejný problém se týká i jiných tříd aktiv. Americké akcie: konsolidovaný páskový záznam přidává vlastní zpoždění agregace k tomu, které přidává broker, a při vysokém toku zpráv se ze stejného strukturálního důvodu zpoždění prodlužuje. Predikční trhy: většina burz umožňuje zadávat objednávky pouze přes REST a naměřili jsme mediány pod 100 ms, které při události ovlivňující výsledek vzrostou na několik sekund, protože všichni dorazí současně. Krypto opce: kotace, podle které stanovujete cenu, může být v přesně té minutě, kdy se pohnul podklad, 2 sekundy stará.

Obecně jde o to, že parametr exekuce považujete za nezávislou konstantu, přestože závisí na stejné proměnné stavu trhu jako váš signál. Poplatky se chovají předvídatelně, funding také; latence ne. Pokud si z toho máte zapamatovat jedno číslo, zapamatujte si poměr: naše p99 je patnáctkrát vyšší než medián a náš signál přichází nepoměrně často blízko hodnot p99.

Změřte všechna 4 předání. Je to práce na jedno odpoledne a o vaší strategii vám řekne víc než další týden hledání parametrů.

latencebacktestingpaper tradingexekucekrypto futures
← Všechny články