Проверяйте торговые гипотезы на настоящем стакане,
а не на сглаженных свечах

Платформа записывает стакан с частотой один снапшот в секунду, складывает его в хранилище (ClickHouse как слой сырья, Oracle как DDS с партиционированием), проверяет качество данных и считает бэктест так, чтобы результат можно было воспроизвести через месяц. Ниже — живой дашборд и реальные цифры из архива.

Стакан: 50 bid + 50 ask 27 025 снапшотов за день 2 702 498 уровней за день ClickHouse + Oracle Airflow 6 проверок качества

Дашборд

Слева — живой стакан с биржи (Finam Trade API, обновление каждые 5 секунд). Справа и ниже — архив: реальная запись за 17 апреля 2026, восстановить её заново нельзя, потому что API отдаёт историю только за последний год.

Живой рынок подключение…

Инструмент Bid / Ask Спред, ₽ 1 контракт Имбаланс
загрузка…
— клик по строке — стакан инструмента

Стакан: — —

—
—
Bid 1
—
Ask 1
—
Спред, ₽ на контракт
—
В тиках
—
Bidобъём
Askобъём
контракт —
—

Архив: спред за сессию 17.04.2026

средний спред за минуту, ₽ —

Архив: имбаланс стакана

имбаланс top-10: (bid−ask)/(bid+ask) +1 = только покупки, −1 = только продажи

Итоги дня реальные данные

—загрузка…

Качество данных: что нашлось в записи

Проверки не исправляют данные, а фиксируют расхождения. «Подогнать» значение под ожидание — значит спрятать дефект, а потом построить на нём стратегию.

ПроверкаЧто ищетНайденоВажность
загрузка…
Главная находка: перекрёстный стакан и неполная глубина сработали на одном и том же моменте — 2026-04-17 10:00:16. bid 77 018 при ask 77 016 и 98 уровней вместо 100: при записи потерялись два уровня покупки, и вершина книги «съехала» выше продажи. Соседние снапшоты нормальные (спред 1 и 3 ₽). Это не рыночное событие, а гонка при съёмке — и именно такие места ломают бэктест, если их не видеть.

Что такое алготрейдинг

Это торговля не руками, а по алгоритму: правила входа и выхода записаны в код, и код исполняет их без участия человека — одинаково в понедельник утром и в пятницу вечером, без усталости, страха и желания «отыграться».

01

Руками — это как?

Смотрит человек на график и решает: «здесь куплю, там продам». На решение влияют новости, настроение, вчерашний убыток и мысль «ещё немного подожду». Два одинаковых дня — два разных решения по одному и тому же графику.

02

По алгоритму — это как?

Правило записано заранее и однозначно: «если объём покупок в стакане превышает объём продаж на первых десяти уровнях в 2,5 раза и тренд вверх — покупать, выходить при откате на N пунктов». Один и тот же вход — всегда одно и то же действие.

03

Зачем так делать

Алгоритм можно измерить: сколько сделок, какая доля прибыльных, какая просадка, сколько съедают комиссии. Решение руками измерить нельзя — его можно только запомнить и потом спорить, «повезло» или «работает».

Одна проблема, и она главная. Написать бота — это несложно, и именно поэтому их пишут все. Настоящая задача одна: найти алгоритм, который приносит прибыль не один раз случайно, а устойчиво — после комиссий, проскальзывания и на данных, которых разработчик не видел при настройке.

Проверка на истории — один из способов понять, рабочий ли алгоритм

Правила записывают в код и «прогоняют» по прошлому: как повела бы себя стратегия, если бы торговала год назад. Это называют бэктестом.

  1. Берут историю, а не воспоминания. Не «я помню, что тут был рост», а запись цен и объёмов с датой и временем — такая, чтобы её нельзя было переписать задним числом.
  2. Прогоняют алгоритм по прошлому. Сделка за сделкой, по тем же правилам, что будут в реальности: тот же размер позиции, те же стопы, те же издержки.
  3. Считают результат и риски. Не только «сколько заработал», но и максимальную просадку — сколько было бы больно по дороге, и сколько забрали комиссии.
  4. Сравнивают с простым эталоном. Если «просто купить и держать» дало больше — алгоритм не нужен, и честнее сказать это сразу.
  5. Проверяют на данных, которых не видели. Настроил на 2024-м — проверь на 2025-м. Хороший результат только на том отрезке, где настраивал, значит почти ничего.
Почему история — «один из способов», а не гарантия. Прошлое не обязано повториться, а хороший бэктест легко получить случайно. Типичные ловушки: подглядывание в будущее (правило тайно знает цену закрытия), выжившие (тестируем на бумагах, которые дожили до сегодня, — а разорившиеся выпали), забытые издержки (комиссия и проскальзывание превращают плюс в минус) и подгонка параметров (перебрали тысячу вариантов и взяли лучший — это уже не проверка, а поиск совпадения). Поэтому проверка на истории отвечает не «будет ли прибыль», а «есть ли основания считать, что алгоритм не бессмысленный».

Отсюда и задача этой платформы: дать честную историю и честный счёт, чтобы гипотезу можно было проверить, а не «почувствовать». Живой стакан и архив выше — это как раз те данные, на которых такая проверка делается.

Как это выглядит на практике: проверили три гипотезы

Мы не будем показывать «прибыльную стратегию» — её нет. Вместо этого покажем, как выглядит честная проверка: три гипотезы на реальной записи стакана за 10 торговых дней (287 240 снапшотов, 28 723 987 уровней), с издержками и проверкой на данных, которые не участвовали в настройке.

Гипотеза 1 день: train 1 день: test 10 дней (главное) Вердикт
А. Перевес объёма в стакане → вход в ту же сторону,
удержание 1–2 минуты
145 сделок
+200 ₽
+1,38 ₽/сделка
110 сделок
−570 ₽
−5,19 ₽/сделка
2 723 сделки
−8 061 ₽
1 из 10 дней в плюсе
t = −4,01
мертва
значимо теряет
Б. То же, но удерживать 20 минут
(амортизировать издержки)
12 сделок
+543 ₽
+45,25 ₽
8 сделок
−54 ₽
−6,69 ₽
не проверялась
мало сделок
мертва
12 сделок — не статистика
В. Тренд по средней цене
(пересечение SMA 10/60), удержание 10 минут
23 сделки
+302 ₽
+13,15 ₽
15 сделок
+190 ₽
+12,70 ₽
397 сделок
−4 112 ₽
2 из 10 дней в плюсе
t = −2,47
значимо убыточна
один день обманул
ПОЧЕМУ А УМЕРЛА

Издержки больше сигнала

Сигнал по стакану на горизонте одного снапшота даёт в среднем 0,18 ₽ движения, а один круг «туда-обратно» стоит 3–4 ₽ (комиссия плюс спред). Разница в 20 раз — это не «стратегия плохая», это арифметика.

КАК ОДИН ДЕНЬ ОБМАНОЛ

Было «+190», стало «−4 112»

На одном дне гипотеза В дала плюс на обеих половинах — и выглядела кандидатом. На десяти днях она даёт −4 112 ₽, прибыльных дней 2 из 10, значимость t = −2,47. То, что на одном дне было лучшим параметром (удержание 600), на десяти стало худшим.

ЧТО ПОКАЗАЛО ОБРАЩЕНИЕ

Возврат к среднему — тоже нет

Если тренд значимо теряет, логично развернуть: продавать на пересечении вверх. Разворот даёт +1 730 ₽ и 7 из 10 дней в плюсе, но значимость t = 1,03 — не проходит порог даже без поправки на число проверенных гипотез. Рынок «анти-моментум», но заработать на этом после издержек не выходит.

Чего мы не проверяли и почему. Заработок на спреде (маркет-мейкинг) выглядит очевидным: спред 1–2 ₽ берётся постоянно. Но у нас снимки стакана, а не поток сделок и не позиция в очереди — мы не знаем, исполнится ли наша лимитка. Смоделировать «я всегда покупаю по bid» значит гарантировать себе прибыль на бумаге: в реальности лимитка исполняется прежде всего тогда, когда цена идёт против нас. Для честной проверки нужны тиковые данные сделок.
Итог честно: рабочей стратегии на этих данных получить не удалось. Из четырёх проверенных гипотез две достоверно теряют деньги, одна не отличается от нуля. Это нормальный результат исследования — и он ценнее красивого графика, который развалился бы на первом же месяце реальной торговли.

Подробный разбор с кодом, всеми 72 комбинациями перебора, equity curve, разбивкой по отрезкам дня и результатами по каждому из 10 дней — в репозитории проекта (market_dwh/backtest/). Масштаб данных: 10 дней, 287 240 снапшотов, 28 723 987 уровней стакана, загруженных в хранилище. Для сравнения: «просто купить и держать» в эти дни давало от +1 002 ₽ до −1 120 ₽ — обыграть нужно не ноль, а вот это.

Что это за продукт

Инструмент для одного вопроса: стратегия действительно работает или я подогнал её под прошлое? Большинство самодельных ботов умирают не на стратегии, а на данных и на отсутствии воспроизводимости. Здесь закрыты обе части.

01

Запись стакана, а не свечей

Свеча скрывает, что происходило внутри минуты. Стакан с глубиной 50 уровней на сторону показывает спред, плотность и «стены» — то, из чего вообще состоит скальпинг.

02

Хранилище, а не папка с jsonl

Слой сырья в ClickHouse (2,7 млн уровней загружаются за 4 секунды), DDS в Oracle с партиционированием по суткам и PL/SQL-пакетами, витрины для аналитики.

03

Проверки качества

Шесть проверок на каждый день: перекрёстный стакан, глубина, дубли, битые значения, аномальный спред, разрывы записи. Каждая находка — в журнале, ни одна не «исправлена» молча.

04

Воспроизводимый бэктест

Загрузка идемпотентна: повторный прогон за ту же дату даёт ровно те же строки. Перезагрузка дня — 120 секунд вместо 567 за счёт TRUNCATE PARTITION вместо DELETE.

05

Оркестрация, а не «скрипт на удачу»

Airflow DAG: интервал берётся из data_interval_start, а не из «сейчас» — поэтому backfill за прошлые дни даёт те же цифры, что и первый прогон.

06

Честные границы

Платформа не обещает прибыльную стратегию. Она даёт инфраструктуру, на которой гипотезу можно проверить и — чаще всего — опровергнуть.

Как устроен путь данных

От биржевого API до графика на этой странице — пять шагов, каждый проверяемый.

  1. Сбор. Стакан забирается раз в секунду (Finam Trade API, JWT-сессия), пишется как есть: время, цена, объём, сторона. Ничего не сглаживается.
  2. Слой сырья. ClickHouse принимает запись и разбирает её: stg.orderbook_levels, ReplacingMergeTree, партиции по месяцам. 381 МБ → 3,9 секунды.
  3. DDS. Выгрузка в CSV → внешняя таблица Oracle (ORACLE_LOADER) → партиционированный по суткам dds_orderbook_levels через direct-path insert в PL/SQL-пакете.
  4. Проверки и витрины. Пакет считает минутные агрегаты (спред, имбаланс, mid) и прогоняет шесть проверок качества. Найденное пишется в dq_issues.
  5. Сверка. Один и тот же расчёт делается независимо в ClickHouse и Oracle: 586 минут и средний спред 2,757 ₽ совпадают — это и есть проверка, что витрина не врёт.

Данные: что реально есть

Цифры измерены, а не оценены. Их можно пересчитать — код и SQL открыты.

27 025снапшотов стакана за день
2 702 498уровней за день
100уровней в книге (50/50)
586минут торговой сессии
1 ₽мода спреда (29 % времени)
2 ₽медиана спреда
13,4×сжатие в колонках
27находок проверок качества
Про «живой» дашборд. Верхний блок — действительно живой: стакан приходит с биржи прямо сейчас. Графики ниже — реальная запись за 17.04.2026, потому что Finam отдаёт историю стакана только за последний год, а записи старше года не хранит. Мы показываем это различие явно: подмена архива потоком — первое, на чём ловят «торговые платформы».

Связаться

Пишите, если нужен разбор данных, хранилище или проверка стратегии на истории.