Existuje otázka, které se každý backtest vyhýbá: udělal by stejný kód totéž, kdyby dostal stejný trh živě? Dalším backtestováním na ni neodpovíte. Odpovědět lze jedině tak, že strategii pustíte na živá data se skutečnou sémantikou exekuce a pak — obchod po obchodu — ověříte, že se oba světy shodují. Tuhle kontrolu děláme každý den automaticky a je to zdaleka nejproduktivnější lovec chyb v celé platformě.
První den: postavit zrcadlo
Každá promovaná strategie běží ve vlastním izolovaném živém uzlu a konzumuje reálné streamy z burzy: živé kotace pro fill, skutečné spready, skutečné obchodní hodiny. Žádný sdílený stav mezi strategiemi (tuhle lekci jsme si odnesli po zlém — ve sdíleném uzlu dotazy na pozice jedné strategie prosakovaly do druhé). Ke každému fillu se zaznamenává hodnota signálu, která ho vyvolala.
Každé ráno: přehrát a porovnat
Denní úloha vezme paper okno každé strategie, prožene identický kód backtestovacím enginem přes stejné období nad katalogovými daty a spáruje fill jedna ku jedné: stejná strana, stejná tolerance časové značky, stejná velikost. Výstupem není korelace ani dojem. Je to tabulka: spárováno, jen paper, jen replay. Zdravá strategie sedí na 54 z 55 spárovaných. Nezdravá vám přesně řekne, který obchod se rozešel a kdy.
Co se rozbilo, v pořadí, jak se to rozbilo
- Fills během warmupu. Živý uzel krmil indikátory historií, aby se zahřály — a strategie s vlastními handlery barů na ní vesele obchodovaly. Backtesty tyhle fantomové vstupy nikdy neviděly. Opravou byla pojistka na vrstvě odesílání objednávek, ne zásah do strategie, protože jinak tu chybu zdědí každá strategie.
- Sekvenční warmup u více nohou. Cross-sectional strategie se zahřívala po jednom instrumentu; každá noha viděla prázdné sourozence a kotva se nikdy neinicializovala. Živě neobchodovala vůbec, při přehrání obchodovala normálně. Nula spárovaných obchodů — a nahlas to řekl jedině diff.
- Crash smyčky kvůli přesnosti ticků. Živé aggTrade ticky chodí v jiné přesnosti, než jakou očekával instrument v sandboxu. Uzel se zacyklil na assertu, který by backtest nikdy nespustil, protože katalogové bary jsou už normalizované.
- Amnézie po restartu. Restarty procesu znovu spouštěly vstupní logiku na pozicích, které už existovaly — u rebalancující strategie se z restartu tiše stal rebalancing. V živém obchodování to není poznámka pod čarou o paritě; to je červená vlajka, na které visí peníze.
Všimněte si vzorce: ani jedna z těchhle chyb není chyba v signálu. Všechny jsou to chyby na hranici exekuce — warmup, stav, přesnost, restarty. Přesně na tuhle třídu selhání je backtest strukturálně slepý, protože v backtestu je backtestovací engine tou hranicí exekuce.
Asymetrie, které si necháváme schválně
Oba světy záměrně nejsou identické. Backtest účtuje v PnL modelovaný poloviční spread plus odmocninový impact; paper platí skutečný spread v ceně fillu a žádný model impactu nemá. Přidat modelovaný spread do paperu (nebo ten skutečný do backtestů) by znamenalo počítat totéž dvakrát. Parita znamená stejná rozhodnutí, stejné filly v rámci tolerance — ne bitově identické PnL. Vědět, které rozdíly jsou principiální a které jsou chyby, je většina té disciplíny.
Backtest je hypotéza. Paper trading je experiment. Parita při přehrání je laboratorní deník, který vás přistihne, jak klamete sami sebe.
Pokud provozujete strategie a pravidelně neporovnáváte živé chování s přehraným, máte celou kategorii chyb, kterou jste nikdy neviděli. My na jednu narazíme zhruba každé dva týdny a každá z nich byla zevnitř backtestu neviditelná.
← Všechny články
