О 10:07 у вівторок наш дослідницький агент виявив короткострокову бичачу ситуацію в індексному ETF. Сигнал на базовий актив був звичайним: ціна повернулася вище за середнє за 20 барів, реалізована волатильність знижувалася, а на наступну сесію було заплановано макроекономічну публікацію. Запропонована угода — спред із кол-опціонів із приблизно двома тижнями до експірації.
Бектесту угода сподобалася. Паперова стратегія її не відкрила. Коли ми порівняли заявки, часові мітки сигналів збіглися, а ціни базового активу відрізнялися лише на кілька центів. Контракти були різними: бектест купив опціон із п’ятничною експірацією, який мав найкращий вигляд в історичному ланцюжку; паперовий процес обрав наступну доступну експірацію, на тиждень пізніше.
Причиною розбіжності стало об’єднання календарів. Ми трактували «дні до експірації» як властивість дати, а потім обирали контракт із найближчою до цільової датою експірації. В історичних даних календар експірацій містив тижневий опціон, доданий уже після дати, яку ми перевіряли. Бектест використав майбутній контракт так, ніби це була невинна зручність.
Спершу ми запідозрили помилку часового поясу. Дати експірації опціонів часто спричиняють такі помилки: торгова сесія завершується в Нью-Йорку, часові мітки біржі можуть зберігатися в UTC, а дата опівночі може зміститися, якщо конвеєр недбало змінить її тип. Ми перевірили — часові мітки були правильними. Просто того вівторка цього контракту ще не було в історичному наборі доступних інструментів.
Перший висновок: для історичного ланцюжка опціонів потрібен набір контрактів, доступних на конкретний момент часу. Дата експірації контракту вказує, коли він завершується. Вона не вказує, коли його додали до лістингу, коли ним можна було почати торгувати чи чи могла система його обрати на той момент.
Ми перебудували етап вибору, спираючись на інформацію, доступну на момент ухвалення рішення. Для кожного кандидата-контракту вимагали, щоб час лістингу був не пізніший за момент рішення, актуальне котирування не виходило за межі нашого порога свіжості, а торгова сесія дозволяла стратегії подати заявку. Також ми зберігали набір кандидатів до ранжування. Це було важливо: старий бектест зберігав лише переможця, тому ми не могли зрозуміти, чи порівняв він п’ять доступних контрактів, чи непомітно вибрав із календаря, якого на той час іще не існувало.
Далі ми перевірили котирування, за яким оцінили спред. Бектест окремо брав останнє котирування для кожної ноги. Ціна аск кол-опціону була з 10:06:58, а ціна бід короткого кол-опціону — з 10:04:11. За загальними правилами обробки даних обидва котирування вважалися достатньо свіжими, але між ними ринок устиг змінитися. Середня ціна спреду, розрахована з асинхронних котирувань для його ніг, може описувати стан ринку, якого ніколи не було.
Ми змінили правило для котирувань: часові мітки обох ніг мають відрізнятися не більш ніж на 2 секунди, а перехресні котирування й ринки з нульовим обсягом відображення відхиляються. Кількість придатних історичних спостережень зменшилася. Зате оцінки, що залишилися, стали правдоподібнішими. Якщо синхронного котирування не було, ми позначали кандидата як недоступного, а не заповнювали прогалину застарілою ціною.
Потім ми переглянули правило ранжування. Агент обирав експірацію з найменшою котированою вартістю спреду. Звучить розумно, аж поки не з’ясується, що на спреді лише один контракт, а котирування застаріле. Ми чітко визначили ціль: максимізувати очікуваний дохід на одиницю визначеного ризику серед контрактів, що проходять мінімальні вимоги до обсягу котирування, його свіжості й наявності в лістингу. У цьому прикладі ширина котирування для двох ніг найближчої доступної експірації становила $0.42, а для пізнішої — $0.31. У дешевшого на вигляд варіанта на короткій нозі відображався лише один контракт.
| Кандидат | Чи була експірація доступна на той момент? | Вік котирування | Обсяг відображення короткої ноги | Рішення |
|---|---|---|---|---|
| Тижнева експірація в п’ятницю | Ні | Не застосовується | Не застосовується | Відхилити |
| Наступна п’ятниця | Так | 1.4 секунди | 18 контрактів | Доступний |
| Третя п’ятниця | Так | 9.8 секунди | 1 контракт | Відхилити: застаріле котирування й низький обсяг |
Ми відтворили цей випадок за новими правилами. Тепер бектест обирав ту саму експірацію, що й паперовий процес, і фіксував причини відхилення інших контрактів. Ціна входу в отриманий спред була на $0.11 гіршою за початкову історичну ціну виконання. Це не означало, що стратегія не має цінності; це означало, що старий показник ефективності враховував вибір угоди, який неможливо було відтворити в реальному процесі.
Є ще одна дрібна проблема: формати біржових символів змушують помилки з експірацією скидатися на проблеми якості даних. Ми знайшли тижневий код одного постачальника, що відрізнявся від місячного лише одним символом. Я й досі зберігаю в журналах аудиту вихідний символ поруч із нормалізованим ключем контракту. Це не надто елегантно, зате допомагає не довіряти охайному об’єднанню даних, не перевіривши його як слід.
Якщо ви створюєте бектест опціонів, зберігайте повний набір кандидатів для кожного рішення, а також статус лістингу кожного контракту, часові мітки котирувань, обсяги й причини відхилення. Потім зробіть вибір контракту детермінованою функцією цього знімка даних. Вибір експірації — частина стратегії. Якщо бектест бачить контракт, недоступний для паперової торгівлі, порівняння сигналів починається вже після того, як результат змінився.
← Усі статті


