- Long Put 100%
- Put Backspread 78%
Курсовый файл состоит из двух очень разных частей, и обращаться с ними надо по-разному. Таксономия — рабочая. Кейсы — не доказательство.
Я пересчитал все 23 кейса независимо, из данных Massive: контракт за контрактом, нога за ногой, день за днём. В режиме «отметка по закрытию бара» движок воспроизвёл все 22 пригодных кейса точно — до цента: подсумок, пик прибыли, максимальную просадку. Греки на входе тоже сошлись до третьего знака. Никто ничего не выдумывал.
Проблема не в честности вычислений, а в отборе. 22 победителя из 23 при N=1 на стратегию — это подпись подобранных иллюстраций. Так показывают, как конструкция работает, когда она работает. Это нормально для обучения и непригодно как доказательство, что она работает в среднем.
Самая большая практическая дыра курса: вертикальная ось не имеет шкалы. «Рост / Стабильная / Падение Vol» — ни окна, ни порога, ни источника. А выбор строки решает, ты в long-vega или в short-vega, и это доминирует над результатом всего, что в ячейке. Ниже — матрица с меткой «сколько от заявленного уцелело после исполнения» на каждой структуре.
Процент = исполнимый результат кейса / заявленный результат. Это не винрейт и не качество стратегии — лишь сколько съедает спред на конкретном примере. Inv Iron Butterfly без числа: заявленный результат отрицательный, поэтому доля не читается (убыток вышел меньшим, −$20 против −$187).
Исторической IV в подписке Massive нет — греки и IV живут только в live-snapshot. Поэтому IV приходится восстанавливать самому: инвертировать Блэка-Шоулза из цены контракта. Это реализовано в bs.py + vol_regime.py. Проверка: греки, восстановленные так для INTC 100C, сошлись с теми, что печатает курс, до третьего знака.
Два операционных прочтения строки, потому что они отвечают на разные вопросы:
| Прочтение | Что измеряет | Когда валидно | Слабое место |
|---|---|---|---|
| Mean-reversion | IV rank / percentile в собственном диапазоне за 252 дня | Спокойный режим без приблизившегося катализатора | На хвостах врёт: во время vol-экспансии IV rank «высокий» каждый день, и продажа vol там — это продажа под поезд |
| Term structure | front IV минус back IV | Когда перед близкой экспирацией есть событие (отчёт) | Это прогноз рынка, не твой — эдж обязан быть в чём-то другом |
Три способа отметить позицию стоят рядом намеренно, потому что на опционах разница между ними и есть результат. close — по закрытию бара, так считает курс: неисполнимо, потому что закрытие бара это принт, который достался кому-то другому. mid — середина NBBO: предполагает, что лимитка по мидлу всегда исполняется. exec — покупаешь по ask, продаёшь по bid; то, во что стоит верить.
| Стратегия | Тикер | Ячейка | Заявлено | close | mid | exec | exec / заявл. | спред@вход |
|---|---|---|---|---|---|---|---|---|
| Long Call | INTC | vol_up/bull | +1 421 | +1 421 | +1 410 | +1 350 | 95.0% | 1.2% |
| Call Backspread | INTC | vol_up/bull | +795 | +795 | +795 | +630 | 79.2% | 13.1% |
| Bull Call Spread | MU | vol_flat/bull | +2 719 | +2 719 | +2 785 | +2 715 | 99.9% | 3.8% |
| Bull Put Spread | MU | vol_flat/bull | +1 011 | +1 011 | +1 065 | +1 005 | 99.4% | 5.6% |
| Short Put | TSLA | vol_down/bull | +759 | +759 | +721 | +715 | 94.2% | 1.0% |
| Cash-Secured Put | TSLA | vol_down/bull | +479 | +479 | +465 | +460 | 96.0% | 1.1% |
| Covered Call | TSLA | vol_down/bull | +3 002 | +3 002 | +3 004 | +3 065 | 102.1% | — |
| Long Straddle | AMD | vol_up/neutral | +4 711 | +4 711 | +4 778 | +4 390 | 93.2% | 1.8% |
| Long Strangle | AMD | vol_up/neutral | +4 898 | +4 898 | +4 605 | +4 285 | 87.5% | 2.7% |
| Inv Iron Butterfly | AMD | vol_up/neutral | −187 | −187 | +173 | −20 | н/д | 9.2% |
| Inv Iron Condor | AMD | vol_up/neutral | +761 | +761 | +680 | +640 | 84.1% | 10.4% |
| Calendar Spread | MSFT | vol_flat/neutral | +292 | +292 | +253 | +249 | 85.3% | 8.9% |
| Wheel | AAPL | vol_flat/neutral | +1 364 | — | — | — | — | — |
| Iron Condor | NVDA | vol_down/neutral | +291 | +291 | +284 | +276 | 94.8% | 3.3% |
| Iron Butterfly | NVDA | vol_down/neutral | +515 | +515 | +551 | +493 | 95.7% | 3.1% |
| Short Straddle | NVDA | vol_down/neutral | +880 | +880 | +904 | +853 | 96.9% | 1.9% |
| Short Strangle | NVDA | vol_down/neutral | +475 | +475 | +459 | +456 | 96.0% | 1.0% |
| Long Put | CAR | vol_up/bear | +26 960 | +26 960 | +28 290 | +27 080 | 100.4% | 3.8% |
| Put Backspread | CAR | vol_up/bear | +23 780 | +23 780 | +22 600 | +18 560 | 78.0% | 19.7% |
| Bear Put Spread | COIN | vol_flat/bear | +811 | +811 | +1 123 | +665 | 82.0% | 8.6% |
| Bear Call Spread | COIN | vol_flat/bear | +732 | +732 | +734 | +669 | 91.4% | 7.0% |
| Short Call | MSTR | vol_down/bear | +815 | +815 | +844 | +807 | 99.0% | 4.1% |
| Covered Put | MSTR | vol_down/bear | +1 449 | +1 449 | +1 446 | +1 368 | 94.4% | — |
Единственная закономерность, которая вытягивается из проверки и держится на всех 22 кейсах: потеря пропорциональна тому, сколько стоит перейти спред на входе, в процентах от собственной стоимости позиции.
| Спред на входе | Уцелело от заявленного | Типичные структуры | Вердикт |
|---|---|---|---|
| ≤ 4% | 93 – 102% | одна нога на ликвиде; short-premium 2 ноги | торгуется |
| 7 – 10% | 82 – 91% | вертикальные спреды, календарь, 4-ногие дебетные | торгуется с поправкой: считай эдж после спреда |
| ≥ 13% | 78 – 79% | бэкспреды (неравное количество ног) | только если ожидаемый ход в 3+ раза больше спреда |
Посчитай entry_spread_cost() и сравни с тем, на что ты вообще играешь:
Конструкция, границы и факторная экспозиция — из курсового файла, арифметика проверена. Это справочник, а не рекомендация: знак Vega/Theta здесь определён точно, вероятность успеха — нет.
| Структура | Конструкция | Max profit | Max loss | Delta / Vega / Theta |
|---|---|---|---|---|
| Long Call | +1 Call K | неограниченный | уплаченная премия | long / long / short |
| Call Backspread | −1 Call K1, +2 Call K2 (K2>K1), нетто ≈ кредит | неограниченный вверх | ≈ (K2−K1) − кредит, около K2 | long / long / short≈0 |
| Bull Call Spread | +1 Call K1, −1 Call K2, дебет | (K2−K1) − дебет | нетто-дебет | long / ≈0 / ≈0 |
| Bull Put Spread | −1 Put K2, +1 Put K1, кредит | полученный кредит | (K2−K1) − кредит | long / short / long |
| Short Put | −1 Put (K ≤ spot) | полученная премия | K − премия | long / short / long |
| Covered Call | +100 акций, −1 Call (K > spot) | (K − вход) + премия | вход − премия | long / short / long |
| Cash-Secured Put | −1 Put (K ≤ spot) + K×100 наличными | полученная премия | K − премия | long / short / long |
| Long Straddle | +1 Call K, +1 Put K (ATM) | неограниченный | сумма премий | ≈0 / long / short |
| Long Strangle | +1 Call OTM, +1 Put OTM | неограниченный | сумма премий | ≈0 / long / short |
| Inv Iron Butterfly | +ATM straddle, −крылья, дебет | ширина крыла − дебет | нетто-дебет | ≈0 / long / short |
| Inv Iron Condor | +ближние call/put, −дальние крылья, дебет | ширина спреда − дебет | нетто-дебет | ≈0 / long / short |
| Calendar Spread | −1 near, +1 far, тот же K, дебет | ≈ около K на front-экспирации | нетто-дебет | ≈0 / long (back) / long |
| Wheel | CSP → при ассайнменте Covered Call | премии + апсайд до called-away K | акция → 0 минус премии | long (mild) / short / long |
| Iron Butterfly | −ATM straddle, +крылья, кредит | полученный кредит | ширина крыла − кредит | ≈0 / short / long |
| Iron Condor | −OTM put-спред и call-спред, кредит | полученный кредит | ширина − кредит | ≈0 / short / long |
| Short Straddle | −1 Call K, −1 Put K (ATM) | сумма премий | НЕОГРАНИЧЕННЫЙ | ≈0 / short / long |
| Short Strangle | −1 Call OTM, −1 Put OTM | сумма премий | НЕОГРАНИЧЕННЫЙ | ≈0 / short / long |
| Long Put | +1 Put K | K − премия | уплаченная премия | short / long / short |
| Put Backspread | −1 Put K2, +2 Put K1 (K1<K2) | большой до K1 | ≈ (K2−K1) − кредит, около K1 | short / long / short≈0 |
| Bear Call Spread | −1 Call K1, +1 Call K2, кредит | полученный кредит | (K2−K1) − кредит | short / short / long |
| Bear Put Spread | +1 Put K2, −1 Put K1, дебет | (K2−K1) − дебет | нетто-дебет | short / ≈0 / ≈0 |
| Short Call | −1 Call (K > spot), маржа | полученная премия | НЕОГРАНИЧЕННЫЙ | short / short / long |
| Covered Put | −100 акций, −1 Put (K < spot) | (вход − K) + премия | НЕОГРАНИЧЕННЫЙ | short / short / long |
Проверено зондом 2026-08-05 на живом ключе, не из документации.
| Возможность | Состояние | Следствие для бэктеста |
|---|---|---|
| Мёртвые (expired) контракты в reference | есть | прошлое бэктестится; без этого невозможно |
| Дневные бары по контракту | есть, полная история | быстрый грубый проход |
| Минутные бары по контракту | есть, ~200–330/сессию | интрадей-исполнение |
| Исторический NBBO по контракту | есть, с 2022 | исполнимые цены — главное, что снимает риск самообмана |
| NBBO глубже 2022 | нет | 2020 отдаёт бары и принты, но нуль котировок → до 2022 только «оптимистично сверху» |
| Историческая IV / греки | нет | восстанавливаем инверсией Блэка-Шоулза (bs.py); американский стиль даёт смещение IV вниз на глубоких ITM-путах |
| Live греки / IV в snapshot | есть, но фид 15-мин delayed | для live-решений котировки только из TradingApp pipes |
| Индексы (SPX / NDX / VIX) | 403 | индексные опционы на SPX недоступны; ETF-опционы (SPY / QQQ) — есть |
Порядок выбран так, чтобы самая дешёвая проверка стояла первой, а самая дорогая — после того, как дешёвые уже что-то отсеяли. Критерии приёмки — твои собственные, не курсовые.
options_5y_features.parquet (≈105K строк, 5 лет) и Benzinga-календарь отчётов. Здесь term structure из §02 — не наш прогноз, а рыночный, поэтому проверять надо именно остаточный эдж поверх него: IV crush после отчёта уже в цене, вопрос есть ли систематический перекос.groupby(date).sum()), затем × √252. Per-trade Sharpe без дневной агрегации раздувает результат в √N_per_day раз.Всё живёт в tools/options_lab/. Кеш — enrichment_data/options_lab/ (parquet, по контракту и окну).
| Файл | Что делает | Состояние |
|---|---|---|
| massive_options.py | слой данных: контракты (с мёртвыми), бары day/minute, исторический NBBO, snapshot с греками; парсинг OCC-символов; parquet-кеш | работает, зонд пройден |
| bs.py | Блэк-Шоулз, греки, инверсия IV бисекцией | греки сходятся с курсом до 3-го знака |
| cases.py | реестр 23 кейсов курса как машинно-проверяемые спецификации ног + матрица + факторные знаки | 23/23 закодировано |
| engine.py | P&L многоногой позиции в 3 режимах (close / mid / exec), расчёт на экспирации с pin-band, entry_spread_cost() | воспроизводит курс 22/22 |
| vol_regime.py | ATM IV-ряд, IV rank / percentile, realized vol, VRP, term structure, метка режима | работает; пороги 70/30 НЕ калиброваны |
| verify_cases.py | прогон всех кейсов → research_results/options_matrix_case_verification.csv | работает |
Запуск проверки: python tools/options_lab/verify_cases.py · отдельный кейс: python tools/options_lab/engine.py "Long Straddle" · IV-ряд: python tools/options_lab/vol_regime.py NVDA 2026-04-01 2026-05-29