Antradienį 10:07 mūsų tyrimų agentas indeksiniame ETF aptiko trumpalaikę teigiamą situaciją. Bazinis signalas buvo įprastas: kaina vėl pakilo virš 20 barų vidurkio, realizuotas kintamumas mažėjo, o kitą prekybos sesiją buvo numatytas makroekonominis pranešimas. Siūlomas sandoris – pirkimo opcionų spredas, kurio galiojimas baigiasi maždaug po dviejų savaičių.
Backtestui sandoris patiko. Popierinė strategija jo neatidarė. Palyginę pavedimus pamatėme, kad signalų laiko žymos sutapo, o bazinio aktyvo kainos skyrėsi vos keliais centais. Skyrėsi kontraktai: backtestas buvo pirkęs penktadienį pasibaigiantį kontraktą, kuris istorinių duomenų grandinėje atrodė geriausias; popierinis procesas pasirinko kitą įtrauktą į sąrašą kontraktą, kurio galiojimas baigėsi savaite vėliau.
Šį neatitikimą sukėlė kalendoriaus sujungimas. „Dienas iki galiojimo pabaigos“ laikėme datos savybe, o tada pasirinkome kontraktą, kurio galiojimo pabaiga buvo arčiausiai tikslinės datos. Istoriniuose duomenyse galiojimo kalendoriuje buvo savaitinis kontraktas, įtrauktas į sąrašą jau po tikrinamos datos. Backtestas panaudojo būsimą kontraktą, ir tai atrodė kaip nekalta patogumo gudrybė.
Iš pradžių įtarėme laiko juostos klaidą. Opcionų galiojimo datos ypač dažnai ją išryškina: prekyba baigiasi Niujorke, biržos laiko žymos gali būti saugomos UTC formatu, o neatsargiai konvertuojant datos reikšmę vidurnaktis gali ją perkelti. Patikrinome – laiko žymos buvo teisingos. Tiesiog tą antradienį šio kontrakto istoriniame rinkinyje dar nebuvo.
Pirmoji pamoka: istorinei opcionų grandinei reikia momentu pagrįsto įtrauktų į sąrašą kontraktų rinkinio. Kontrakto galiojimo pabaigos data nurodo, kada jo galiojimas baigiasi. Ji nepasako, kada kontraktas buvo įtrauktas į sąrašą, kada juo tapo galima prekiauti ir ar sistema tuo metu būtų galėjusi jį pasirinkti.
Atrankos žingsnį atkūrėme remdamiesi informacija, prieinama sprendimo laiko momentu. Kiekvienam kandidatiniam kontraktui reikalavome, kad jo įtraukimo į sąrašą laiko žyma nebūtų vėlesnė už sprendimo laiką, galiojanti kotiruotė neviršytų mūsų šviežumo ribos, o prekybos sesija leistų strategijai pateikti pavedimą. Taip pat užfiksavome kandidatų rinkinį prieš juos reitinguodami. Šis paskutinis punktas buvo svarbus, nes senasis backtestas išsaugodavo tik laimėjusį kandidatą; negalėjome žinoti, ar jis palygino penkis tinkamus kontraktus, ar tyliai pasirinko iš dar neegzistavusio kalendoriaus.
Toliau išnagrinėjome kotiruotę, pagal kurią buvo įvertintas spredas. Backtestas kiekvienai kojai atskirai paimdavo naujausią kotiruotę. Pirkimo opciono pardavimo kaina buvo iš 10:06:58, o trumposios pozicijos pirkimo kaina – iš 10:04:11. Pagal plačią duomenų politiką abi kotiruotės dar buvo laikomos naujomis, tačiau per tą laiką rinka pasikeitė. Iš nesinchronizuotų kojų apskaičiuotas spredo vidurkis gali apibūdinti rinką, kurios iš tikrųjų niekada nebuvo.
Pakeitėme kotiruočių taisyklę: abiejų kojų laiko žymos turi skirtis ne daugiau kaip 2 sekundėmis, o kirtusias arba nulinio dydžio rinkas atmetame. Taip sumažėjo tinkamų istorinių stebėjimų skaičius. Tačiau likę įverčiai tapo patikimesni. Jei sinchronizuotos kotiruotės nebuvo, kandidatą žymėjome kaip neprieinamą, o ne užpildydavome spragą pasenusia kaina.
Tada peržiūrėjome reitingavimo taisyklę. Agentas pasirinkdavo galiojimo laiką, kurio kotiruojama spredo kaina buvo mažiausia. Tai skamba pagrįstai, kol spredą sudaro vienas kontraktas, o kotiruotė pasenusi. Aiškiai apibrėžėme tikslą: tarp kontraktų, atitinkančių minimalaus kotiruojamo dydžio, šviežumo ir įtraukimo į sąrašą reikalavimus, maksimaliai padidinti tikėtiną išmoką vienam nustatytos rizikos vienetui. Šiame pavyzdyje artimiausio tinkamo galiojimo spredo kotiruojamas plotis tarp dviejų kojų buvo $0.42, o vėlesnio galiojimo – $0.31. Pigiau atrodžiusio pasirinkimo trumpojoje kojoje buvo rodomas vos vienas kontraktas.
| Kandidatas | Ar tuo metu buvo galimas galiojimo laikas? | Kotiruotės amžius | Rodomas trumposios kojos dydis | Sprendimas |
|---|---|---|---|---|
| Penktadienio savaitinis kontraktas | Ne | Netaikoma | Netaikoma | Atmesti |
| Kitas penktadienis | Taip | 1.4 sekundės | 18 kontraktų | Tinkamas |
| Trečiasis penktadienis | Taip | 9.8 sekundės | 1 kontraktas | Atmesti, nes kotiruotė pasenusi, o rinka per plona |
Pakartojome šį atvejį taikydami naujas taisykles. Dabar backtestas pasirinko tą patį galiojimo laiką kaip popierinė strategija ir užfiksavo, kodėl kiti kontraktai buvo atmesti. Naujo spredo įėjimo kaina buvo $0.11 blogesnė už pradinę istorinę sandorio kainą. Tai nereiškia, kad strategija neturėjo vertės; tai reiškia, kad į senąjį rezultatą buvo įtrauktas sandoris, kurio tiesioginis procesas negalėjo atkartoti.
Nedidelė kebli vieta: biržų simbolių formatai gali pateikti galiojimo klaidas kaip duomenų kokybės problemas. Radome tiekėjo savaitinio kodo variantą, kuris nuo mėnesinio skyrėsi vienu simboliu. Audito žurnaluose vis dar laikau pradinį simbolį greta normalizuoto kontrakto rakto. Tai nėra elegantiška, bet padeda mums pernelyg greitai nepasitikėti tvarkingai atrodančiu sujungimu.
Jei kuriate opcionų backtestą, kiekvieno sprendimo metu išsaugokite visą kandidatų rinkinį kartu su kiekvieno kontrakto įtraukimo į sąrašą būsena, kotiruočių laiko žymomis, dydžiais ir atmetimo priežastimi. Tada kontraktų pasirinkimą apibrėžkite kaip deterministinę šios momentinės kopijos funkciją. Galiojimo laiko pasirinkimas yra strategijos dalis. Jei backtestas mato kontraktą, kurio popierinis procesas nematė, signalų palyginimas prasideda jau pasikeitus atsakymui.
← Visi įrašai


