28. října 2026 · opce

Signál byl správný. Náš opční backtest koupil špatnou expiraci.

Signál byl správný. Náš opční backtest koupil špatnou expiraci.

V úterý v 10:07 náš výzkumný agent označil krátkodobou býčí příležitost na indexovém ETF. Podkladový signál byl běžný: cena se vrátila nad svůj 20barový průměr, realizovaná volatilita klesala a na další seanci bylo naplánováno zveřejnění makroekonomických údajů. Navrženým obchodem byl call spread s expirací zhruba za dva týdny.

Backtestu se obchod líbil. Papírová strategie ho nezadala. Když jsme porovnali příkazy, časová razítka signálu souhlasila a ceny podkladového aktiva se lišily jen o pár centů. Kontrakty byly jiné: backtest koupil páteční expiraci, která v historickém řetězci vypadala nejlépe; papírový proces vybral nejbližší další kotovanou expiraci o týden později.

Příčinou byl join kalendářů. „Počet dní do expirace“ jsme považovali za vlastnost data a pak vybrali kontrakt, jehož expirace byla cílovému datu nejblíž. Historická data obsahovala týdenní expiraci, která byla přidána až po testovaném datu. Backtest tak použil budoucí kontrakt způsobem, který vypadal jako neškodná zkratka.

Nejprve jsme podezřívali chybu v časovém pásmu. Data expirace opcí k tomu přímo vybízejí: obchodní seance končí v New Yorku, časová razítka burzy mohou být uložená v UTC a půlnoc se může při neobezřetném převodu data v pipeline posunout. Prověřili jsme to. Časová razítka byla v pořádku. V dané úterý daný kontrakt v historickém univerzu jednoduše neexistoval.

První ponaučení tedy bylo jasné: historický opční řetězec potřebuje univerzum kotovaných kontraktů odpovídající konkrétnímu okamžiku. Datum expirace kontraktu říká, kdy končí. Neříká, kdy byl kotován, kdy se s ním začalo obchodovat ani zda ho váš systém v danou chvíli mohl vybrat.

Výběr jsme přepracovali tak, aby vycházel z informací dostupných v okamžiku rozhodnutí. U každého kandidátního kontraktu jsme požadovali časové razítko kotace nejpozději v okamžiku rozhodnutí, platnou kotaci ne starší, než dovoluje náš limit aktuálnosti, a obchodní seanci, během níž mohla strategie zadat příkaz. Zaznamenávali jsme také celou množinu kandidátů před jejich seřazením. Právě to bylo důležité, protože starý backtest uchovával jen vítězný kontrakt. Nedokázali jsme zjistit, zda porovnal pět způsobilých kontraktů, nebo si potichu vybral z kalendáře, který ještě nebyl k dispozici.

10:07čas rozhodnutí signálu
1 týdennesoulad expirace
0způsobilých historických kotací pro vybraný kontrakt

Dále jsme prověřili kotaci použitou k ocenění spreadu. Backtest samostatně použil poslední kotaci každé nohy. Ask callu byl z 10:06:58, bid short callu z 10:04:11. Podle široce nastavených pravidel pro data byly obě kotace stále dost čerstvé, ale trh se mezitím pohnul. Střed spreadu vypočítaný z časově nesoučasných kotací jednotlivých nohou může popisovat trh, který nikdy neexistoval.

Pravidlo pro kotace jsme změnili: obě nohy musí mít časová razítka vzdálená nejvýše 2 sekundy a překřížené trhy nebo trhy s nulovou velikostí kotace se vyřazují. Počet použitelných historických pozorování tím klesl. Zbývající ocenění ale lépe odpovídala realitě. Pokud synchronizovaná kotace nebyla k dispozici, označili jsme kandidáta za nedostupného místo toho, abychom mezeru vyplnili zastaralou cenou.

Pak přišlo na řadu pravidlo řazení. Agent vybral expiraci s nejnižší kotovanou cenou spreadu. To zní rozumně, dokud spread není široký jeden kontrakt a kotace zastaralá. Cíl jsme stanovili výslovně: maximalizovat očekávaný výnos na jednotku definovaného rizika mezi kontrakty, které splňují minimální požadavky na velikost kotace, její aktuálnost a zařazení do kotace. V tomto příkladu měla nejbližší způsobilá expirace kotovanou šířku 0,42 $ mezi oběma nohami, zatímco pozdější expirace měla šířku 0,31 $. Levněji vypadající varianta měla na short noze zobrazený pouze 1 kontrakt.

KandidátByla expirace tehdy dostupná?Stáří kotaceZobrazená velikost short nohyRozhodnutí
Páteční týdenní expiraceNeNení použitelnéNení použitelnéVyřadit
Následující pátekAno1,4 sekundy18 kontraktůZpůsobilý
Třetí pátekAno9,8 sekundy1 kontraktVyřadit kvůli zastaralé a řídké kotaci

Incident jsme znovu přehráli podle těchto pravidel. Backtest nyní vybral stejnou expiraci jako papírová strategie a zaznamenal důvody, proč byly ostatní kontrakty vyřazeny. Výsledná vstupní cena spreadu byla o 0,11 $ horší než původní historické plnění. Neznamenalo to, že strategie nemá žádnou hodnotu; znamenalo to, že původní výkonnost zahrnovala výběr obchodu, který živý proces nedokázal zopakovat.

Jedna drobná komplikace: formáty burzovních symbolů mohou způsobit, že chyby v expiraci vypadají jako problémy s kvalitou dat. Našli jsme týdenní kód jednoho dodavatele, který se od měsíčního lišil jedním znakem. V auditních protokolech stále uchovávám původní symbol vedle normalizovaného klíče kontraktu. Není to elegantní, ale ušetřilo nám to nejednou předčasnou důvěru v příliš úhledný join.

Pokud vytváříte backtest opcí, ukládejte při každém rozhodnutí celou množinu kandidátů spolu se stavem kotace každého kontraktu, časovými razítky kotací, jejich velikostí a důvodem vyřazení. Výběr kontraktu pak definujte jako deterministickou funkci tohoto snímku. Výběr expirace je součástí strategie. Pokud backtest vidí kontrakt, který papírová strategie vidět nemohla, porovnání signálů začíná až poté, co se už změnila odpověď.

opce backtestingvýběr expiracepoint-in-time datamodelování exekuce
← Všechny články