MOO → 10:00 / 10:30 / 11:00 — большой бэктест 2023-08-01…2026-07-31

Вход = аукционный принт открытия (Datum OPG) · выходы = 30-мин бары Massive (close 09:30 = 10:00, close 10:00 = 10:30, close 10:30 = 11:00) · 521,356 трейд-кандидатов · 753 сессий · 2,301 тикеров · медиана 649/день · earnings ±1 день исключены · сплиты исключены · флэт $1K/вход (масштабируется)
Обзор
H1 Гэп стока
H2 ETF на открытии
H3 Bear-режим (USER)
H4 Excess
H5 Выходы + TP/SL
H6-H11 Прочее
Книги топ-N ⭐
Комбо (BH-FDR)
Исполнение (HBBO)
Методология
Sharpe везде считается по дневным доходностям (mean/std × √252), не по сделкам. Значок ? — Sharpe > 5, включён doubt-protocol: смотри N, число дней и OOS.

Кривая PnL (кумулятивно, $)

Кривая учитывает выбранное окно, выход и линейку исполнения. Клик по строке в таблице ниже меняет книгу.

Пресет-книги на текущем фильтре

Сводка: 3 года vs OOS-год vs последний месяц (линейка «агрессор», выход 11:00)

Именно эта таблица отвечает на главный вопрос: держится ли эффект в последнем месяце так же, как на трёх годах.

Как читать

Гэп ETF на открытии = аукционный принт ETF / аукционный клоуз предыдущей сессии − 1. Тот же источник (Datum), что и у стоков, поэтому линейки сопоставимы 1:1.

Гипотеза user: «OPG buy ходят стоки, когда рынок корректируется»

Проверяется четырьмя независимыми определениями медвежьего состояния (все по D-1, без lookahead): позиция SPY относительно MA20/MA50/MA200, просадка от 252-дневного хая, 20-дневная и 5-дневная доходность SPY. Плюс кроссы «гэп × режим». Смотри также линейку hedged — она отвечает, это альфа или просто отскок рынка, который тащит всех.

Выход 10:00 vs 10:30 vs 11:00

Колонка «Лучший» — выход с максимальным avg на текущем окне и линейке.

Вариант TP +7% / SL −1% (hard cutoff 11:00)

Путь считается по H/L трёх 30-мин баров. При касании TP и SL внутри одного бара считаем СТОП первым (консервативно). Внутрибарный порядок неизвестен — это приближение, а не точная симуляция.

Книги «топ-N в день» — то, что реально торгуется

Бакетные метрики в остальных табах считаются по ВСЕМ кандидатам бакета (медиана 660/день) — это оценка эффекта, а не книга. Здесь внутри каждого дня кандидаты ранжируются по сигналу книги (величина гэпа / excess) и берётся топ-3/5/10. Ранжирование — часть правила входа, наведи курсор на строку, чтобы увидеть его. Линейка — net (минус модельный полуспред); точные HBBO-филлы для финальных книг — в табе «Исполнение».

На что смотреть

Avg per-trade положительный, а Sharpe отрицательный — значит прибыль сконцентрирована в нескольких «богатых» днях с большим числом сделок, а типичный день в минусе. Дневная агрегация (равный вес дня) это вскрывает, per-trade средняя — прячет.
Мало дней (маркер «Nд») — Sharpe и t нестабильны, сколько бы сделок ни было: независимых наблюдений столько, сколько дней, а не сделок.

Комбо-хант: 2,416 тестов, BH-FDR 5% → 14 прошло, 7 выжили

«ВЫЖИЛ» = BH-FDR pass И IS avg > 0 И OOS avg > 0 И OOS N ≥ 30 И avg после спреда > 0. Гейты: N ≥ 100, дней ≥ 60. Всё это — полу-in-sample: порог и набор условий выбирались на этих же данных.

⭐ ФИНАЛЬНЫЕ КНИГИ: точный NBBO на ВСЕХ сделках (без выборки)

КнигаОкноВыходNДней WR %Avg last %Avg EXEC %Издержка bps Sh exectpPnL $1KmaxDD
FADE_EXC_top3IS11:001,49050054.0+0.5075+0.308119.40.680.960.337$4,591$-4,356
FADE_EXC_top3L3Y11:002,24275154.7+0.5823+0.384319.90.91.560.119$8,615$-4,356
FADE_EXC_top3LM11:00662250.0+0.4703+0.140433.00.250.070.942$93$-786
FADE_EXC_top3OOS11:0075225156.1+0.7306+0.535120.71.491.490.138$4,024$-1,339
FADE_GAPDN_top3IS11:0080139845.4-0.6050-1.018541.4-2.27-2.850.00464$-8,159$-9,052
FADE_GAPDN_top3L3Y11:001,38363047.6+0.0361-0.462244.6-1.41-2.220.0266$-6,392$-9,052
FADE_GAPDN_top3LM11:00572147.4+1.3247-0.676071.4-1.16-0.340.741$-385$-874
FADE_GAPDN_top3OOS11:0058223250.7+0.9200+0.303549.10.210.20.844$1,766$-2,225
FADE_GAPUP6_top3IS11:0088940555.5+1.1680+0.931722.72.012.540.0113$8,283$-3,319
FADE_GAPUP6_top3L3Y11:001,51664455.9+1.0345+0.811522.41.883.010.00272$12,302$-3,319
FADE_GAPUP6_top3LM11:00532047.2+0.3489-0.036438.5-0.03-0.010.994$-19$-726
FADE_GAPUP6_top3OOS11:0062723956.5+0.8453+0.640921.81.651.610.11$4,019$-1,352
FADE_GAPUP6_top3_1000IS10:0088840655.3+0.6273+0.404122.31.371.740.0835$3,588$-2,197
FADE_GAPUP6_top3_1000L3Y10:001,51564555.5+0.4576+0.231322.60.841.350.178$3,504$-2,384
FADE_GAPUP6_top3_1000LM10:00532054.7-1.8972-2.211131.4-4.02-1.130.272$-1,172$-1,610
FADE_GAPUP6_top3_1000OOS10:0062723955.8+0.2173-0.013523.1-0.06-0.050.957$-85$-2,384
FADE_GAPUP_LIQ_top3IS11:0098040556.1+0.6621+0.60435.82.753.480.000555$5,922$-938
FADE_GAPUP_LIQ_top3L3Y11:001,64164055.3+0.5071+0.44036.72.143.410.000688$7,226$-1,040
FADE_GAPUP_LIQ_top3LM11:00582146.5-0.0874-0.17018.3-0.79-0.230.823$-99$-613
FADE_GAPUP_LIQ_top3OOS11:0066123554.2+0.2772+0.19728.00.850.820.411$1,303$-1,040
LIQ10_all_1000IS10:0079027156.0+0.5330+0.427810.52.842.950.00349$3,380$-953
LIQ10_all_1000L3Y10:001,77245954.0+0.3101+0.200311.01.792.410.0162$3,550$-3,907
LIQ10_all_1000LM10:001641542.1-1.3294-1.450312.1-3.57-0.870.399$-2,378$-3,581
LIQ10_all_1000OOS10:0098218852.4+0.1307+0.017311.30.00.00.997$170$-3,907
LIQ10_all_1100IS11:0079127059.0+1.1089+1.03277.63.974.115.27e-05$8,169$-836
LIQ10_all_1100L3Y11:001,77345857.2+0.7355+0.64738.82.913.920.000102$11,477$-2,951
LIQ10_all_1100LM11:001641546.3-0.4416-0.609816.81.170.280.78$-1,000$-2,951
LIQ10_all_1100OOS11:0098218855.8+0.4347+0.33699.80.960.830.407$3,308$-2,951
LIQ10_top3_1100IS11:0046527057.9+1.3172+1.23358.44.014.154.5e-05$5,736$-558
LIQ10_top3_1100L3Y11:0089645856.6+0.9245+0.824310.02.984.026.74e-05$7,385$-1,034
LIQ10_top3_1100LM11:00371543.2+0.7176+0.345737.21.130.280.787$128$-684
LIQ10_top3_1100OOS11:0043118855.2+0.5007+0.382811.81.150.990.321$1,650$-1,034
SPYDN_WEAK_LONG_top10IS11:002302356.5+1.8080+1.633417.54.971.50.147$3,757$-944
SPYDN_WEAK_LONG_top10L3Y11:003303360.0+2.0858+1.913917.26.552.370.024$6,316$-944
SPYDN_WEAK_LONG_top10LM11:0020265.0+3.3690+3.7144-34.5nannannan$743$0
SPYDN_WEAK_LONG_top10OOS11:001001068.0+2.7247+2.559116.613.182.630.0276$2,559$-264
Это главная таблица для решения «торговать / не торговать»: каждая сделка закрыта по РЕАЛЬНОМУ квоту на момент выхода (LONG в bid, SHORT в ask), вход — аукционный принт. Колонка «Avg EXEC» — исполнимая доходность на сделку.

Точные HBBO-филлы по книгам (Stage B — реальный NBBO на момент выхода)

КнигаВыходN книгиN выборки Avg last %Avg exec %Издержка bps (сред.)Издержка bps (мед.) half-spread фактhalf-spread модельWR exec % Sh lastSh exec
GAPDN_LONG11:0077,0935,999+0.1499+0.06018.954.935.513.8749.20.19-0.41
EXC_UP_SHORT11:0025,1896,000+0.0892-0.01099.895.355.933.8751.00.610.09
BEAR_DIP_LONG11:0025,3296,000+0.0706-0.01458.515.556.043.8749.61.380.53
BEAR200_LONG11:0050,4605,999+0.0484-0.01746.584.565.033.8750.60.54-0.37
GAPUP_LONG11:0080,9706,000+0.0472-0.02697.314.655.033.8747.5-0.09-0.53
EXC_DN_LONG11:0023,8926,000+0.1001-0.055215.475.886.453.8748.6-0.14-1.03
GAPUP_LONG_100010:0080,9706,000+0.0102-0.059311.066.927.156.5545.7-0.51-1.12
GAPUP_SHORT11:0080,9706,000-0.0472-0.12287.614.705.033.8749.40.09-0.36
GAPDN_SHORT11:0077,0935,999-0.1499-0.24959.905.225.513.8746.7-0.19-0.92
GAPDN_SHORT_100010:0077,0936,000-0.1046-0.293414.557.467.836.5544.9-0.58-1.95
Выход исполняется агрессивно: LONG отдаёт в BID, SHORT забирает в ASK. Вход не корректируется — MOO-ордер получает клиринговую цену аукциона. Меряется парная разница (last − exec), поэтому выборка 6K сделок на книгу даёт очень точную оценку издержки даже для больших книг. Сравнение колонок «факт» и «модель» — валидация модели полуспреда из p4.

Полуспред NBBO (Massive /v3/quotes)

19,778
квотов в выборке
6.52
медиана bps · 10:00
4.97
медиана bps · 11:00
5.73
медиана по популяции 11:00
0.92с
лаг квота (медиана)
8.95с
лаг p90
Вход MOO исполняется в аукционе — MOO-ордер получает ровно OPG-принт, спреда не платит. Спред платим ОДИН раз на выходе маркет-ордером: LONG выходит в bid, SHORT крывается в ask. Поэтому линейка «агрессор» = raw − полуспред (не два пересечения, как было в ZAPAS).

Полуспред по ячейкам (медиана bps)

ЦенаADV$ 20дhalf-spread bps
<10<25M9.06
<1025-75M7.97
<1075-200M7.16
<10200-600M6.29
<10600M+6.12
10-25<25M9.13
10-2525-75M6.15
10-2575-200M4.23
10-25200-600M3.48
10-25600M+3.09
25-50<25M148.84
25-5025-75M7.87
25-5075-200M5.16
25-50200-600M2.82
25-50600M+1.9
50-100<25M263.06
50-10025-75M5.02
50-10075-200M6.6
50-100200-600M4.78
50-100600M+2.15
100+<25M297.57
100+25-75M357.15
100+75-200M9.68
100+200-600M7.43
100+600M+4.56
Выборка стратифицирована по (год × цена × ADV$ × |гэп|), поэтому редкие ячейки перепредставлены — в модель попадают медианы ячеек, а применяются они популяционно.

Кросс-валидация цен выхода

30-мин бары Massive против локального 1-минутного стора (intraday_1m_gap_days_v2, пересечение 2025-04-15…2026-07-31): медиана расхождения 0.00 bps, p90 0.00 bps, доля расхождений >10 bps — 0.05% на 10:00 и 0.00% на 11:00 (n≈4.1K / 4.0K). Конвенция подтверждена: close 30-мин бара 09:30 = цена 10:00, close бара 10:30 = цена 11:00.

Санити-чек входа

Аукционный принт Datum OPG обязан лежать внутри диапазона 30-мин бара 09:30 (±0.5%). Не прошло 0.54% строк — выброшены. Это же проверка на несовпадение raw/adjusted: бары тянутся с adjusted=false, чтобы быть в одной линейке с raw-принтами Datum.

Методология и ограничения

Источники

  • Вход MOO и база гэпа — Datum /opg_and_clo: аукционный принт открытия (opg) и аукционный клоуз (clo). HARD RULE проекта: MOO/OPG/CLO берём только из Datum; daily o Massive = первый принт сессии, а не аукцион.
  • Выходы 10:00/10:30/11:00 — Massive 30-мин агрегаты, adjusted=false, пагинация по next_url (сервер режет ~2000 баров на страницу).
  • Гейты ликвидности, MA, режим — локальный daily_4yr_ohlcv (grouped daily).
  • NBBO — Massive /v3/quotes, последний квот строго до момента выхода.
  • Earnings — Benzinga через Massive (67K событий 2023-06…2026-08). Сплиты/v3/reference/splits.
  • VIX — FRED VIXCLS (I:VIX не входит в подписку Massive).

Юниверс (PIT, пересчитывается каждый день по D-1)

  • US common stock (референс Massive, включая делистнутые — без survivorship bias)
  • ADV20 ≥ 2M шаров (HARD RULE), prev close ≥ $5, левериджные ETF в чёрном списке
  • Медиана 649 кандидатов в день, 2,301 уникальных тикеров за 3 года

Что исключено

  • earnings ±1 торговый день (решение user) — вырезано 24,032 ticker-days
  • сплиты: ex-date ∈ [D−1, D+1] — 113 ticker-days (иначе raw-цены дают фейковый гэп 50-100%)
  • строки, где OPG вне диапазона бара 09:30 (0.54%) — защита от рассогласования линеек

Известные ограничения — читать перед тем, как торговать

  • Комбо-хант полу-in-sample. Условия и пороги выбраны на этих же данных. BH-FDR и IS/OOS-сплит снижают риск, но не устраняют его. Единственная честная проверка — форвард.
  • Дивиденды не вырезаны. Ex-div день даёт механический гэп-даун на размер дивиденда. Для див-тяжёлых имён это шум в бакетах «гэп-даун 0-1%».
  • Аукционный имбаланс. MOO-ордер получает клиринговую цену аукциона, но большой собственный ордер её двигает. Ёмкость не моделировалась — размер позиции нужно ограничивать долей от объёма аукциона (calc_median_opg_volume_20d).
  • TP/SL — приближение. Внутрибарный порядок H и L неизвестен, стоп считаем первым.
  • Mcap не используется — PIT-истории капитализации за 3 года нет, а snapshot-поля дают lookahead. Размер представлен через PIT ADV$.
  • Sharpe. Считается по дневным доходностям равновзвешенной корзины. Любое значение > 5 помечено и требует проверки N, числа дней и OOS (doubt-protocol проекта).
  • ADV из grouped daily = SIP consolidated включая odd-lots и FINRA-принты. Для гейта «доступная ликвидность» правильнее v_lit, но за 3 года его нет — пороги калиброваны на этой линейке.