28 octombrie 2026 · opțiuni

Semnalul a fost corect. În backtestul nostru de opțiuni am cumpărat o expirare greșită.

Semnalul a fost corect. În backtestul nostru de opțiuni am cumpărat o expirare greșită.

Marți, la 10:07, agentul nostru de cercetare a semnalat o configurație bullish pe termen scurt pentru un ETF pe indice. Semnalul de bază era obișnuit: prețul depășise din nou media pe 20 de bare, volatilitatea realizată scădea, iar pentru următoarea sesiune era programată o publicare macroeconomică. Tranzacția propusă era un call spread cu aproximativ două săptămâni până la expirare.

Backtestul a apreciat tranzacția. Strategia de paper trading nu a plasat-o. Când am comparat ordinele, marcajele temporale ale semnalelor coincideau, iar prețurile activului suport erau la câțiva cenți distanță. Contractele erau diferite: backtestul cumpărase expirarea de vineri care părea cea mai bună în lanțul istoric; procesul de paper trading selectase următoarea expirare listată, la o săptămână distanță.

Această diferență provenea dintr-o asociere de calendare. Trataserăm „zile până la expirare” ca pe o proprietate a unei date, apoi selectaserăm contractul a cărui expirare era cel mai aproape de țintă. În datele istorice, calendarul expirărilor includea o listare săptămânală adăugată după data pe care o testam. Backtestul folosise un contract din viitor, într-un mod care părea o scurtătură inofensivă.

La început, am suspectat o eroare de fus orar. Datele expirării opțiunilor sunt deosebit de predispuse la astfel de erori: sesiunea de piață se încheie la New York, marcajele temporale ale bursei pot fi stocate în UTC, iar o dată la miezul nopții se poate schimba dacă o conductă de date o convertește neglijent. Am verificat. Marcajele temporale erau corecte. Pur și simplu, contractul nu exista în universul istoric marți.

Prima lecție a fost aceasta: un lanț istoric de opțiuni are nevoie de un univers al listărilor definit la momentul respectiv. Data expirării unui contract îți spune când expiră. Nu îți spune când a fost listat, când a devenit tranzacționabil sau dacă sistemul tău l-ar fi putut selecta atunci.

Am reconstruit etapa de selecție folosind informațiile disponibile la marcajul temporal al deciziei. Pentru fiecare contract candidat, am impus ca marcajul temporal al listării să nu fie ulterior deciziei, ca o cotație validă să nu fie mai veche decât pragul nostru de prospețime și ca sesiunea de piață să permită strategiei să trimită un ordin. Am înregistrat și setul de candidați înainte de ordonarea lor. Ultimul pas a contat, fiindcă vechiul backtest păstra doar câștigătorul; nu puteam afla dacă comparase cinci contracte eligibile sau alesese pe ascuns dintr-un calendar care încă nu exista.

10:07ora deciziei semnalului
1 săptămânănepotrivire a expirării
0listări istorice eligibile pentru contractul ales

Apoi am examinat cotația folosită pentru evaluarea spreadului. Backtestul preluase separat cea mai recentă cotație pentru fiecare componentă. Ask-ul call-ului era de la 10:06:58; bid-ul call-ului short era de la 10:04:11. Ambele erau suficient de recente conform politicii generale pentru date, dar piața se mișcase între cele două momente. Un midpoint al spreadului calculat din componente asincrone poate descrie o piață care nu a existat niciodată.

Am modificat regula pentru cotații astfel încât marcajele temporale ale ambelor componente să fie la cel mult două secunde distanță și să respingem piețele crossed sau cu dimensiune zero. Numărul observațiilor istorice utilizabile a scăzut. Cotațiile rămase au devenit însă mai credibile. Când nu exista o cotație sincronizată, marcam candidatul ca indisponibil în loc să acoperim lipsa cu un preț învechit.

A urmat regula de ordonare. Agentul alesese expirarea cu cel mai mic cost de spread cotat. Pare logic până când spreadul are dimensiunea unui singur contract, iar cotația este învechită. Am formulat explicit obiectivul: maximizarea câștigului așteptat pe unitate de risc definit, dintre contractele care trec verificările minime privind dimensiunea cotației, prospețimea și listarea. În acest exemplu, cea mai apropiată expirare eligibilă avea o lățime cotată de $0.42 pentru cele două componente, iar expirarea ulterioară avea o lățime de $0.31. Alegerea care părea mai ieftină avea afișat un singur contract pe componenta short.

CandidatExpirare disponibilă atunci?Vechimea cotațieiDimensiunea afișată a componentei shortDecizie
Vinerea săptămânalăNuNu se aplicăNu se aplicăExclus
Vinerea următoareDa1,4 secunde18 contracteEligibil
A treia vineriDa9,8 secunde1 contractExclusă: cotație învechită și piață subțire

Am reluat incidentul folosind aceste reguli. Acum, backtestul alege aceeași expirare ca procesul de paper trading și înregistrează motivele pentru care celelalte contracte au fost respinse. Intrarea în spread rezultată a fost mai nefavorabilă cu $0.11 decât execuția istorică inițială. Asta nu însemna că strategia nu avea valoare; însemna că vechiul indicator de performanță inclusese o selecție de tranzacții pe care procesul live nu o putea reproduce.

O mică bătaie de cap: formatele simbolurilor bursiere fac ca erorile de expirare să pară probleme de calitate a datelor. Am găsit codul săptămânal al unui furnizor, care diferea de codul lunar printr-un singur caracter. Încă păstrez simbolul brut alături de cheia normalizată a contractului în jurnalele de audit. Nu e elegant, dar ne-a ferit să avem prea multă încredere într-o asociere ordonată.

Dacă dezvoltați un backtest de opțiuni, salvați întregul set de candidați pentru fiecare decizie, împreună cu starea listării fiecărui contract, marcajele temporale și dimensiunile cotațiilor, precum și motivul respingerii. Apoi definiți selecția contractelor ca funcție deterministă a acelui instantaneu. Alegerea expirării face parte din strategie. Dacă backtestul poate vedea un contract pe care procesul de paper trading nu îl putea vedea, comparația semnalelor pornește după ce rezultatul s-a schimbat deja.

backtesting pentru opțiuniselectarea expirăriidate la momentul respectivmodelarea execuției
← Toate articolele