Cztery liczby, wszystkie zmierzone na naszym własnym stacku paper tradingu, jedna strategia, 1-minutowe sygnały na perpetualu BTCUSDT, 31 dni i 1,418 zleceń. Mediana czasu od zamknięcia bara do potwierdzenia zlecenia przez giełdę: 195 ms. 99. percentyl: 2,970 ms. Mediana na 1% minut o najwyższej zrealizowanej zmienności: 840 ms. I stała latencji, która przez większość poprzedniego roku siedziała w konfiguracji backtestu: 0.
Trzy z tych liczb są nudne. Wszyscy wiedzą, że zero jest złe, wszyscy w końcu zastępują je czymś, a to coś prawie zawsze jest stałą, którą ktoś wziął na czuja. 100 ms, 250 ms, „bądźmy konserwatywni, 500.” Liczba, która naprawdę się liczy, to 840, bo mówi, że twoja latencja jest funkcją stanu rynku, a stany rynku, w których ta latencja wystrzeliwuje, to te same stany, w których twój sygnał uważa, że coś znalazł.
Gdzie się podziewa 195 milisekund
Oto pełny budżet, zmierzony etap po etapie ze znacznikami czasu z zegara monotonicznego zapisywanymi na każdym hopie. Maszyna to instancja AWS w ap-northeast-1, w tym samym regionie co endpointy giełdy, co jest mniej więcej tyle, ile da się wycisnąć z nieskolokowanego setupu o profilu detalicznym.
| Etap | p50 | p95 | p99 |
|---|---|---|---|
| Zamknięcie bara → odebranie zdarzenia WS kline-closed | 128 ms | 402 ms | 1,940 ms |
| Parsowanie + aktualizacja stanu cech | 3 ms | 9 ms | 28 ms |
| Decyzja: ewaluacja modelu + kontrole ryzyka | 11 ms | 22 ms | 60 ms |
| Wysłanie zlecenia → ack giełdy | 47 ms | 180 ms | 1,100 ms |
| End-to-end (zmierzone, nie zsumowane) | 195 ms | 690 ms | 2,970 ms |
Dwie rzeczy warte uwagi, zanim przejdziemy do ciekawej części. Po pierwsze, mediany się nie sumują: 128 + 3 + 11 + 47 = 189, a zmierzona mediana end-to-end wynosi 195. Percentyle nie są addytywne, a jeśli oszacujesz latencję, sumując p99 poszczególnych etapów, dostaniesz 3,128 ms, podczas gdy prawdziwe p99 to 2,970. Tutaj wystarczająco blisko, kompletnie źle, gdy etapy są skorelowane w drugą stronę. Mierz całą ścieżkę.
Po drugie, spójrz na górny wiersz. Dwie trzecie budżetu mediany idzie na czekanie, aż giełda powie ci, że bar się zamknął. Nie sieć, nie twój kod, nie routing zleceń. Giełda agreguje transakcje w kline, stwierdza, że minuta się skończyła, i pushuje. Ten push ma przed sobą kolejkę, a kolejka jest współdzielona ze wszystkimi innymi subskrybentami tego strumienia.
Te 840
Wrzuć każde z tych 1,418 zleceń do kubełka według zrealizowanej zmienności minuty, która wygenerowała sygnał, a rozkład się rozjeżdża.
| Kubełek zmienności bara sygnału | Zlecenia | p50 end-to-end | p99 end-to-end |
|---|---|---|---|
| Dolny kwartyl | 201 | 141 ms | 488 ms |
| Środkowe dwa kwartyle | 796 | 183 ms | 1,210 ms |
| Górny kwartyl | 407 | 312 ms | 2,880 ms |
| Top 1% wszystkich minut | 14 | 840 ms | 4,100 ms |
Każdy etap degraduje się razem z pozostałymi, dlatego efekt się kumuluje. Kolejka agregacji i broadcastu giełdy jest zasilana obciążeniem matching engine, więc minuta z 11,000 transakcji wypycha później niż minuta z 600. Twój własny proces w tym samym oknie obsługuje więcej aktualizacji depthu i więcej printów transakcji, więc aktualizacja cech, która zwykle zajmuje 3 ms, zajmuje 28. Ścieżka REST zleceń konkuruje z paniką wszystkich innych i zaczynasz widzieć okazjonalne 503-i-retry, które same w sobie kosztują pełną sekundę. Współczynnik korelacji między liczbą transakcji w barze sygnału a latencją end-to-end w naszej próbce wyniósł 0.41. Nie ogromny. Wystarczający, by zrujnować stałą.
A strategie, które przechodzą wstępny screening, to przytłaczająco te, które handlują wybicami, odwróceniami, dyslokacjami, kaskadami likwidacji. Odpalają się dokładnie w tym kubełku, w którym latencja jest najgorsza. Sygnał momentum, który odpala się tylko wtedy, gdy minuta ruszyła się o 40 bps, to sygnał, który strukturalnie ustawił się tak, by zawsze być obsługiwanym przez najwolniejszą wersję twojego stacku.
Kiedyś spędziliśmy dzień na tropieniu outliera 3.6-sekundowego, który pojawiał się mniej więcej o tej samej porze co noc. To był logrotate, copy-truncating pliku 2 GB na tym samym wolumenie EBS, na który proces zapisywał, co wstrzymywało pętlę zdarzeń. Rynek był niewinny. Najpierw mierz, potem obwiniaj mikrostrukturę.
Co to robi z fillem
Cena dryfuje, podczas gdy czekasz. W losowej minucie średni niekorzystny ruch w ciągu naszych 195 ms mediany wynosił około 1.1 bps przeciwko kierunkowi sygnału. W minutach górnego kwartyla przy 312 ms, 5.8 bps. W minutach top-1% przy 840 ms, mniej więcej 14 bps niekorzystnego dryfu, zanim zlecenie w ogóle dotrze do księgi.
Na perpetualach BTC spread prawie w tym nie uczestniczy: jeden tick na kwotowaniu 84,000 to 0.012 bps, więc szkoda to niekorzystny dryf, a nie koszt przecięcia. Przenieś tę samą strategię na perp mid-cap i drugi składnik się budzi — spread na topie księgi w naszej próbce rósł z 1.4 bps w spokojnych minutach do 6.2 bps w górnym kwartylu, a głębokość na tym poziomie ścieńczała się o więcej niż połowę. Płacisz dryf i szerszy spread i gorszy depth, wszystko naraz, wszystko dlatego, że mają wspólną przyczynę.
Gdy odtworzyliśmy te same 31 dni z warunkową latencją per bar zamiast stałych 200 ms, średnia cena wejścia w backteście pogorszyła się o 3.1 bps, niemal w całości w 9% transakcji. Rozjazd ceny wejścia backtest-versus-paper spadł z 4.2 bps do 0.9 bps. Sharpe in-sample na tej strategii spadł z 1.7 do 1.1, i to jest uczciwa liczba, i zawsze nią była.
Więc co tak naprawdę wpisać w konfigurację
Nie skalar. To, na czym jedziemy teraz:
- Próbkuj, nie ustawiaj. Losuj latencję dla każdego symulowanego zlecenia z empirycznego rozkładu uwarunkowanego własną aktywnością tego bara — liczba transakcji i bezwzględny zwrot wystarczą, a oba już są w standardowym kline. Dopasuj raz na giełdę na typ zlecenia, dopasowuj ponownie co miesiąc.
- Zachowaj ogon. Nie dopasowuj rozkładu lognormalnego i nie zamykaj tematu; p99 żyje w burzach retry i pauzach GC, których żaden gładki rozkład nie odtwarza. Używamy empirycznych kwantyli z ogonem z resamplingiem powyżej p95.
- Latencja dotyczy też canceli. Wymiana zlecenia stop albo cancel hedge'a podlega temu samemu opóźnieniu, a na szybkim rynku twój cancel ściga się z fillem. Jeśli twój symulator anuluje natychmiast, model ryzyka to fikcja.
- Dodaj strażnika nieaktualności i zasymuluj go. Nasz odrzuca każdy sygnał, którego bar ma w momencie przybycia więcej niż 1.5 sekundy. To prawdziwe zachowanie z prawdziwym kosztem — po cichu usuwa transakcje i musi usuwać te same w backteście.
- Rekalibruj względem paperu. Paper trading to miejsce, w którym dostajesz ground truth. Loguj cztery znaczniki czasu hopów na każdym zleceniu i co tydzień porównuj rozkłady z tym, co założył symulator.
Inne klasy aktywów, ta sama choroba. Akcje amerykańskie: skonsolidowana taśma dokłada własne opóźnienie agregacji na wierzch opóźnienia brokera i rozszerza się pod presją tempa komunikatów z tego samego strukturalnego powodu. Rynki predykcyjne: składanie zleceń wyłącznie przez REST na większości giełd, a my zmierzyliśmy mediany sub-100 ms, które idą w wiele sekund, gdy uderza zdarzenie rozstrzygnięcia i wszyscy wchodzą jednocześnie. Opcje krypto: kwotowanie, od którego wyceniasz, może być spóźnione o dwie sekundy dokładnie w minucie, w której underlying się ruszył.
Ogólna postać błędu to traktowanie parametru egzekucji jako niezależnej stałej, podczas gdy jest on funkcją tej samej zmiennej stanu, która napędza twój sygnał. Prowizje się zachowują; funding się zachowuje; latencja nie. Jeśli z tego wszystkiego masz nosić w głowie jedną liczbę, noś stosunek: nasze p99 jest piętnastokrotnie większe od mediany, a nasz sygnał przychodzi nieproporcjonalnie blisko końca p99.
Opomiaruj cztery hopy. To jedno popołudnie roboty i powie ci o strategii więcej niż kolejny tydzień przeszukiwania parametrów.
← Wszystkie wpisy


