27. srpna 2026 · datové inženýrství

Váš univerzum symbolů je stroj času: zkreslení přeživších v backtestech krypto perpetualů

Váš univerzum symbolů je stroj času: zkreslení přeživších v backtestech krypto perpetualů

Poslal jste mi notebook v neděli večer a od té doby ho mám otevřený na druhém monitoru. Průřezové momentum, 150 největších Binance USDⓈ-M perpetualů podle dolarového objemu za 30 dní, týdenní rebalancování, long horního decilu a short spodního, období 2021-01 až 2026-06. Sharpe 2.31, maximální propad 14.2 % a nákladový model, který mi připadal poctivý: taker při vstupu i výstupu, funding nabíhaný za každý interval, skluz úměrný vaší velikosti vůči objemu v knize. Těžké části jste udělal správně. Pak jste se zeptal, proč je šest týdnů paper tradingu bez výsledku a jestli se výhoda vytratila.

Nevytratila se. V backtestu tam nikdy nebyla. Podívejte se na buňku 4:

info = requests.get(BASE + "/fapi/v1/exchangeInfo").json()
symbols = [s["symbol"] for s in info["symbols"]
           if s["status"] == "TRADING" and s["quoteAsset"] == "USDT"]

Tento endpoint jste zavolal v červnu 2026 a výsledek použil k určení toho, co se dalo obchodovat v březnu 2021. Každý symbol v tom seznamu přežil až do června 2026, už ze samotné konstrukce seznamu. To je celá chyba a její dopad převyšuje souhrnný dopad zbytku vašeho nákladového modelu.

2.31 → 0.74Sharpe, seznam přeživších vs. stav k danému okamžiku
~1 z 5symbolů vašeho univerza z roku 2021 už neexistuje
380 KBdenní snímek exchangeInfo, komprimovaný gzipem

Co se z endpointu nedozvíte

exchangeInfo neobsahuje žádnou historii. Žádný parametr asOf, žádný archiv, žádný changelog. Je to snímek současného stavu a Binance nikdy neslíbila nic jiného. Když je kontrakt vyřazen, jeho záznam z odpovědi zmizí a z pohledu API přestane ticker existovat. Binance od roku 2019 zalistovala přes 600 perpetualů USDⓈ-M a více než stovku jich vyřadila. BTS, COCOS, TOMO, RAY, FTT, SC a dlouhý chvost kontraktů z altseason roku 2021, které měly jedno slavné čtvrtletí, pak postupně vyschly, až je burza stáhla.

Zamyslete se, které názvy si oblíbí momentum filtr za 30 dní. BTC to není. Zaujme ho něco, co právě ztrojnásobilo cenu díky růstu po zalistování a vlně na Twitteru. Tyto instrumenty se z velké části překrývají s těmi, které budou nakonec vyřazeny, a filtr univerza tento průnik odstranil.

Znovu jsem spustil vaši strategii nad naším archivem snímků, s univerzem platným k danému okamžiku, stejným signálem i náklady. Sharpe vyšel 0.74 a propad 31 %. Zhruba dvě pětiny rozdílu způsobují vyřazené symboly, které jste podle pravidel nikdy nemohl držet. Další čtvrtinu tvoří opačný problém, který je subtilnější a podle mě se vám bude líbit ještě méně.

Druhý konec stroje času: symboly, které tehdy ještě neexistovaly

Vaše vlastnost je výnos za 90 dní. Klouzavé okno má min_periods=20, protože jste ho jednou nastavil, aby zahřívací období nesmazalo první čtvrtletí vzorku, a už jste se k tomu nevrátil. Kontrakt zalistovaný před 21 dny tak dostane momentum skóre vypočtené ze tří týdnů cenového vývoje po zalistování, skončí v horním decilu zhruba pokaždé, když se zalistování vydařilo, a dostane se do vašeho portfolia.

Tahle část se dá obhájit. Tohle už ne: poskytovatel u některých symbolů doplnil historická data ze spotového trhu nebo indexu z doby před vznikem perpetualu, takže několik kontraktů má historii kline ještě před vlastním onboardDate. Ověřit to zvládnete asi za minutu. Propojte cenovou tabulku s daty zalistování a spočítejte řádky, které leží před zalistováním. Ve vašich datech má 41 symbolů svíčky z období před zalistováním a jeden z nich v létě 2023 přidává do křivky kapitálu týdenní zisk 6 % z pozice v kontraktu, který měl vzniknout až o dalších devět dní později.

Ticker není identifikátor. Je to označení, které burza pronajímá, někdy i dvakrát.

Tím se dostáváme k přejmenováním. MATICUSDT se změnil na POLUSDT. FTMUSDT se po konverzi 1:1 změnil na SUSDT. Situace kolem LUNA v květnu 2022 zanechala LUNCUSDT a později zcela novou LUNAUSDT, která sdílí kořen tickeru s něčím, co přišlo víceméně o všechno. Pokud loader používá jako klíč řetězec symbolu a spojuje nalezené soubory, máte v datech nejméně jednu řadu s nespojitostí, která není cenovým pohybem. Vaše momentum vlastnost pak tuto nespojitost vyhodnotí jako nejsilnější signál v průřezu.

Všechno ostatní, co se vám pod rukama mění

Jakmile připustíte, že se seznam symbolů v čase mění, stejná úvaha platí pro každé další pole v této odpovědi. Pro všechna používáte dnešní hodnoty.

PoleJak se měníCo se tím pokazí
statusTRADING → SETTLING → pryčZkreslení přeživších; zdánlivé výstupy za závěrečnou cenu, za kterou se nikdy neobchodovalo
onboardDateKaždý týden nové listingy; u zaniklých symbolů chybíObchodování s kontrakty ještě před jejich vznikem
tickSize / stepSizeUpravují se podle změny cenových hladinZaokrouhlování příkazů a limitní ceny, které by byly odmítnuty
minNotionalPostupně se zvyšuje u mělkých knihMalé pozice, které by váš živý router odmítl
fundingIntervalHoursPo léta 8h, pak u mnoha symbolů 4h nebo 1hCarry je mimo o 2–3× právě u altcoinů, které váš filtr drží
leverage bracketsPásma a udržovací marže se revidujíModelování likvidace a kapacita marže

Funding je ve vašem případě největší problém. Vaše akumulační smyčka předpokládá tři platby denně za celou historii. Významná část altcoinového portfolia přešla na funding každé čtyři hodiny a právě short pozice u symbolů s vysokým fundingem tvoří velkou část vašeho simulovaného PnL. Tady se nemýlíte o chybu zaokrouhlení. Mýlíte se o násobek.

Samotné vyřazení z burzy je událost a vy ji nemodelujete

Při opakovaném běhu s daty platnými k danému okamžiku jsem strategii dopřál velkorysý výstup. Skutečné vyřazení probíhá podle scénáře: oznámení, obvykle sedm až čtrnáct dní předem, pak období, kdy lze pouze snižovat pozice, a nakonec nucené vypořádání za mark price. Oznámení je veřejná informace a můžete na něj reagovat, takže poctivá simulace předpokládá výstup za závěrečnou cenu v den oznámení. Tato cena je ale u typického vyřazovaného altcoinu už o 10-20 % níž než předchozí týden, kniha je mělká a váš model skluzu musí počítat s odlišným režimem. Pokud vám exekuční engine přidělí vypořádací cenu bez dopadu na trh, nenápadně jste umožnil obchodovat s umírajícími aktivy za férovou cenu.

Pokud jste si exchangeInfo nikdy nearchivoval, ještě není vše ztraceno. Veřejný dump na adrese data.binance.vision/data/futures/um/monthly/klines/ stále uchovává adresáře vyřazených symbolů dlouho poté, co na ně API zapomene. Projděte výpis adresářů a první a poslední měsíční soubor každého symbolu vám poskytne použitelný interval zalistování a vyřazení, aniž byste potřeboval dodavatele dat. Je to rekonstrukce, ne záznam, a neobnoví tick size ani funding intervaly. Řekne vám ale, který symbol kdy existoval, což pokrývá 80 % toho, co v pondělí potřebujete.

Co bych vám doporučil postavit, než se znovu dotknete signálu

  1. Cron úlohu, která každý den stahuje exchangeInfo ze všech burz, jež zkoumáte, a ukládá je do objektového úložiště podle data. Komprimovaná gzipem zabere méně než půl megabajtu. Deset let vás v S3 bude stát zanedbatelné peníze a získáte výzkumnou schopnost, kterou si později už nekoupíte.
  2. Hlavní registr aktiv odvozený z těchto snímků: jeden řádek pro každou kombinaci (venue, symbol, valid_from, valid_to) se všemi poli. Porovnávejte po sobě jdoucí snímky a vytvářejte z nich záznamy; každou změnu pole považujte za nový řádek.
  3. Funkci pro sestavení univerza s povinným argumentem timestamp. universe(ts), nikdy universe(). Nastavte takové výchozí chování, aby nikdo, ani vy sám v 1 ráno, nemohl omylem sáhnout po seznamu přeživších.
  4. Kontrolu před zalistováním v datovém loaderu: žádná svíčka nesmí existovat před datem onboard_ts minus jeden den. Při nesplnění běh ukončete, nevyvolávejte jen varování.
  5. Stabilní interní ID instrumentu, které přetrvá přejmenování, zatímco ticker bude jen atributem. Namapujte POL a MATIC na jedno ID a označte redenominace, aby logika časové návaznosti mohla odmítnout jejich propojení.

Udělejte to a spusťte strategii znovu. Odhaduji, že se dostanete blízko k mým 0.74 a hlavní otázkou bude, jestli se v hodnotě 0.74 po započtení mrtvých symbolů skrývá něco, co stojí za paper trading. Možná ano. Průřazové momentum u perpetualů není bezcenné a část toho, co po opravě univerza zbude, je skutečné carry ze short strany. Zároveň zjistíte, že se výsledky paper tradingu a backtestu začnou shodovat, protože paper trading vždy běžel nad univerzem platným k danému okamžiku. Neměl na výběr.

P. S. Není to zvláštnost krypta, jen je to tady viditelnější. Akcioví výzkumníci řeší výnosy z vyřazení z burzy a recyklované tickery už od chvíle, kdy je CRSP začal dodávat. Predikční trhy tento problém ženou do krajnosti: každý kontrakt ze své podstaty expiruje, takže univerzum tvoří samé listingy a zániky. Pokud tento filtr někdy přenesete na Kalshi, nejdřív sestavte hlavní registr aktiv. Jiný typ historie tam není.

zkreslení přeživšíchdata platná k danému okamžikukrypto futuresbacktestingdatové inženýrství
← Všechny články