Время после нового года решил провести с пользой и окунуться в машинное обучение. Заняться Machine Learning — и посмотреть получится что‑то или нет с российским рынком акций на Московской бирже.

Моей целью было построить такую систему, которая будет учиться на истории и в перспективе торговать лучше чем случайное блуждание 50/50. Но из‑за комиссий и спреда подобные блуждания изначально отрицательны — чтобы выйти в плюс надо как минимум покрывать комиссии.

Если говорить о результатах очень кратко, то технически всё работает, но вот финансовый результат на грани безубыточности.

Если Вы только интересуетесь этой темой Вы можете посмотреть какие‑то шаги в моей статье, а если Вы уже опытный разработчик подобных систем, то можете подсказать что‑нибудь в комментариях.

Причём вся эта работа выглядит совершенно не так как показывается в фильмах про уолл‑стрит: фактически это написание скриптов и монотонный запуск и всё происходит полностью локально на компьютере.

Скриншот VS Code открытым деревом проекта
Скриншот VS Code открытым деревом проекта

Охота за данными

Вообще данные очень важны. Иначе получается что мусор на входе просто перетекает в мусор на выходе. 

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

Потом беру два API — одно от брокера, а второе API, предоставляющее информацию по всем юридическим лицам России — это API DaData. У каждой акции ведь есть ИНН компании. Используя оба этих API — оба бесплатных кстати — обогащаю каждую запись дополнительными сведениями.

Фрагмент файла tickers_full_market.json с общим список тикеров
Фрагмент файла tickers_full_market.json с общим список тикеров

После этого скачиваю котировки акций с Московской биржи. И загружаю три индекса: IMOEX, IMOEX2, RTSI, RGBI.

Для этого скачиваю минутки — они готовые и сразу в архивах через API брокера — можно очень быстро скачать полностью все бумаги.

С индексами сложнее. Брокерский API не отдавал историю по IMOEX и RGBI, видимо, из‑за ограничений лицензии биржи (привет, MOEX AlgoPack). Пришлось писать парсер для прямого API Московской биржи (ISS MOEX) — скорость гораздо медленнее, но я скачиваю тоже минутки. Скачать все доступные минутки с IMOEX, IMOEX2, RTSI, RGBI занимает около 20 минут.

Котировки индекса
Котировки индекса

Работа со временем

Я начал работу с того, что выделил три интересующих меня таймфрейма. 15 минут, 1 час и 1 день, основной 1 час. 

Написал скрипт который преобразует архивы с минутками от API брокера в файлы с котировками нужных таймфреймов.

Итерация 1,3,4: временнЫе бары (обычные)

Сначала я просто агрегировал минутки в 15 минут, 1 час и 1 день через скрипт, но рынок неравномерен. Возможно для ML‑модели временные свечи могут быть очень шумные, так как содержат разное количество информации.

Скрипт normalization_quotes_stock.py который читает 1-минутные архивы (ZIP) из quotes/1min_zip и агрегирует данные в 15min, 1h, 1d
Скрипт normalization_quotes_stock.py который читает 1-минутные архивы (ZIP) из quotes/1min_zip и агрегирует данные в 15min, 1h, 1d

Итерация 2: свечи рублевого объема

Потом я временно перешёл к событийным барам. Новая свеча формируется не по времени, а когда проходит фиксированный объем в рублях, например, 50 млн руб., но для разных акций этот порог разный, потому что рассчитывается динамически. Разделил их по условным классам:

  • A: порог выше.

  • B: порог ниже.

  • C: отбрасываются.

Скрипт который создаёт из минутных котировок свечи рублевого объема и классифицирует бумаги по классам
Скрипт который создаёт из минутных котировок свечи рублевого объема и классифицирует бумаги по классам

Учитель для робота. Разметка

Как объяснить машине, что такое «хорошая сделка»? Рынок может продолжать рост, но перед этим выбить по стопу.

Книга Маркос Лопез де Прадо «Машинное обучение: алгоритмы для бизнеса»
Книга Маркос Лопез де Прадо «Машинное обучение: алгоритмы для бизнеса»
Книга «Машинное обучение: алгоритмы для бизнеса»
Привет, Хаброжители! Маркос Лопез де Прадо делится тем, что обычно скрывают, — самыми прибыльными ал...
habr.com

Для установки цели я использовал тройной барьер по де Прадо:

  • Верхний барьер (Take Profit): Цена + N×ATR

  • Нижний барьер (Stop Loss): Цена - M×ATR

  • Вертикальный барьер (Time Limit): Если прошло 100 баров, а цена никуда не пришла — выходим.

Скрипт расставляет метки:

Метка 1: сработал Take Profit.

Метка 0: вышло время, выход в ноль (минус комиссия).

Метка -1: сработал Stop Loss, потеря денег.

Фрагмент в Visual Studio Code
Фрагмент в Visual Studio Code

Глаза модели: инженерия признаков

Я использовал CatBoost (Categorical Boosting) это библиотека машинного обучения с открытым исходным кодом от «Яндекса», основанная на градиентном бустинге над деревьями решений. Я не подаю сырые цены (OHLCV: Open (цена открытия), High (максимальная цена), Low (минимальная цена), Close (цена закрытия) и Volume (объем торгов)), так как они не стационарны, потому что цена 100 ₽ в 2010 и 100 ₽ в 2024 — это разные сущности, а использую только относительные величины. 

Я старался подавать именно Log Returns (логарифмические доходности), потому что Log returns аддитивны и симметричны: падение на 50% и рост на 100% имеют одинаковый масштаб в логарифмах.

Сами признаки, в разных итерациях по разному было:

  • Качество импульса: не просто «цена выросла», а как она выросла. Использую автокорреляцию и эффективность тренда.

  • Микроструктура: что происходило внутри этой свечи рублевого объема? Какая концентрация объема?

  • Межрыночные связи: как актив ведет себя относительно индекса Мосбиржи и индекса гособлигаций RGBI.

  • Классика: RSI (нормализованный через Z‑score), расстояния до скользящих средних.

Файл для генерации признаков и разметки
Файл для генерации признаков и разметки

Моделирование

Для того чтобы заниматься ML все инструменты у меня были: компьютер 32 Гб оперативки с видеокартой GPU 16 Гб, Python как основной язык, Docker чтобы не зависеть от капризов драйверов, Numba для ускорения расчётов, Linux для администрирования Docker контейнеров.

Нейросети как консультант: как я нашел и заказал ПК без подсветки для локальной работы с ИИ
Внимание, знатоки! Если вы профессионально разбираетесь в компьютерном железе, тонкостях сборки или ...
habr.com

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

Dockerfile
Dockerfile

Делаю это из под Ubuntu, хотя всю разработку веду из‑под Windows.

01_build.sh
01_build.sh

Ещё использую измененную версию пошагового тестирования (Walk‑Forward Optimization), которая используется в трейдинге для поиска и проверки торговых стратегий, но добавляя «очистку» (purging) данных: она избегает перекрытия обучающих и тестовых периодов, чтобы предотвратить подгонку стратегии под шум истории, делая результаты более реалистичными и устойчивыми к будущим изменениям рынка.

Результаты и боль

При просмотре результатов магия машинного обучения быстро испаряется. 

Я учитываю комиссии:

COMMISSION_PCT = 0.04 / 100  # комиссия брокера
SLIPPAGE_PCT   = 0.02 / 100  # проскальзывание  

Каждая сделка автоматически теряет 0,06% или 0,12% на круг для акций. Кажется мелочью, но при сотнях сделок именно эти десятые доли процента превращают модель в убыточную. Модели нужно предсказывать движения >0,3-0,5%, чтобы быть в плюсе.

По качеству прогнозов мой ML стабильно показывает AUC 0,54–0,55. Формально это лучше случайного угадывания (0.50), но до Грааля тут очень далеко. Почему? Даже небольшая ошибка в вероятностях, умноженная на комиссии и шум, быстро съедает весь перевес.

Чтобы понимать, что именно я меряю, важно разобраться в трёх ключевых метриках.

AUC (Area Under the Curve) — это мера того, насколько хорошо модель умеет отличать «хорошие» сделки от «плохих». Если AUC = 0.5, модель — это монетка. Если 0.55 — она угадывает чуть чаще, чем случайность. В вакууме это звучит неплохо, но в трейдинге такого преимущества часто недостаточно, чтобы перекрыть издержки.

Fold — это один из прогонов в Walk‑Forward Optimization. История рынка режется на последовательные отрезки: на одном модель учится, на следующем тестируется. Каждый такой отрезок — отдельный fold. Это имитация реальности: мы всегда торгуем на будущем, которого модель «не видела». Поэтому один fold может быть прибыльным, а следующий — убыточным, просто потому что режим рынка поменялся.

Тесты
Тесты

Precision (точность) — это ответ на вопрос: «если модель сказала „покупай“, как часто она оказывается права?». Это критично для торговли, потому что даже модель с неплохим AUC может генерировать кучу ложных сигналов, которые будут съедать депозит комиссиями и стоп‑лоссами.

И вот здесь появляется самая болезненная часть. На одном из фолдов я получаю красивую Equity Curve, где капитал растёт. 

График fold_2_best_equity
График fold_2_best_equity

На другом — та же самая модель превращает счёт в “пилу”: заработали на тренде, потом долго и мучительно всё отдали на боковике.

График fold_3_best_equity
График fold_3_best_equity

Когда я писал этот текст мне в голову пришло, а что если модель обучать на максимизацию финансового показателя, такого как Коэффициент Шарпа?

Заключение: вопросы к залу

Я проделал некоторую работу, но результаты пока выглядят не особо приятными.

Мои гипотезы:

  1. Ошибка в методологии?

  2. Мало данных? 

  3. Предсказывать не направление, а волатильность? 

  4. Перейти на более высокие таймфреймы (4H, 1D), где комиссия съедает меньшую долю движения?

  5. Нужно использовать данные из стакана (Order Book)? С получением истории стакана для частного лица большие проблемы. Бесплатно доступен лишь очень ограниченный набор инструментов.

  6. CatBoost слишком прост, нужны трансформеры?

Я занимаюсь Machine Learning (ML), когда система учится на таблицах. Но есть ведь ещё Deep learning (глубокое обучение) когда идёт анализ больших объёмов данных и выявления сложных закономерностей автономно. Но боюсь для моей задачи слишком мало данных. Наверное только на истории стаканов OrderBook будет работать.

Google Maps для биржевого стакана: пишем визуализатор данных Московской биржи на Python
Обычный трейдер смотрит на свечной график, но свеча — это уже тень прошлого, постфактум. Между тем н...
habr.com

Приглашаю в комментарии: кто реально запускал Machine Learning на Мосбирже в плюс? Или просто опытных людей. Где я свернул не туда?

Не сдерживайте себя — напишите комментарий — буду рад любой критике в комментариях.

Автор: Михаил Шардин
? Моя онлайн‑визитка
? Telegram «Умный Дом Инвестора»

13 января 2026 г.

Комментарии (20)


  1. ValeriyPusk
    13.01.2026 01:02

    Вот это да.

    Краткий ответ:

    1) Потому что не работают деревья\бустинги (почему - читайте публикации)

    2) Не работают прочие Optune/Scikit-learn

    3) В HFT\на биржах уже читают новости

    4) И еще 1000 ньюансов, связанных с машинным обучением

    Просто удивительно, правда? )


  1. Master_Yoda_810
    13.01.2026 01:02

    Пытался давно писать робота для торговли. Довольно быстро понял, что нельзя заставить железяку предвидеть будущее. А если ты умеешь угадывать будущее сам - то и робот не нужен.

    Попытки обучения на истории - это просто подгонка решения под имеющийся ответ. Отличный способ избавиться от излишка денег.


    1. empenoso Автор
      13.01.2026 01:02

      Это ведь не попытка увидеть будущее - предполагается что ищутся неэффективные закономерности в прошлом.


    1. Andnet
      13.01.2026 01:02

      Нормально боты работают. Уже год. . И все намного проще чем у автора.


      1. urvanov
        13.01.2026 01:02

        Курсы открой по написанию таких ботов. Ещё больше заработаешь. И без риска.


    1. Shoman
      13.01.2026 01:02

      Можно найти некоторые закономерности которые человек не видит или они на небольших тф (соответственно человек не может их обработать) плюс, человек не может сидеть круглосуточно соответственно будет пропускать входы и тем ломать всю математику.

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


  1. urvanov
    13.01.2026 01:02

    Вы бы ещё гадание на кофейной гуще использовали бы для торговли на бирже


  1. Space_Surfer
    13.01.2026 01:02

    Как правильно заметили выше, бустинги не работают на таких временных рядах. На рынке действительно есть циклы, но они не периодичны. Что бы найти такое, нужно очень много торговать "руками" и делать кучу разметок ,только тогда начинаешь замечать их. И если и применять ML в чистом виде, без знаний трейдинга, то нужно смотреть в сторону трансформеров) а вообще это очень философская тема и тут можно очень много всего обсуждать )


    1. ValeriyPusk
      13.01.2026 01:02

      Бустинги вообще почти не работают (не то что бы на временных рядах) :)


  1. Edwward
    13.01.2026 01:02

    Почитайте про хаотические системы(теорию). Станет понятно , почему больше 0,5 не получится.


    1. Robastik
      13.01.2026 01:02

      На самом общем уровне жизнь не хаос, а ровно наоборот. То есть живая деятельность, в отличие от, уменьшает энтропию. Разумная - тем более.


  1. debagger
    13.01.2026 01:02

    Единственный, кто стабильно зарабатывает на биржевых торгах, это брокер.



    1. urvanov
      13.01.2026 01:02

      Скрытый текст

      +1. Иначе бы этот кто-то стал бы самым богатым человеком в мире.


  1. Robastik
    13.01.2026 01:02

    Ни один институциональный инвестор не торгует руками уже очень давно. Все, что может дать матеша, давно реализовано. То есть все заметные разбалансировки рынка гарантированно отторговываются автоматически. И тут выходит Вася Еmpenoso и такой "а ну-ка сбацаю поиск неиспользованных торговых возможностей и переиграю системы с многолетним опытом и миллиардными ресурсами". Очень упрощенно.


  1. V-LA
    13.01.2026 01:02

    А на сколько система в плюсе в прошлом? Не обязательно тренироваться в реальном времени, можно скачать все данные за прошлые года и пытаться найти ответ в любой точке времени. Отличная тренировка, нет?

    Имхо, без связи с реальным миром (новости, сделки) очень сложно.

    Имхо2, может быть лучше посмотреть в сторону иностранного рынка.


  1. bbc_69
    13.01.2026 01:02

    Эта система похожа на казино: ты играешь против таких же людей. Твой выигрыш - это чей-то проигрыш, за вычетом комиссии. И если ты догадался применить крутой алгоритм, то надо думать, по ту сторону экрана сделают тоже самое. В пределе, ты будешь получать угадывание в 50, минус проценты.

    Как выше отметили, разбаланировку рынка уже давно отыгрывают автоматы.


    1. debagger
      13.01.2026 01:02

      Плюс еще в этом казино некоторые игроки в сговоре с крупье, а вероятность выпадения сектора на рулетки зависит от распределения ставок на столе.


      1. bbc_69
        13.01.2026 01:02

        Верное замечание. Забыл упомянуть, что есть крупные игроки, которые могут влиять на рынок, а есть то, что нет. Тогда вообще весь анализ идёт мимо.


  1. hardtop
    13.01.2026 01:02

    Если хотите заработать на фондовом рынке - лучше быть мужем Ненси Пелосси. А так -- Вы пытаетесь определить погоду по тому, как деревья качаются: связь есть, но это следствие, а не причина.