Блог им. YuriyNikolaev_357
Предупреждение сразу: это не инвестиционная рекомендация. Это честный рассказ о том что работает, что не работает, и почему.
Каждый кто торгует на бирже знает эту ситуацию: открываешь Пульс — там пятьдесят мнений по одной акции, половина противоречат друг другу. Telegram-каналы с сигналами публикуют «КУПИТЬ SBER» без объяснений и без истории — угадали или нет никто не проверяет.
Я разработчик. Данные с Московской биржи бесплатны. Библиотеки для машинного обучения — тоже. Логичный вывод: сделать систему которая принимает решения по данным, а не по чьему-то мнению.
Главное правило которое я поставил себе с первого дня: всё логировать заранее, ничего не менять задним числом. Предсказание записывается утром до открытия торгов, результат проверяется вечером по факту.
Многие слышали этот термин но не очень понимают что за ним стоит. Объясню на примере.
Представьте что вы учите ребёнка отличать кошку от собаки. Показываете ему 100 фотографий и говорите: «это кошка, это собака, это кошка...». После достаточного количества примеров ребёнок начинает сам определять кто на картинке — даже на фото которых никогда не видел.
Машинное обучение работает так же, только вместо ребёнка — программа, а вместо фотографий — цифры.
В моём случае программа смотрит на данные по акции за последние годы: цена открытия, цена закрытия, объём торгов, цена на нефть, курс доллара и ещё около пятидесяти параметров. И учится отвечать на вопрос: «Через пять дней цена вырастет, упадёт или останется примерно на месте?»
Это ключевой вопрос в машинном обучении. Вернёмся к аналогии с ребёнком.
Если вы проверяете ребёнка на тех же самых фотографиях которые он уже видел — это нечестная проверка. Он просто запомнил ответы. Нужно показать новые фотографии которых он раньше не видел.
В моей системе я делаю так:
Это называется OOS-тест (от английского Out-Of-Sample — «вне выборки»). Простыми словами: проверка на данных которых модель никогда не видела. Если результат хороший — есть шанс что система работает по-настоящему, а не просто запомнила прошлое.
Допустим модель сделала десять сделок за шесть месяцев. Семь оказались прибыльными, три убыточными. Но этого недостаточно для оценки — важно ещё насколько стабильно система зарабатывает.
Представьте двух игроков в казино:
Оба могут показать одинаковую итоговую прибыль, но первый явно надёжнее.
Коэффициент Шарпа (Sharpe ratio) — это математическая формула которая измеряет именно эту «надёжность заработка». Упрощённо: прибыль делится на разброс результатов.
Все цифры — на данных которые модель не видела при обучении. Учтена комиссия брокера 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 (за двадцать минут до открытия Московской биржи) система:
Вечером в 19:00 система проверяет что случилось с ценой и записывает результат — угадала или нет.
Каждое воскресенье публикует отчёт точности за неделю. Всё открыто, задним числом ничего не исправляется.
Сигнал — это не команда «немедленно купить». Это дополнительная информация для размышления. Если система говорит BUY с вероятностью 58% — значит по мнению алгоритма шансы роста немного выше среднего. Принимать решение всегда вам.
Полезно как второе мнение — особенно когда вы уже склоняетесь к какому-то решению и хотите проверить не противоречат ли данные вашей интуиции.
Не может быть у вас
Sharpe 5.72 при доходности +5.3%
потому что сейчас БЕЗрисковая ставка 14.5% а потому Sharpe у вас ОТРИЦАТЕЛЬНЫЙ и возможно -6%
Beach Bunny, справедливое замечание — вы правы что я не уточнил какой именно Sharpe публикую. Поясню.
Я использую упрощённый Sharpe без вычета безрисковой ставки — это стандартная практика в алготрейдинге и бэктестинге, где цель измерить стабильность стратегии, а не сравнение с депозитом. Такой Sharpe показывает соотношение доходности к волатильности торговых результатов.
Формула которую использую:
Если применить вашу логику с безрисковой ставкой 14.5% (~0.057% в день):
Вы правы — против депозита результат отрицательный. Это честно и я должен был указать это явно.
Почему тогда публикую такой Sharpe? Потому что задача системы — не побить депозит прямо сейчас, а найти статистически устойчивый паттерн. Высокий Sharpe без rf говорит что система торгует стабильно, без больших просадок. При снижении ставки ЦБ соотношение изменится.
Это всё на уровне шума. Опять же из-за малого количества сделок.
Основное движение по новостям происходит примерно за 5 минут.
При расширении горизонта прогноза ошибка растёт экспоненциально.
Какой-то черный ящик что-то предсказал. Практического толку от этого ноль:)
Михаил, все три замечания по делу. Отвечу по каждому.
1. Мало сделок — огромная дисперсия. Абсолютно верно. 9-10 сделок за 6 месяцев — это статистически незначимо. Доверительный интервал для Sharpe при таком размере выборки огромный. Я должен был написать это явно в статье, а не прятать в оговорках. Считайте что эти цифры — первичное наблюдение, не доказательство.
2. Новости отыгрываются за 5 минут. Согласен — и именно поэтому я новостной сигнал выкинул. Sentiment из RSS дал нулевую feature importance на дневных данных. Это честный результат который я описал. На дневных данных работает не новость, а последствия новости — изменение объёмов, относительной силы, уровней. Это другой механизм.
3. Горизонт 5 дней — ошибка растёт. Верно что ошибка растёт с горизонтом. Но на коротком горизонте (1-2 дня) на дневных данных сигнал полностью тонет в шуме — это тоже проверял. 5 дней — компромисс между сигналом и шумом, не утверждение что прогноз точный.
Вы правы в главном: при 9-10 сделках говорить о Sharpe 5.72 как о доказанном результате — некорректно. Это наблюдение на малой выборке. Именно поэтому я веду публичный трек-рекорд — чтобы через 6-12 месяцев реальной торговли был статистически значимый результат.
Сейчас система работает три недели в продакшне. Смотреть на неё через год будет честнее.
1. Просите агента найти 30 признаков на графике в дне текущем, которые существенно влияют на волатильность следующего дня. Можете и сами накреативить такие признаки.
2. Составляете распределение закрытий следующего дня относительно закрытия текущего дня по каждому признаку. Задаётесь границами величины этого отклонения в обе стороны. Так, чтобы края распределения оставались статистически значимыми. Всю середину ВЫКИДЫВАЕТЕ, как шум.
3. Получается 30 триггеров. Попали в текущем дне на какие-то из них, ставите на открытии дня в соответствующую сторону. Обычно, если не тишина, то сразу 2-3 показывают в одну сторону.
А проверка заключалась в том, что если возникало описанное, то за следующий день цена в 55-60% случаев действительно продвигалась в указываемом направлении. Не обязательно прямо на величину границы распределения, но на сколько-нибудь.
svgr, спасибо — это по существу.
Идея правильная и близка к тому что я делаю, но с другим горизонтом. У меня по сути то же самое: признаки на текущем дне → предсказание движения через N дней. Разница в деталях.
Ваш подход интересен тем что вы явно отсекаете «середину распределения» как шум и торгуете только хвосты. Это по сути asymmetric threshold — торговать только при высокой уверенности. У меня что-то похожее есть через confidence threshold, но не так жёстко сформулировано.
55-60% при случайном уровне 50% — это небольшой, но реальный edge если он стабилен. Главный вопрос: держится ли он сейчас в 2026-м? Рынок 2018 года и рынок после 2022-го — очень разные режимы.
Два вопроса если не секрет: — Какие из 30 признаков оказались наиболее значимыми? Технические или объёмные? — Проверяли ли на данных после 2022-го?
Буду думать как адаптировать этот подход — однодневный горизонт с жёсткими порогами выглядит перспективнее чем то что я сейчас делаю на 5 днях.
А так, для иллюстрации из всем известного, похожего: «если сегодня выросло более чем на ..., то и завтра вырастет».