28 oktober 2026 · optioner

Signalen var rätt. Vår optionsbacktest köpte fel förfallodatum.

Signalen var rätt. Vår optionsbacktest köpte fel förfallodatum.

Klockan 10:07 en tisdag flaggade vår researchagent ett kortsiktigt hausseartat läge i en index-ETF. Den underliggande signalen var vanlig: priset hade återtagit sitt 20-bars medelvärde, den realiserade volatiliteten avtog och nästa handelssession hade ett schemalagt makrosläpp. Det föreslagna upplägget var en call spread med ungefär två veckor till förfall.

Backtesten gillade upplägget. Pappersstrategin lade ingen order. När vi jämförde ordrarna stämde signalernas tidsstämplar och priserna på den underliggande tillgången skilde bara några cent. Kontrakten var olika: backtesten hade köpt fredagsförfallet som såg bäst ut i den historiska optionskedjan; pappersprocessen valde nästa noterade förfall, en vecka senare.

Avvikelsen berodde på en kalenderkoppling. Vi hade behandlat ”dagar till förfall” som en egenskap hos ett datum och sedan valt kontraktet vars förfall låg närmast målet. I historiska data innehöll förfallokalendern en veckonotering som hade lagts till efter datumet vi testade. Backtesten hade använt ett framtida kontrakt på ett sätt som verkade vara en oskyldig genväg.

Först misstänkte vi ett tidszonsfel. Optionsförfall är särskilt bra på att orsaka sådana: handelssessionen slutar i New York, börsens tidsstämplar kan lagras i UTC och ett midnattsdatum kan förskjutas när en datapipeline konverterar det slarvigt. Vi kontrollerade detta. Tidsstämplarna var korrekta. Kontraktet fanns helt enkelt inte i det historiska universumet den tisdagen.

Det var den första lärdomen: en historisk optionskedja behöver ett punkt-i-tid-universum av noterade kontrakt. Ett kontrakts förfallodatum talar om när det löper ut. Det talar inte om när det noterades, när det blev möjligt att handla eller om systemet hade kunnat välja det vid tillfället.

Vi byggde om urvalet så att det utgår från informationen som fanns tillgänglig vid beslutstidpunkten. För varje kandidatkontrakt krävde vi en noteringstidsstämpel som inte låg efter beslutet, en giltig kurs som inte var äldre än vår gräns för aktualitet och en handelssession då strategin kunde skicka en order. Vi sparade också kandidatgruppen innan vi rangordnade den. Den sista delen var viktig eftersom den gamla backtesten bara sparade vinnaren; vi kunde inte se om den hade jämfört fem kvalificerade kontrakt eller i tysthet valt från en kalender som ännu inte hade funnits.

10:07signalens beslutstid
1 veckaavvikelse i förfall
0historiska noteringar som var tillgängliga för det valda kontraktet

Därefter granskade vi kursen som användes för att prissätta spreaden. Backtesten hade hämtat den senaste kursen för varje ben separat. Köpoptionens säljkurs var från 10:06:58; den korta köpoptionens köpkurs var från 10:04:11. Båda var tekniskt sett tillräckligt färska enligt den övergripande datapolicyn, men marknaden hade rört sig däremellan. En mittkurs för en spread som byggs av ben med osynkroniserade tidsstämplar kan beskriva en marknad som aldrig existerade.

Vi ändrade kursregeln så att båda benen måste ha tidsstämplar inom två sekunder från varandra och avvisade korsade marknader och marknader med noll storlek. Det minskade antalet användbara historiska observationer. Det gjorde också de återstående värderingarna mer trovärdiga. När det inte fanns någon synkroniserad kurs markerade vi kandidaten som otillgänglig i stället för att fylla luckan med ett inaktuellt pris.

Sedan kom rangordningsregeln. Agenten hade valt förfallet med den lägsta noterade spreadkostnaden. Det låter rimligt tills spreaden bara har ett kontrakt i storlek och kursen är inaktuell. Vi gjorde målet tydligt: maximera förväntad avkastning per enhet definierad risk bland kontrakt som klarar minimikraven för kursstorlek, aktualitet och notering. I det här exemplet hade det närmaste kvalificerade förfallet en noterad bredd på $0.42 över de två benen, medan det senare förfallet hade en bredd på $0.31. Det val som såg billigare ut hade dessutom bara ett kontrakt visat på det korta benet.

KandidatVar förfallet tillgängligt då?Kursens ålderVisad storlek på korta benetBeslut
Veckoförfall på fredagNejInte tillämpligtInte tillämpligtUteslut
Följande fredagJa1.4 sekunder18 kontraktKvalificerat
Tredje fredagenJa9.8 sekunder1 kontraktUteslut: inaktuell och tunn

Vi spelade upp händelsen igen med de reglerna. Backtesten valde nu samma förfall som pappersprocessen och loggade varför de andra kontrakten avvisades. Spreadens ingångspris blev $0.11 sämre än den ursprungliga historiska fyllningen. Det betyder inte att strategin saknade värde; det betyder att den gamla resultatsiffran inkluderade ett handelsval som liveprocessen inte kunde återskapa.

Ett mindre irritationsmoment: börsernas symbolformat får förfallsfel att se ut som datakvalitetsfel. Vi hittade en veckokod från en dataleverantör som skilde sig från månadskoden med ett enda tecken. Jag sparar fortfarande råsymbolen bredvid den normaliserade kontraktsnyckeln i granskningsloggarna. Det är inte elegant, men det har hindrat oss från att lita för snabbt på en prydlig koppling.

Om du bygger en optionsbacktest bör du spara hela kandidatgruppen vid varje beslut, tillsammans med varje kontrakts noteringsstatus, kurstidsstämplar, storlekar och skäl till avvisning. Gör sedan kontraktsvalet till en deterministisk funktion av den ögonblicksbilden. Valet av förfall är en del av strategin. Om backtesten kan se ett kontrakt som pappersprocessen inte kunde se börjar jämförelsen av signalerna först efter att svaret redan har ändrats.

optionsbacktestingval av förfallodatumpunkt-i-tidsdataexekveringsmodellering
← Alla inlägg