ZAPAS — Audit + Day Replay обновлено 2026-04-16

Итоги аудита скоринга и RT-движка простым языком. Плюс вкладка, где можно открыть любой прошедший день и посмотреть, что система советовала торговать.
📋 Что починили
⚖️ Сравнение скоринг ↔ RT
📊 Бэктест 5 лет
🔄 Replay: любой день

TL;DR — что изменилось после аудита

Мы прошли по 14 находкам. Все критичные и важные — закрыты. Оставили только то, что требует новых данных (например, SPY 5-day return — его пока нет в датасете).

Всего находок
14
Исправлено
12
Отложено
2
Unit-тестов прошло
20/20

Что было сломано и как это работает теперь

FIXED CRIT-1 · Фильтр объёма не работал

Было: в скоринге объявили «минимум 5000 акций в PM», но проверку забыли. Тонкие тикеры с десятком акций проходили.

Стало: фильтр реально применяется. Плюс подняли порог до 20 000 — как в RT-движке, чтобы не было расхождений.

FIXED CRIT-2 · RT считал «бары» неправильно

Было: RT считал бар каждый раз, когда между опросами вырастал объём. При опросе раз в 30 сек за полчаса набегало 60+ «баров» вместо 30. Скор завышался.

Стало: считаем уникальные минуты с активностью. Теперь одна минута = один бар, как в истории.

FIXED HIGH-1 · Вход без проверки PM диапазона

Было: если в скоринг приходил тикер без PM high/low (раннее утро), система всё равно назначала направление по одному лишь gap — без проверки «где цена в диапазоне». Это противоречит всей идее конвергенции.

Стало: нет данных о диапазоне → возвращаем SKIP. Лучше пропустить, чем войти вслепую.

FIXED HIGH-2 · WR в таблице не соответствовал реальности

Было: код обещал «BUY A+ = 96.6%, SELL A+ = 97.9%». При полном пересчёте на 5 годах оказалось 71.8% и 83.1% — разница 15-25 процентных пунктов. Мы думали, что торгуем почти без проигрышей, а реально проигрывали каждые 4-5 сделок.

Стало: таблица ZAPAS_WR переписана с честных цифр реального бэктеста (48 391 строк, 10 084 трейда).

FIXED HIGH-3 · RT мог молча перейти на свою версию скоринга

Было: если импорт scoring_zapas_v2 падал, RT использовал свою встроенную формулу, чуть другую. Мы могли торговать на одной модели, а бэктестить на другой — и не знать об этом.

Стало: запасной путь убран. Если основной скоринг не загрузился — это фатальная ошибка, движок падает. Два разных источника истины = багов не избежать.

FIXED HIGH-4 · Gap/ATR давал бесплатный бонус

Было: RT подставлял ATR=1.0 как заглушку. В формуле gap/ATR это значило, что любой гэп ≥2% автоматически получал +1 к score. Много сделок получали лишний балл.

Стало: при ATR ≤ 1.01 фактор пропускается. Никаких фантомных очков.

FIXED MED-2 · Лишняя проверка earnings_dist

Дефолт был 99, а проверка if earnings_dist is not None никогда не срабатывала как False. Убрали мёртвую ветку.

FIXED MED-4 · Flip недоплачивал одну комиссию

Было: при переворотe позиции (BUY → SELL) мы учитывали комиссию старой ноги, но забывали про вход в новую. Результат — P&L был чуть лучше реальности.

Стало: комиссия за вход flip_in теперь записывается сразу. Баланс сходится копейка в копейку.

FIXED LOW-1, LOW-2, LOW-3

  • Нормализация сектора — теперь «Technology», «technology», «Information Technology» считаются одним и тем же.
  • Защита от отрицательного pm_range — если данные битые, не начисляем фантомный бонус.
  • Безопасный snapshot — если тикер не трекался, показываем null, а не фейковый ноль.

Что осталось (не блокирует торговлю)

PENDING MED-3 · SPY 5-day return отсутствует в данных

Trap «SPY 5-day crash < -3%» ждёт spy_5d_ret, но в датасете только 1-day gap. Пятидневный drawdown редко попадает ниже -3% в 1-day gap, поэтому trap почти никогда не срабатывает.

Нужно пополнить enrichment пятидневным ретёрном SPY. Задача на уровне данных, не кода.

PENDING MED-5 · Политика «не дробить BP» не документирована

Если A+ кандидат не помещается в available BP, цикл делает break и даже B+, который мог поместиться, пропускается. Это осознанное решение — не дробить позиции, — но лучше добавить комментарий, чтобы через полгода не удивляться.

Только документация, поведение корректное.

Синхронизация между скорингом и RT-движком

Раньше константы в двух файлах расходились. Теперь всё выровнено. Если что-то меняешь — меняй в обоих местах.

ПараметрscoringRT engineСтатус
Минимальная цена$5$5✓ совпадает
Минимальный |gap|0.5%0.5%✓ совпадает
Минимальный mcap$2B$2B✓ после фикса
Минимальный PM volume20 00020 000✓ после фикса
Минимум PM баров5RT фильтрует по объёму, не по барам
Depth BUY≤ 0.30≤ 0.30✓ совпадает
Depth SELL≥ 0.70≥ 0.70✓ совпадает
Логика направленияgap + pct_in_rangegap + pct_in_range✓ совпадает
Fallback при ошибке скоринганет (raise)✓ после фикса HIGH-3

Реальный бэктест (2021-01 → 2026-04)

Строк
48 391
Сделок
10 084
WR
73.5%
Avg return
+1.99%
Торговых дней
1 057
Минусовых дней
176 (16.6%)

Результаты по грейдам

GradeDirNWR%Avg%Комментарий
A+BUY27371.81.99стабильно выше рынка
A+SELL26083.13.33лучший сегмент
ABUY1 43274.92.40рабочая зона
ASELL1 39478.13.18очень хорошо
B+BUY2 31972.71.51основной объём
B+SELL2 05377.82.60основной объём
BBUY98063.70.23граница окупаемости
BSELL77274.12.09sell работает лучше
CBUY35555.5-0.77минусовая зона, отсекать
CSELL24265.31.50только SELL живёт

Выводы

  • SELL сильнее BUY во всех грейдах (на 3-10 пп WR). Вероятно потому что 2021-2022 было много медвежьих дней.
  • B+ и выше — рабочая зона, 77-83% WR. Основной профит здесь, а не в редких A+.
  • C BUY — отрезать. Среднее -0.77% на трейд.
  • A+ редкий — всего ~2 сделки в неделю, не стоит ждать их специально.

Выбери день в Feb-Apr 2026 и настрой фильтры — увидишь, что ZAPAS советовал торговать в этот день и как эти советы отработали.

Параметры

💡 Фильтры применяются сразу — двигай и смотри результат.
Загрузка данных...