Блог им. YuriyNikolaev_357

Я научил компьютер предсказывать движения акций на Московской бирже — вот что получилось

Предупреждение сразу: это не инвестиционная рекомендация. Это честный рассказ о том что работает, что не работает, и почему.


Зачем вообще это делал

Каждый кто торгует на бирже знает эту ситуацию: открываешь Пульс — там пятьдесят мнений по одной акции, половина противоречат друг другу. Telegram-каналы с сигналами публикуют «КУПИТЬ SBER» без объяснений и без истории — угадали или нет никто не проверяет.

Я разработчик. Данные с Московской биржи бесплатны. Библиотеки для машинного обучения — тоже. Логичный вывод: сделать систему которая принимает решения по данным, а не по чьему-то мнению.

Главное правило которое я поставил себе с первого дня: всё логировать заранее, ничего не менять задним числом. Предсказание записывается утром до открытия торгов, результат проверяется вечером по факту.


Что такое машинное обучение — простыми словами

Многие слышали этот термин но не очень понимают что за ним стоит. Объясню на примере.

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

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

В моём случае программа смотрит на данные по акции за последние годы: цена открытия, цена закрытия, объём торгов, цена на нефть, курс доллара и ещё около пятидесяти параметров. И учится отвечать на вопрос: «Через пять дней цена вырастет, упадёт или останется примерно на месте?»


Как я проверял что модель не просто «зазубрила» данные

Это ключевой вопрос в машинном обучении. Вернёмся к аналогии с ребёнком.

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

В моей системе я делаю так:

  • Беру данные за последние три года
  • Обучаю модель на первых двух с половиной годах
  • Последние шесть месяцев полностью прячу от модели во время обучения
  • Потом проверяю — как модель предсказывает эти «спрятанные» шесть месяцев

Это называется OOS-тест (от английского Out-Of-Sample — «вне выборки»). Простыми словами: проверка на данных которых модель никогда не видела. Если результат хороший — есть шанс что система работает по-настоящему, а не просто запомнила прошлое.


Как измеряется качество — что такое Sharpe

Допустим модель сделала десять сделок за шесть месяцев. Семь оказались прибыльными, три убыточными. Но этого недостаточно для оценки — важно ещё насколько стабильно система зарабатывает.

Представьте двух игроков в казино:

  • Первый выигрывает понемногу каждый день, иногда теряет, но в целом стабильно идёт вверх
  • Второй раз в месяц срывает большой куш, но в остальное время теряет деньги

Оба могут показать одинаковую итоговую прибыль, но первый явно надёжнее.

Коэффициент Шарпа (Sharpe ratio) — это математическая формула которая измеряет именно эту «надёжность заработка». Упрощённо: прибыль делится на разброс результатов.

  • Sharpe выше 2.0 — хорошо
  • Sharpe выше 1.0 — приемлемо
  • Sharpe ниже 0 — система теряет деньги

Результаты за последние шесть месяцев

Все цифры — на данных которые модель не видела при обучении. Учтена комиссия брокера 0.2% с каждой сделки.

Акция Sharpe Доходность Сделок
Т-Банк 5.72 +5.35% 9
Сбербанк 4.01 +1.47% 10
Газпром 2.40 +2.14% 10
ЭсЭфАй 1.20 +7.31% 20
ВТБ -0.16 -2.42% 7

Честно о том что не работает

ВТБ — три разных периода тестирования, три раза отрицательный результат. Модель хорошо «выучила» исторические данные, но на новых данных не работает. Это называется переобучение — как ребёнок который запомнил конкретные фотографии но не понял общий принцип «что такое кошка». Пока оставил в системе с предупреждением.

Новости — подключил восемь Telegram-каналов (Смартлаб, РБК, БКС и другие), собирал тональность публикаций. Оказалось бесполезным — рынок отыгрывает новости быстрее чем я их успеваю обработать на дневных данных.

Я проверил дополнительно насколько устойчив результат во времени. Для этого я делил историю на девять последовательных 

периодов и проверял каждый отдельно¹. Честный вывод: стабильный результат только у Сбербанка. Высокие цифры по другим тикерам могут быть случайным совпадением конкретного периода. Это неприятная правда — но её важно признавать.

¹ Этот метод называется walk-forward validation — «скользящая проверка». Представьте что вы учитесь предсказывать погоду: сначала учитесь на январе-марте и проверяете апрель. Потом учитесь на январе-апреле и проверяете май. И так далее — каждый раз добавляете новые данные к обучению.


Как это работает каждый день

Каждый рабочий день в 09:30 (за двадцать минут до открытия Московской биржи) система:

  1. Скачивает свежие данные — цены, объёмы, курсы валют, цену нефти
  2. Рассчитывает около пятидесяти показателей по каждой акции
  3. Спрашивает у модели: «что будет через пять дней?»
  4. Публикует сигнал в Telegram с вероятностями каждого исхода

Вечером в 19:00 система проверяет что случилось с ценой и записывает результат — угадала или нет.

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


Почему это может быть полезно даже если не торгуете активно

Сигнал — это не команда «немедленно купить». Это дополнительная информация для размышления. Если система говорит BUY с вероятностью 58% — значит по мнению алгоритма шансы роста немного выше среднего. Принимать решение всегда вам.

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

Данная публикация является личным мнением автора. Мнение владельца сайта может не совпадать с мнением автора.
627
12 комментариев
прикольно удачи тебе
avatar
Gladiator_Spiculus, спасибо!))

Не может быть у вас

Sharpe 5.72  при доходности +5.3%

потому что сейчас БЕЗрисковая ставка 14.5% а потому Sharpe у вас ОТРИЦАТЕЛЬНЫЙ и возможно -6%

 

avatar

Beach Bunny, справедливое замечание — вы правы что я не уточнил какой именно Sharpe публикую. Поясню.

Я использую упрощённый Sharpe без вычета безрисковой ставки — это стандартная практика в алготрейдинге и бэктестинге, где цель измерить стабильность стратегии, а не сравнение с депозитом. Такой Sharpe показывает соотношение доходности к волатильности торговых результатов.

Формула которую использую:

 
<code>Sharpe = (mean_return / std_return) × √252</code>

Если применить вашу логику с безрисковой ставкой 14.5% (~0.057% в день):

  • T-Банк: +5.35% за 6 месяцев → ~+0.049% в день
  • Безрисковая ставка за тот же период: ~7.25%
  • Избыточная доходность: отрицательная

Вы правы — против депозита результат отрицательный. Это честно и я должен был указать это явно.

Почему тогда публикую такой Sharpe? Потому что задача системы — не побить депозит прямо сейчас, а найти статистически устойчивый паттерн. Высокий Sharpe без rf говорит что система торгует стабильно, без больших просадок. При снижении ставки ЦБ соотношение изменится.

Допустим модель сделала десять сделок за шесть месяцев.
Мало сделок. Огромная дисперсия.

Акция
Sharpe
Доходность
Сделок
Т-Банк
5.72
+5.35%
9
Сбербанк
4.01
+1.47%
10
Газпром
2.40
+2.14%
10

Это всё на уровне шума. Опять же из-за малого количества сделок.

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

Спрашивает у модели: «что будет через пять дней?»
При расширении горизонта прогноза ошибка растёт экспоненциально.

Сигнал — это не команда «немедленно купить». Это дополнительная информация для размышления.
Какой-то черный ящик что-то предсказал. Практического толку от этого ноль:)

Михаил, все три замечания по делу. Отвечу по каждому.

1. Мало сделок — огромная дисперсия. Абсолютно верно. 9-10 сделок за 6 месяцев — это статистически незначимо. Доверительный интервал для Sharpe при таком размере выборки огромный. Я должен был написать это явно в статье, а не прятать в оговорках. Считайте что эти цифры — первичное наблюдение, не доказательство.

2. Новости отыгрываются за 5 минут. Согласен — и именно поэтому я новостной сигнал выкинул. Sentiment из RSS дал нулевую feature importance на дневных данных. Это честный результат который я описал. На дневных данных работает не новость, а последствия новости — изменение объёмов, относительной силы, уровней. Это другой механизм.

3. Горизонт 5 дней — ошибка растёт. Верно что ошибка растёт с горизонтом. Но на коротком горизонте (1-2 дня) на дневных данных сигнал полностью тонет в шуме — это тоже проверял. 5 дней — компромисс между сигналом и шумом, не утверждение что прогноз точный.

Вы правы в главном: при 9-10 сделках говорить о Sharpe 5.72 как о доказанном результате — некорректно. Это наблюдение на малой выборке. Именно поэтому я веду публичный трек-рекорд — чтобы через 6-12 месяцев реальной торговли был статистически значимый результат.

Сейчас система работает три недели в продакшне. Смотреть на неё через год будет честнее.

Играйся сколько хочешь.
Это он тебя научил! И не предсказывать, а сливать! 
avatar
на коротком горизонте (1-2 дня) на дневных данных сигнал полностью тонет в шуме
Раз в третий на СЛ пишу, как стоит делать. Проверял в 2018-м.
1. Просите агента найти 30 признаков на графике в дне текущем, которые существенно влияют на волатильность следующего дня. Можете и сами накреативить такие признаки.
2. Составляете распределение закрытий следующего дня относительно закрытия текущего дня по каждому признаку. Задаётесь границами величины этого отклонения в обе стороны. Так, чтобы края распределения оставались статистически значимыми. Всю середину ВЫКИДЫВАЕТЕ, как шум.
3. Получается 30 триггеров. Попали в текущем дне на какие-то из них, ставите на открытии дня в соответствующую сторону. Обычно, если не тишина, то сразу 2-3 показывают в одну сторону.

А проверка заключалась в том, что если возникало описанное, то за следующий день цена в 55-60% случаев действительно продвигалась в указываемом направлении. Не обязательно прямо на величину границы распределения, но на сколько-нибудь.

avatar

svgr, спасибо — это по существу.

Идея правильная и близка к тому что я делаю, но с другим горизонтом. У меня по сути то же самое: признаки на текущем дне → предсказание движения через N дней. Разница в деталях.

Ваш подход интересен тем что вы явно отсекаете «середину распределения» как шум и торгуете только хвосты. Это по сути asymmetric threshold — торговать только при высокой уверенности. У меня что-то похожее есть через confidence threshold, но не так жёстко сформулировано.

55-60% при случайном уровне 50% — это небольшой, но реальный edge если он стабилен. Главный вопрос: держится ли он сейчас в 2026-м? Рынок 2018 года и рынок после 2022-го — очень разные режимы.

Два вопроса если не секрет: — Какие из 30 признаков оказались наиболее значимыми? Технические или объёмные? — Проверяли ли на данных после 2022-го?

Буду думать как адаптировать этот подход — однодневный горизонт с жёсткими порогами выглядит перспективнее чем то что я сейчас делаю на 5 днях.

Юрий Николаев, я в 2022-м отложил это в сторону ради другой идеи, совсем с другим подходом. И ММВБ не торгую, не проверяю. Признаки были технические, придуманные по собственному разумению того, что должно бы работать. То есть не стандартные. Но простые. Можно посмотреть в файлах в течение лета и сообщить.
А так, для иллюстрации из всем известного, похожего: «если сегодня выросло более чем на ..., то и завтра вырастет».
avatar

Читайте на SMART-LAB:
Фото
USD/CAD: У покупателей развязаны руки, есть ли хоть небольшой шанс у медведей?
Канадский доллар тестирует уровень сопротивления 1.3969, показывая минимальные попытки отбоя. Если сегодня или завтра торги закроются разворотным...
Фото
Цена результата, о которой никто не рассказывает
Всем Привет, на связи Иван Кондратенко. Трейдер Проплайв/Prop Live и ведущий Трейдер ТВ. Сегодня поговорим о цене результата. О ней редко говорят...
Фото
Российский рынок отскакивает от минимумов года. Будет ли второе погружение?
💬 Инвестиционный стратег ВТБ Мои Инвестиции Станислав Клещёв: Индекс Мосбиржи коснулся дна октября 2025 года, опустившись к 2484...
Конспект Мозгового штурма. Инсайды с ПМЭФа. Weekly №120
Доброго дня дорогие товарищи. Сегодня у нас был традиционный мозговой штурм. Делюсь итогами штурма и инсайдами с ПМЭФа.

теги блога Юрий Николаев

....все тэги



UPDONW
Новый дизайн