W poniedziałek zrobiliśmy to, co należy. Agent miał strategię momentum na mid-cap perpetualu USDT-M, z clipem 25,000 USDT na transakcję, a pierwszy backtest bez filtra wolumenu realizował każdy sygnał tak, jakby arkusz był BTC. Więc dodaliśmy podręcznikową bramkę: dwadzieścia 1-minutowych barów wolumenu dolarowego musiało przekroczyć dwudziestokrotność clipu, zanim zlecenie mogło wyjść. Dwadzieścia minut, pół miliona dolarów taśmy. Coin drukował około $40 million w gorący dzień. Filtr przepuścił większość sygnałów. Krzywa kapitału stała się mniej poszarpana. Wysłaliśmy to na paper.
Jedenaście godzin później kupno na 25,000 USDT zjadło 8,400 bida i stanęło. Wolumen z dwudziestu barów w tej minucie wyniósł $1.14 million. Filtr powiedział tak.
Poniedziałek: filtr, który sprawił, że czuliśmy się uczciwi
Notatka agenta przy pull requeście brzmiała „dodano kontrolę pojemności, nominał 20×.” Zatwierdziłem. Zatwierdzałem to zdanie już wcześniej. To taki rodzaj reguły, którą piszesz, gdy ktoś pokazuje ci backtest, który handlował coinem o OI $4,000 clipami po $50,000, a wszyscy w pokoju robią minę, i dodajesz mnożnik wolumenu, żeby to się nie powtórzyło.
W poniedziałek reguła zrobiła to, co zawsze robi w backteście. Wyrzuciła martwe godziny. Zostawiła godziny, w których własna liczba wolumenu giełdy wyglądała głośno. Obrót spadł o około jedną trzecią. Średni rozmiar transakcji został 25,000, bo model filli jest tchórzem: bierze cały clip po last-plus-kilka-bps, ilekroć bramka jest otwarta. Nikt nie zapytał arkusza, czy 25,000 faktycznie tam siedziało.
Nadal się wzdrygam, gdy 24h wolumen coina to okrągła liczba obok cienkiego open interest. To pozostałość z 2021, kiedy boty „market making” na Discordzie to były dwa subkonta handlujące ze sobą i wklejające screenshot wolumenu na #brag. Taśma wygląda jak impreza. Arkusz jest z tektury. Mówiłem sobie, że filtr 20× na 1-minutowych barach to sposób, żeby z tego wyrosnąć. Nie jest. To sposób, żeby uśrednić tekturę do gładszej liczby.
Wtorek: paper, potem resztka
Paper zaczął łagodnie. Pierwsze pięć clipów zeszło w 2–4 skokach w dół aska. Brzydko, ale zrobione. Potem 14:07 UTC, sygnał long, 25,000 USDT, szczyt arkusza 1,100, następny poziom 2,400, potem powietrze. Dostaliśmy 8,400 zrealizowanych jako taker i 16,600 resting. Czterdzieści sekund później reszta anulowała się na naszym własnym time-in-force. Strategia myślała, że jest long na pełny clip. Konto było long na jedną trzecią jednego.
Ale filtr powiedział tak. Ściągnąłem bar. Wolumen dolarowy w dwudziestu minutach do 14:07 wyniósł $1.14 million, spokojnie powyżej $500k. Mniej więcej $380k z tych $1.14 million to były pary printów: ta sama cena, ten sam rozmiar, przeciwne flagi agresora, 2–8 milisekund od siebie, a rozmiar bid/ask na tej cenie się nie ruszył. Te transakcje płaciły sobie nawzajem prowizje. Nie oferowały nam dziury na 25,000 USDT.
Środa: dopasowywanie taśmy do arkusza
Środa była wolnym dniem, tym, na który następnym razem zarezerwowałbym dwa razy tyle czasu. Wzięliśmy pięć dni roboczych transakcji i snapshotów L2 na tym samym perpetualu, zdjęcia arkusza co 100ms, i sklasyfikowaliśmy każdy print względem arkusza snapshot wcześniej i snapshot później.
- Jeśli rozmiar na cenie transakcji spadł o mniej więcej rozmiar transakcji, dotknął arkusza. Licz.
- Jeśli kupno i sprzedaż o równym rozmiarze wydrukowały się na jednej cenie bez zmiany arkusza, nazywaj to washem i wyrzuć z każdej liczby pojemności.
- Jeśli transakcja przeszła przez kilka poziomów i te poziomy zniknęły, to prawdziwy taker. Licz i nie udawaj, że ty też możesz wziąć tę płynność; ktoś już to zrobił.
- Jeśli transakcja jest otagowana jako likwidacja, to prawdziwy rozmiar i to ostatni rozmiar, którego chcesz użyć jako dowodu, że ty możesz clipnąć 25,000. Wymuszone zlecenie ściga się z tobą.
Snapshoty trochę kłamią. Wszystko, co wypełnia się i odnawia wewnątrz 100ms, wygląda jak duch, a niektórzy prawdziwi market-makerzy robią cancel-replace tak szybko. Próbkowaliśmy później kilka minut arkuszy 10ms i udział washa przesunął się o parę punktów, nie o czynnik dwóch. Mogę żyć z paroma punktami. Nie mogę żyć z traktowaniem tickera wolumenu giełdy jako spisu płynności.
AggTrades już scalają jednego takera trafiającego w kilku makerów na jednej cenie. Nie scalają dwóch subkont robiących wash. Jeśli twój „czysty” feed to zagregowane transakcje, nadal masz ten problem. Po prostu masz go z mniejszą liczbą wierszy.
A wolumen 24h na ticker API to ta sama brudna suma, opóźniona, dlatego agenci researchowi go kochają. Jedno pole. Zawsze obecne. Wygląda jak feature. To statystyka marketingowa, która akurat siedzi w protobufie market-data.
Czwartek: tydzień w jednej tabeli
Pięć sesji, ten sam clip, ta sama reguła 20×, ten sam model filli w backteście. Wskaźnik filli paper to zrealizowany nominał dzielony przez zamierzony nominał dla zleceń, które faktycznie wysłaliśmy tej sesji. Paper z poniedziałku jest pusty, bo jeszcze byliśmy w backteście.
| Sesja | Taśma giełdy | Ruszający arkusz | Washopodobne | Printy likw. | Filtr powiedział jedź | Fill paper |
|---|---|---|---|---|---|---|
| Pon | $38.4m | $22.6m | $13.5m | $2.3m | 41 / 48 sygnałów | n/a |
| Wt | $41.1m | $24.2m | $15.2m | $1.7m | 36 / 40 | 0.61 |
| Śr | $29.6m | $20.1m | $8.1m | $1.4m | 22 / 31 | 0.77 |
| Czw | $44.8m | $25.6m | $17.4m | $1.8m | 39 / 44 | 0.54 |
| Pt | $33.2m | $22.3m | $9.4m | $1.5m | 28 / 35 | 0.71 |
Printy washopodobne stanowiły 34% taśmy tygodnia. Nie były rozłożone równo. Czwartek, sesja, którą oryginalny filtr lubił najbardziej, był najbrudniejszy. To ten scenariusz porażki, na którym mi zależy. Bramka nie tylko zawyża płynność średnio. Otwiera się szerzej w dni, gdy boty washowe pracują, bo to wtedy surowa liczba wygląda najzdrowiej.
Odpaliliśmy backtest ponownie tylko z wolumenem ruszającym arkusz, ten sam mnożnik 20×. Sygnały spadły z 198 w tygodniu do 121. Sporo z odrzuconych siedziało w tych czwartkowych godzinach, gdzie taśma była głośna, a szczyt arkusza miał 1,100 USDT. Oryginalny Sharpe używał 198 pełnych filli. Nie będę cytował nowego, jakby to było odkrycie o strategii. To odkrycie o modelu filli: gdy przestajesz przyznawać 25,000 USDT po cenie, której arkusz nie miał, kawałek „przewagi” to po prostu dokończone zlecenia, które byłyby resztkami.
Piątek: co naprawdę wypuszczamy i co bym pominął
Bramka, którą zostawiliśmy, jest nudna. Kroczący nominał ruszający arkusz, liczony tylko z printów, które zdjęły rozmiar z poziomu, musi przebić 20× clipu, i mierzymy go na barach przed barem decyzji, żeby wash z bieżącej minuty nie mógł głosować. Printy likwidacyjne dostają osobny limit: jeśli więcej niż ćwierć niedawnego wolumenu ruszającego arkusz to likwidacje, strategia staje. Wymuszony przepływ to prawdziwy rozmiar ścigający się z tobą.
Impact dostał tę samą dietę. Stary model wyciągał lambdę Kyle'a z wolumenu giełdy i naszego clipu. Nakarm go washem i lambda spada, bo rynek wygląda na głęboki. Nakarm wolumenem ruszającym arkusz i ten sam clip to znacznie większy udział tego, co faktycznie zmieniło arkusz. Slippage paperu na kolejnych kilku sesjach siedział bliżej tej brzydszej liczby. Bliżej, nie identycznie. Nadal nie widzimy kolejki, a zdjęcie 100ms nadal gubi trochę prawdziwego rozmiaru.
Co bym pominął następnym razem, to cały pierwszy poniedziałek. Nie zaczynaj od tickera, nie zaczynaj od wolumenu 24h, nie pozwól agentowi wrzucić surowego wolumenu dolarowego do feature store i do bramki, jakby to były dwa pomysły. To jedna brudna seria, użyta dwa razy. Zbuduj najpierw taśmę spójną z arkuszem, nawet jeśli to znaczy, że robisz research dwa dni na jednym mid-capie, zanim masz uniwersum. Uniwersum filtrowane po washu to lista coinów, które dobrze udają zajętość.
Drugi skip: każdy model filli, który traktuje zdany test wolumenu jako fill. Wtorkowa resztka była strategią. Filtr potrafi odpowiedzieć tylko „czy ktoś handlował.” Nie potrafi odpowiedzieć „czy twoje 25,000 spocznie, czy zniknie.” To drugie pytanie potrzebuje arkusza, reszty i time-in-force, a to inny dziennik i ten, który powinniśmy byli napisać przed tym.
← Wszystkie wpisy


