Рабочий мануал · пересобрано из курсового файла · данные Massive

Матрица
стратегийOptions 2.3 — что из этого торгуется

Источник Options 2.3 — Матриця стратегій.html
Проверено 2026-08-05
Данные api.massive.com · NBBO 2022+
Движок tools/options_lab/

§01 Вердикт

Курсовый файл состоит из двух очень разных частей, и обращаться с ними надо по-разному. Таксономия — рабочая. Кейсы — не доказательство.

N = 1

Главное

Арифметика курса точна. Но 22 из 23 кейсов — победители, и у каждой стратегии ровно один пример.

Я пересчитал все 23 кейса независимо, из данных Massive: контракт за контрактом, нога за ногой, день за днём. В режиме «отметка по закрытию бара» движок воспроизвёл все 22 пригодных кейса точно — до цента: подсумок, пик прибыли, максимальную просадку. Греки на входе тоже сошлись до третьего знака. Никто ничего не выдумывал.

Проблема не в честности вычислений, а в отборе. 22 победителя из 23 при N=1 на стратегию — это подпись подобранных иллюстраций. Так показывают, как конструкция работает, когда она работает. Это нормально для обучения и непригодно как доказательство, что она работает в среднем.

кейсов
23
в плюсе
22
N на стратегию
1
воспроизведено точно
22/22
медиана исполнения
94.6%
Собственное правило пользователя, которое здесь нарушено. N ≥ 5 — минимум даже для одной live-рекомендации; N ≥ 100 — для standalone-ресёрча; N ≥ 20 для 4-way срезa. Здесь N = 1. Ни одна цифра из кейсов не должна попадать в сайзинг, в скоринг или в дашборд как оценка вероятности.

Что из этого использовать

§02 Матрица, с проградуированной вертикалью

Самая большая практическая дыра курса: вертикальная ось не имеет шкалы. «Рост / Стабильная / Падение Vol» — ни окна, ни порога, ни источника. А выбор строки решает, ты в long-vega или в short-vega, и это доминирует над результатом всего, что в ячейке. Ниже — матрица с меткой «сколько от заявленного уцелело после исполнения» на каждой структуре.

Медвежий
Нейтральный
Бычий
Рост Vollong vega
покупаешь vol
  • Long Put 100%
  • Put Backspread 78%
покупаешь vol
  • Long Straddle 93%
  • Long Strangle 88%
  • Inv Iron Butterfly
  • Inv Iron Condor 84%
покупаешь vol
  • Long Call 95%
  • Call Backspread 79%
Стабильная Vol≈ neutral vega
vega гасится
  • Bear Call Spread 91%
  • Bear Put Spread 82%
theta-carry
  • Wheel n/a
  • Calendar Spread 85%
vega гасится
  • Bull Call Spread 100%
  • Bull Put Spread 99%
Падение Volshort vega
продаёшь vol
  • Short Call 99%
  • Covered Put 94%
продаёшь vol
  • Iron Butterfly 96%
  • Iron Condor 95%
  • Short Straddle 97%
  • Short Strangle 96%
продаёшь vol
  • Short Put 94%
  • Covered Call 102%
  • Cash-Secured Put 96%

Процент = исполнимый результат кейса / заявленный результат. Это не винрейт и не качество стратегии — лишь сколько съедает спред на конкретном примере. Inv Iron Butterfly без числа: заявленный результат отрицательный, поэтому доля не читается (убыток вышел меньшим, −$20 против −$187).

Как измерять вертикальную ось

Исторической IV в подписке Massive нет — греки и IV живут только в live-snapshot. Поэтому IV приходится восстанавливать самому: инвертировать Блэка-Шоулза из цены контракта. Это реализовано в bs.py + vol_regime.py. Проверка: греки, восстановленные так для INTC 100C, сошлись с теми, что печатает курс, до третьего знака.

Два операционных прочтения строки, потому что они отвечают на разные вопросы:

ПрочтениеЧто измеряетКогда валидноСлабое место
Mean-reversionIV rank / percentile в собственном диапазоне за 252 дняСпокойный режим без приблизившегося катализатораНа хвостах врёт: во время vol-экспансии IV rank «высокий» каждый день, и продажа vol там — это продажа под поезд
Term structurefront IV минус back IVКогда перед близкой экспирацией есть событие (отчёт)Это прогноз рынка, не твой — эдж обязан быть в чём-то другом
Backwardation (front > back) = рынок видит близкое событие и ждёт падения vol после него → short-vega строка. Contango = наоборот.
Порогов 70/30 по IV rank не калибровано. Они стоят в коде как retail-дефолт, чтобы пайплайн ехал от начала до конца, а не потому, что показали себя. Пока калибровка не сделана собственным walk-forward, любой результат, обусловленный режимом, тащит этот порог как свободный параметр.

§03 Проверка: заявленное против исполнимого

Три способа отметить позицию стоят рядом намеренно, потому что на опционах разница между ними и есть результат. close — по закрытию бара, так считает курс: неисполнимо, потому что закрытие бара это принт, который достался кому-то другому. mid — середина NBBO: предполагает, что лимитка по мидлу всегда исполняется. exec — покупаешь по ask, продаёшь по bid; то, во что стоит верить.

СтратегияТикерЯчейка Заявленоclosemidexec exec / заявл.спред@вход
Long CallINTCvol_up/bull+1 421+1 421+1 410+1 35095.0%1.2%
Call BackspreadINTCvol_up/bull+795+795+795+63079.2%13.1%
Bull Call SpreadMUvol_flat/bull+2 719+2 719+2 785+2 71599.9%3.8%
Bull Put SpreadMUvol_flat/bull+1 011+1 011+1 065+1 00599.4%5.6%
Short PutTSLAvol_down/bull+759+759+721+71594.2%1.0%
Cash-Secured PutTSLAvol_down/bull+479+479+465+46096.0%1.1%
Covered CallTSLAvol_down/bull+3 002+3 002+3 004+3 065102.1%
Long StraddleAMDvol_up/neutral+4 711+4 711+4 778+4 39093.2%1.8%
Long StrangleAMDvol_up/neutral+4 898+4 898+4 605+4 28587.5%2.7%
Inv Iron ButterflyAMDvol_up/neutral−187−187+173−20н/д9.2%
Inv Iron CondorAMDvol_up/neutral+761+761+680+64084.1%10.4%
Calendar SpreadMSFTvol_flat/neutral+292+292+253+24985.3%8.9%
WheelAAPLvol_flat/neutral+1 364
Iron CondorNVDAvol_down/neutral+291+291+284+27694.8%3.3%
Iron ButterflyNVDAvol_down/neutral+515+515+551+49395.7%3.1%
Short StraddleNVDAvol_down/neutral+880+880+904+85396.9%1.9%
Short StrangleNVDAvol_down/neutral+475+475+459+45696.0%1.0%
Long PutCARvol_up/bear+26 960+26 960+28 290+27 080100.4%3.8%
Put BackspreadCARvol_up/bear+23 780+23 780+22 600+18 56078.0%19.7%
Bear Put SpreadCOINvol_flat/bear+811+811+1 123+66582.0%8.6%
Bear Call SpreadCOINvol_flat/bear+732+732+734+66991.4%7.0%
Short CallMSTRvol_down/bear+815+815+844+80799.0%4.1%
Covered PutMSTRvol_down/bear+1 449+1 449+1 446+1 36894.4%
Все суммы — доллары на одну позицию. close равен заявленному в 22 из 22 кейсов → кодирование ног и путь ценообразования в движке корректны. Wheel — последовательность из 4 сделок, а не одна позиция, поэтому позиционный P&L не определён. Данные: research_results/options_matrix_case_verification.csv.
Одна поправка, сделанная по ходу. Первый прогон давал Inverse Iron Condor 30% вместо 84%: движок заставлял позицию платить спред за закрытие того, что и так рассчитывается на экспирации. Заявленный выход кейса ($1 759 при ширине крыла $17.50 = максимум $1 750) как раз и означает расчёт, а не закрытие на рынке. Исправлено: нога, доживающая до своей экспирации и стоящая дальше 0.5% от страйка, рассчитывается по внутренней стоимости без спреда. Внутри этой полосы — pin risk, неизвестно, назначат ли шорт, поэтому позицию надо закрывать и спред платить.

§04 Гейт спреда — главное рабочее правило

Единственная закономерность, которая вытягивается из проверки и держится на всех 22 кейсах: потеря пропорциональна тому, сколько стоит перейти спред на входе, в процентах от собственной стоимости позиции.

Спред на входеУцелело от заявленногоТипичные структурыВердикт
≤ 4%93 – 102%одна нога на ликвиде; short-premium 2 ногиторгуется
7 – 10%82 – 91%вертикальные спреды, календарь, 4-ногие дебетныеторгуется с поправкой: считай эдж после спреда
≥ 13%78 – 79%бэкспреды (неравное количество ног)только если ожидаемый ход в 3+ раза больше спреда
Гейт перед любым входом

Посчитай entry_spread_cost() и сравни с тем, на что ты вообще играешь:

  • Для defined-risk структур: спред на входе должен быть ≤ 15% от максимально возможной прибыли, а не от стоимости позиции. Inverse Iron Condor платил $112 лишних при максимуме $752 — это 15% всего апсайда, отдано ещё до открытия.
  • Для направленных: спред ≤ ⅓ ожидаемого движения премии. Иначе ты платишь за вход больше, чем зарабатываешь на правильном прогнозе.
  • Количество ног умножает проблему: 4-ногую структуру ты пересекаешь 4 спреда на вход. Но если все ноги в одной экспирации и ты оставляешь её рассчитаться — за выход не платишь. Это разница в 20+ п.п. результата, и она в твоих руках.
  • Не заменяй bid/ask серединой. Тот же расчёт по last-print вместо NBBO уже однажды превратил ZAPAS из +$22K в −$62.7K за 6 месяцев. На опционах спред в разы больше.

§05 Спецификации 23 структур

Конструкция, границы и факторная экспозиция — из курсового файла, арифметика проверена. Это справочник, а не рекомендация: знак Vega/Theta здесь определён точно, вероятность успеха — нет.

СтруктураКонструкцияMax profitMax lossDelta / Vega / Theta
Long Call+1 Call Kнеограниченныйуплаченная премияlong / long / short
Call Backspread−1 Call K1, +2 Call K2 (K2>K1), нетто ≈ кредитнеограниченный вверх≈ (K2−K1) − кредит, около K2long / 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
WheelCSP → при ассайнменте 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 KK − премияуплаченная премияshort / long / short
Put Backspread−1 Put K2, +2 Put K1 (K1<K2)большой до K1≈ (K2−K1) − кредит, около K1short / 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
Четыре структуры с неограниченным убытком — Short Straddle, Short Strangle, Short Call, Covered Put. Курс подаёт их наравне с остальными, с примечаниями «риск неограничен». В кейсах все четыре в плюсе, потому что NVDA и MSTR в те три-десять дней не рванули. Это не свойство структуры, это выборка из одного дня. Для них сайзинг должен считаться не от премии, а от сценария хвоста — и твоё собственное правило «NO overnight SHORT» сюда ложится прямо.

§06 Что дают наши данные, а что нет

Проверено зондом 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) — есть
Типичные спреды ATM, замеренные: SPY 0.6–0.9%, AAPL 2.4–3.8%, TSLA 4.6%. На OTM-недельках доходит до 70%.

§07 Программа бэктеста — в каком порядке

Порядок выбран так, чтобы самая дешёвая проверка стояла первой, а самая дорогая — после того, как дешёвые уже что-то отсеяли. Критерии приёмки — твои собственные, не курсовые.

  1. Оверлей на собственные эджи. Наибольшая отдача, потому что сигнал уже валидирован — вопрос только в вехикле. Берём готовые сетапы (AMC10 18:00→MOO, PM→MOO 9:10, MOO 9:55) и на каждом историческом сигнале оцениваем опционную структуру по NBBO в момент сигнала и в момент выхода. Вопрос один и конкретный: выживает ли эдж в +1.27%/трейд на акции, если исполнять его опционом со спредом 3–5%? Гейт спреда из §04 применяется к каждому входу.
  2. Short-premium систематически. Вторая по дешевизне проверка: ячейка vol_down/neutral имеет наименьшие спреды (0.98–3.3%) и четыре структуры. Механическое правило на фиксированном наборе ликвидных имён, фиксированный DTE, фиксированная дельта страйков, недельная каденция, 2022→2026. Это классическое «платит ли продажа премии» — вопрос, на который данные отвечают.
  3. Earnings-контур. У нас уже есть options_5y_features.parquet (≈105K строк, 5 лет) и Benzinga-календарь отчётов. Здесь term structure из §02 — не наш прогноз, а рыночный, поэтому проверять надо именно остаточный эдж поверх него: IV crush после отчёта уже в цене, вопрос есть ли систематический перекос.
  4. Матрица как целое. Самое дорогое и самое позднее: 9 ячеек × режим × направление требует и классификатора режима (§02), и калибровки его порогов. Пока пороги 70/30 не калиброваны собственным walk-forward, любой результат здесь тащит их как свободный параметр — то есть это ещё не ответ.
Критерии приёмки (твои HARD RULES)
  • N: ≥ 100 для standalone-фактора, ≥ 50 для 3-way среза, ≥ 20 для 4-way. N ≥ 5 — абсолютный минимум даже для одной live-рекомендации.
  • Окна: 2 месяца + OOS от 2026-03-31 (v3.6-эра). Глубже не смотрим без отдельной причины.
  • Sharpe > 5 → DOUBT PROTOCOL. Сперва проверить аннуализацию: агрегировать по дням (groupby(date).sum()), затем × √252. Per-trade Sharpe без дневной агрегации раздувает результат в √N_per_day раз.
  • Валидация: walk-forward + sign-flip + block-bootstrap + BH-FDR. Одна in-sample группировка = data-snooped first look, не эдж.
  • Всё на raw P&L — слиппедж в аудиты не добавляем. Но спред в опционах это не слиппедж, а цена: он в NBBO и входит в расчёт.
  • Свежесть: если max(date) в данных старше суток — ABORT, не показывать частичные результаты.

§08 Код

Всё живёт в 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.pyP&L многоногой позиции в 3 режимах (close / mid / exec), расчёт на экспирации с pin-band, entry_spread_cost()воспроизводит курс 22/22
vol_regime.pyATM 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