28. oktober 2026 · opsjoner

Signalet traff. Opsjonsbacktesten vår kjøpte feil utløp.

Signalet traff. Opsjonsbacktesten vår kjøpte feil utløp.

Klokken 10:07 en tirsdag flagget research-agenten vår et kortsiktig bullish oppsett i en indeks-ETF. Det underliggende signalet var ordinært: Kursen hadde kommet seg over snittet for de siste 20 barene, realisert volatilitet var på vei ned, og neste handelsøkt hadde en planlagt makroøkonomisk publisering. Den foreslåtte handelen var en call spread med omtrent to uker til utløp.

Backtesten likte den. Papirstrategien la ikke inn ordren. Da vi sammenlignet ordrene, stemte signaltidspunktene, og prisene på det underliggende var innenfor noen få cent. Kontraktene var forskjellige: Backtesten hadde kjøpt fredagsutløpet som så best ut i den historiske opsjonskjeden; papirprosessen valgte det neste oppførte utløpet, én uke senere.

Dette avviket skyldtes en kalenderkobling. Vi hadde behandlet «dager til utløp» som en egenskap ved en dato og deretter valgt kontrakten med utløp nærmest måldatoen. I de historiske dataene inneholdt utløpskalenderen en ukentlig notering som var lagt til etter datoen vi testet. Backtesten hadde brukt en fremtidig kontrakt på en måte som så ut som en uskyldig forenkling.

Først mistenkte vi en tidssonefeil. Opsjonsutløp er særlig utsatt for slike feil: Handelsøkten slutter i New York, tidsstempler fra børsen kan være lagret i UTC, og en midnattsdato kan forskyves hvis en datapipeline konverterer den uforsiktig. Vi sjekket. Tidsstemplene var riktige. Kontrakten fantes ganske enkelt ikke i det historiske universet denne tirsdagen.

Det var den første lærdommen: En historisk opsjonskjede trenger et punkt-i-tid-univers av noterte kontrakter. Utløpsdatoen forteller deg når kontrakten utløper. Den forteller deg ikke når den ble notert, når den ble omsettelig, eller om systemet ditt kunne ha valgt den på det aktuelle tidspunktet.

Vi bygget om utvalgssteget slik at det tok utgangspunkt i informasjonen som var tilgjengelig på beslutningstidspunktet. For hver kandidatkontrakt krevde vi et noteringstidspunkt senest ved beslutningen, en gyldig kurs som ikke var eldre enn ferskhetsgrensen vår, og en handelsøkt der strategien kunne sende inn en ordre. Vi lagret også kandidatsettet før rangeringen. Det siste var viktig fordi den gamle backtesten bare beholdt vinneren; vi kunne ikke se om den hadde sammenlignet fem kvalifiserte kontrakter eller i det stille valgt fra en kalender som ennå ikke fantes.

10:07tidspunkt for signalbeslutning
1 ukeavvik i utløp
0historiske noteringer som var tilgjengelige for den valgte kontrakten

Deretter undersøkte vi kursen som ble brukt til å prise spreaden. Backtesten hadde hentet den nyeste kursen for hvert ben uavhengig av det andre. Ask-kursen for callen var fra 10:06:58; bid-kursen for den korte callen var fra 10:04:11. Begge var teknisk sett ferske nok etter den overordnede datapolicyen, men markedet hadde beveget seg mellom tidspunktene. En midtkurs for en spread satt sammen av ben med usynkroniserte kurser kan beskrive et marked som aldri eksisterte.

Vi endret kursregelen slik at tidsstemplene for begge ben måtte være innenfor to sekunder av hverandre, og avviste kryssede markeder og markeder med null størrelse. Det reduserte antallet brukbare historiske observasjoner. Samtidig ble de gjenværende prisene mer troverdige. Når det ikke fantes en synkronisert kurs, markerte vi kandidaten som utilgjengelig i stedet for å fylle hullet med en utdatert pris.

Så kom rangeringsregelen. Agenten hadde valgt utløpet med lavest notert spreadkostnad. Det høres fornuftig ut helt til spreaden er én kontrakt bred og kursen er utdatert. Vi gjorde målet tydelig: Maksimer forventet gevinst per enhet definert risiko blant kontrakter som oppfyller minstekravene til kursstørrelse, ferskhet og notering. I dette eksempelet hadde det nærmeste kvalifiserte utløpet en notert bredde på $0.42 på tvers av de to bena, mens det senere utløpet hadde en bredde på $0.31. Det tilsynelatende billigere alternativet hadde også bare én kontrakt vist på det korte benet.

KandidatVar utløpet tilgjengelig da?KursalderVist størrelse på kort benBeslutning
Ukentlig utløp fredagNeiIkke relevantIkke relevantUtelukk
Påfølgende fredagJa1.4 sekunder18 kontrakterKvalifisert
Tredje fredagJa9.8 sekunder1 kontraktUtelukk på grunn av utdatert kurs og lav størrelse

Vi spilte hendelsen på nytt med disse reglene. Backtesten valgte nå samme utløp som papirprosessen og registrerte hvorfor de andre kontraktene ble avvist. Inngangskursen for spreaden ble $0.11 dårligere enn den opprinnelige historiske fyllkursen. Det betydde ikke at strategien var uten verdi; det betydde at det gamle resultattallet inkluderte et handelsvalg som live-prosessen ikke kunne reprodusere.

En liten irritasjon: Børsenes symbolformater får feil i utløp til å se ut som datakvalitetsfeil. Vi fant en ukentlig kode fra en dataleverandør som skilte seg fra månedskoden med ett tegn. Jeg lagrer fortsatt råsymbolet sammen med den normaliserte kontraktnøkkelen i revisjonsloggene. Det er ikke elegant, men det har hindret oss i å stole for raskt på en ryddig kobling.

Hvis du bygger en opsjonsbacktest, bør du lagre hele kandidatsettet ved hver beslutning, sammen med hver kontrakts noteringsstatus, kurstidsstempler, størrelser og avvisningsgrunn. Gjør deretter kontraktvalget til en deterministisk funksjon av dette øyeblikksbildet. Valget av utløp er en del av strategien. Hvis backtesten kan se en kontrakt som papirprosessen ikke kunne se, begynner sammenligningen av signaler først etter at svaret allerede har endret seg.

opsjoner i backtestingvalg av utløppunkt-i-tid-datamodellering av ordreutførelse
← Alle innlegg