Minulý měsíc vygenerovaná strategie vytvořila křivku kapitálu s propadem o 63 %. Hluboký, ošklivý propad a pak čisté zotavení během následujících 6 týdnů — přesně takový průběh, nad kterým se výzkumník zamyslí a rozhodne, že se dá přežít, když sníží velikost pozice. Znovu jsem ji spustil přes maržový engine, který zná pásma udržovací marže. Účet byl zlikvidován 41. den, uprostřed propadu, a všechno napravo od 41. dne byla fikce.
Tohle je nejdražší kategorie chyb v backtestech, jakou znám, protože výnosy nezkreslí o pár bazických bodů. Ze simulace odstraní absorbující stav. Strategie, která může skončit na nule, a strategie, která nemůže, jsou dvě různé strategie. Backtest, který nikdy nekontroluje marži, vám neřekne, kterou z nich máte.
Stále dokola vídám 3 chybné postupy.
Chybný postup 1: páka jako číslo, kterým násobíte výnosy
Nejběžnější podoba. Ze signálů vypočítáte časovou řadu výnosů, rozhodnete se obchodovat s pákou 10x a výnosy vynásobíte. Někdy je to o něco propracovanější — velikost pozice je equity * leverage / price — ale stav účtu je pořád jen skalár, který roste a klesá. Žádný zůstatek marže, žádný limit nominální hodnoty, žádná podmínka selhání.
Škody jsou nenápadné, a proto tenhle přístup přežije kontrolu. Sharpe je nezávislý na měřítku, takže hlavní číslo se nezmění, ať páku změníte z 3x na 30x. Výzkumník pak dojde k závěru, že páka je bezplatný ovladač, který směňuje volatilitu za výnos. Maximální propad se mění lineárně a čistě náhodou zůstává pod 100 %, protože řada násobených výnosů se asymptoticky blíží k nule, ale nikdy ji nepřekročí. Vynásobte denní pokles -9 % číslem 12 a v poctivé verzi dostanete -108 %, zatímco v naivní „-108 %, ale křivka kapitálu je pořád kladná“ — podle toho, zda jste výnosy skládali, nebo sčítali. Viděl jsem obojí.
Chybí tu skutečnost, že páka se neuplatňuje na vaše výnosy. Uplatňuje se na váš kolaterál a kolaterál je omezený zdroj, který burza sleduje každou sekundu. Jakmile klesne pod požadovanou udržovací marži, pozice vám přestane patřit.
Varovný signál: pokud vaše simulace při jakékoli páce nedokáže vykázat úplnou ztrátu, nemodeluje páku.
Chybný postup 2: likvidační cena vypočtená pouze z páky
Druhá úroveň propracovanosti přidává kontrolu likvidace, obvykle zhruba takto: při páce 20x nepříznivý pohyb o 5 % smaže marži, takže u long pozice dojde k likvidaci na vstupu × 0,95. Jednoduché, intuitivní a chybné hned ve 4 různých ohledech.
Platformy pro perpetual futures neurčují okamžik likvidace podle nastavené páky. Používají sazbu udržovací marže, která se podle nominální hodnoty pozice zvyšuje v jednotlivých pásmech. Přibližná struktura pro BTCUSDT USDⓈ-M, která se mění podle úprav burz:
| Nominální hodnota pozice (USDT) | Sazba udržovací marže | Maximální páka |
|---|---|---|
| 0 – 50,000 | 0.40% | 125x |
| 50,000 – 600,000 | 0.50% | 100x |
| 600,000 – 3,000,000 | 1.00% | 50x |
| 3,000,000 – 12,000,000 | 2.50% | 20x |
| 12,000,000 – 70,000,000 | 5.00% | 10x |
Nepříznivý pohyb, který lze u izolované long pozice ustát, je tedy zhruba 1/L − MMR, nikoli 1/L. Při páce 20x ve druhém pásmu je to 5 % − 0.5 % = 4.5 %. Půl procenta vypadá jako zaokrouhlovací chyba. U BTC za cenu 84,000 je to cenový rozdíl 420 dolarů a při prudkém pohybu představuje 420 dolarů rozdíl mezi knotem, který vás vyřadil, a tím, který ne. Každý knot je hod mincí a vy jste všechny výsledky vychýlili ve svůj prospěch.
Pak jsou tu poplatky. Poplatek taker za vstup se odečte od marže hned při vyplnění příkazu: 0.045 % z nominální hodnoty 500,000 znamená 225 USDT proti zůstatku marže 25,000 USDT. Likvidační cena se tím posune ještě předtím, než pozice cokoli udělá. Totéž průběžně způsobuje funding a při obchodování s pákou je jeho dopad mnohem větší, než výzkumníci čekají:
Pozice, která 30 dní nic nedělá — žádný nepříznivý pohyb, žádné obchody — spotřebuje téměř pětinu kolaterálu a výrazně posune likvidační cenu blíž. Třetí a čtvrtý chybný směr: při navyšování pozice se mění její pásmo, takže pozice, která začíná v pásmu 0.5 % a průměrováním se dostane do pásma 1.0 %, má horší likvidační cenu, než jakou jste vypočítali při vstupu. Cross margin sdílí kolaterál mezi pozicemi, takže přežití vašeho longu na BTC závisí na tom, co dělá váš short na ETH. Jestli simulujete cross margin jako sadu nezávislých izolovaných pozic, máte strukturu korelací vlastního účtu obráceně.
Chybný postup 3: likvidace se provede podle nesprávné ceny, ve špatný okamžik a za špatnou cenu plnění
Předpokládejme, že jste správně určili spouštěcí úroveň. Která cena ji překročí, kdy to kontrolujete a za jakou cenu se pozice vyplní?
Likvidaci spouští mark price, index několika spotových platforem s vyhlazenou složkou báze, záměrně navržený tak, aby odolal knotu na jediné platformě. Váš stop-loss se podle nastavení nejspíš spouští na poslední obchodované ceně. Tato dvě čísla se rozcházejí právě ve chvíli, kdy na tom nejvíc záleží. Během likvidační kaskády se poslední cena perpetual futures může na desítky sekund odchýlit od mark price o 1–2 % směrem dolů. Backtest, který stop i likvidaci vyhodnocuje podle stejného minima OHLCV, modeluje platformu, která neexistuje.
V tomto případě platí obě chyby zároveň a navzájem se nevyruší. Při použití poslední ceny vás zlikvidují knoty, které platforma ignorovala. Při použití mark price přehlédnete situaci, kdy se pohnula sama mark price — odchylka indexu na spotové platformě je skutečný způsob, jak být zlikvidován za cenu, která se na perpetual futures, které jste obchodovali, vůbec neobjevila.
Pak je tu cena plnění. Naivní enginy uzavřou pozici za likvidační cenu a zaúčtují ztrátu, jako by šlo o stop-loss. Ve skutečnosti převezme pozici likvidační engine za bankrotní cenou — úrovní, při níž je vaše marže přesně nulová, tedy horší než spouštěcí úroveň — a navíc naúčtuje poplatek za likvidační vypořádání, jehož výše závisí na pásmu a v nižších pásmech se pohybuje kolem 1 % nominální hodnoty. Při páce 20x představuje 1 % nominální hodnoty 20 % zbývající marže. Pokud engine pozici vyplní pod bankrotní cenou, rozdíl pokryje pojistný fond. Na některých platformách se při vyčerpání fondu socializovaná ztráta přenese i na ziskovou stranu knihy objednávek. Realizovaná ztráta není propad k likvidační ceně. Je větší a nejvyšší je právě v dnech, kdy byla kniha nejméně likvidní.
Otázka načasování z intrabarové mechaniky tu platí s ještě vážnějšími důsledky než obvykle. Pokud 1minutový bar obsahuje zároveň váš take-profit i likvidační úroveň, backtest, který kontroluje výstupy před marží, vám ochotně zaúčtuje zisk. Platforma kontroluje marži při každé aktualizaci mark price, zhruba jednou za sekundu, dřív než cokoli jiného, co byste chtěli provést.
Co musí engine sledovat místo toho
Nic z toho nemusí být složité. Engine musí uchovávat stav. Účet je objekt se zůstatkem, nikoli časová řada výnosů, a každý bar se aktualizuje v pořadí, v jakém by ho aktualizovala platforma:
- Zůstatek peněženky a nerealizovaný PnL, každý zvlášť. Poměr marže je udržovací marže dělená zůstatkem marže, který zahrnuje nerealizovaný PnL. Když tyto hodnoty sloučíte, ztrátová pozice vypadá lépe zajištěná, než ve skutečnosti je.
- Tabulka pásem pro každý symbol, s verzí podle data. Pásma se mění. Backtest z roku 2023 spuštěný podle pásem z roku 2026 obsahuje nenápadný look-ahead bias — obvykle ve váš prospěch, protože platformy u hlavních aktiv požadavky v průběhu času většinou zmírňovaly.
- Časová řada mark price, nejen klines. Pokud nemůžete získat historické údaje o mark price, uveďte to ve výsledcích a použijte konzervativní aproximaci. Nikdy ji potichu nenahrazujte poslední cenou.
- Kontrola marže jako první událost v pořadí událostí baru, ještě před stop-lossy, cíli, signály nebo rebalancováním.
- Plnění za bankrotní cenu a poplatek za vypořádání, přičemž sazba poplatku se načítá ze stejného řádku pásma jako MMR.
- Absorbující koncový stav. Když vlastní kapitál klesne na nulu, běh skončí. Žádné nové nastavení základu, žádné „předpokládejme, že obchodník doplní prostředky“, žádné pokračování časové řady s novou nominální hodnotou.
Právě poslední bod vyvolává nejvíc sporů. Někdo vždy namítne, že skutečný obchodní tým by vložil další kolaterál, a proto je ukončení simulace nerealisticky přísné. Možná. Ale tvrzení „tato strategie funguje, pokud do ní po každém krachu dál sypete peníze“ si zaslouží být vysloveno přesně těmito slovy a záměrně otestováno, s doplňováním prostředků jako výslovným vstupem, místo aby se propašovalo do simulace jako výchozí předpoklad. Když to napíšete poctivě, většina lidí zjistí, že to tak nemyslela.
Praktický přínos toho všeho: když stejnou strategii zkoušíte nanečisto proti živé platformě, poměr marže hlášený burzou a poměr vypočítaný simulátorem by se měly celý den shodovat s přesností na 1 až 2 bazické body. Tuto shodu lze bezplatně kontrolovat každou minutu u každé otevřené pozice. Je to nejlevnější test parity v celém stacku a téměř nikdo ho nespouští. Když se obě čísla rozejdou, pravdu má burza a vy máte chybu, kterou stojí za to najít dřív, než to za vás udělá propad.
← Všechny články


