Разработка ML-моделей для прогнозирования цен на фондовом рынке

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

1. Сбор, очистка и предварительная обработка финансовых временных рядов

Сбор, очистка и предварительная обработка финансовых временных рядов

Добро пожаловать на курс «Разработка ML-моделей для прогнозирования цен на фондовом рынке». Это первая и, пожалуй, самая важная статья нашего цикла. Почему? Потому что в мире Data Science существует золотое правило: «Garbage In, Garbage Out» (Мусор на входе — мусор на выходе).

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

Что такое финансовый временной ряд?

Временной ряд — это последовательность данных, измеренных через равные промежутки времени. В финансах это обычно история цен на активы (акции, валюты, криптовалюты).

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

Формат данных OHLCV

Стандартом де-факто для финансовых данных является формат OHLCV. Это агрегированные данные за определенный период (таймфрейм: минута, час, день).

| Атрибут | Расшифровка | Описание | | :--- | :--- | :--- | | Open | Цена открытия | Цена первой сделки за период | | High | Максимум | Самая высокая цена сделки за период | | Low | Минимум | Самая низкая цена сделки за период | | Close | Цена закрытия | Цена последней сделки за период (наиболее важна для анализа) | | Volume | Объем | Количество акций/контрактов, проданных за этот период |

!Визуализация формата OHLCV в виде графика японских свечей, где каждая свеча отображает Open, High, Low и Close за один период

Сбор данных

Для начала работы нам нужен источник данных. В профессиональной среде используются платные терминалы (Bloomberg, Refinitiv), но для обучения и разработки собственных моделей отлично подходят открытые API и библиотеки.

Популярные источники: * Yahoo Finance (yfinance) — самый популярный бесплатный источник. Отлично подходит для дневных данных. * Alpha Vantage — предоставляет API для получения исторических данных. * Биржевые API (Binance, MOEX) — если вы работаете с конкретной биржей.

Пример того, как выглядит загрузка данных на Python (библиотека yfinance):

Очистка данных: подводные камни

Сырые данные редко бывают идеальными. Вот основные проблемы, с которыми вы столкнетесь.

1. Пропуски в данных (Missing Values)

Финансовые рынки не работают 24/7 (кроме крипты). Есть выходные и праздники. В данных могут появляться «дыры» (NaN).

> Важно: В финансах нельзя просто удалять строки с пропусками или заполнять их средним значением по всему датасету, так как это нарушит временную структуру.

Лучшая стратегия — Forward Fill (ffill). Мы берем последнее известное значение и переносим его вперед. Логика проста: если цена не менялась (биржа закрыта), значит, она осталась такой же, как в момент закрытия.

2. Корпоративные события (Splits & Dividends)

Это самая коварная ловушка для новичков. Представьте, что акция стоила 100 долларов. Компания провела сплит (дробление) 2 к 1. Теперь у вас две акции по 50 долларов.

Для алгоритма это выглядит как обвал цены на 50% за один день! Чтобы избежать этого, нужно использовать Adjusted Close (Скорректированная цена закрытия). Она пересчитывает исторические цены так, будто сплит произошел в прошлом, сохраняя процентные изменения.

Предварительная обработка (Preprocessing)

Модели машинного обучения плохо работают с «сырыми» ценами. Акция может стоить 10 долларов, а через год — 2000. Такой разброс значений мешает обучению нейросетей.

Переход к доходностям (Returns)

Вместо абсолютной цены мы используем относительное изменение цены — доходность. Это делает ряд более стационарным (его статистические свойства, такие как среднее и дисперсия, меньше меняются со временем).

#### Простая доходность (Simple Return)

Формула простой доходности выглядит так:

Где: * — доходность в момент времени . * — цена в текущий момент времени . * — цена в предыдущий момент времени .

#### Логарифмическая доходность (Log Return)

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

Где: * — логарифмическая доходность. * — натуральный логарифм. * — цена в текущий момент. * — цена в предыдущий момент.

!Сравнение графика абсолютной цены и графика доходностей, демонстрирующее стационарность последнего

Масштабирование (Scaling)

Нейронные сети работают эффективнее, когда входные данные находятся в небольшом диапазоне (например, от 0 до 1 или имеют среднее 0 и дисперсию 1).

Два основных метода:

  • Min-Max Scaling (нормализация): сжимает данные в диапазон [0, 1].
  • Standardization (Z-score): делает среднее значение равным 0, а стандартное отклонение равным 1.
  • Формула стандартизации:

    Где: * — стандартизированное значение. * — исходное значение. * — среднее значение выборки (мю). * — стандартное отклонение выборки (сигма).

    Разделение данных: Осторожно, будущее!

    В классическом ML мы часто используем функцию train_test_split с перемешиванием (shuffle=True). В финансах это строго запрещено.

    Если вы перемешаете данные, модель может обучиться на данных из 2022 года, чтобы предсказывать 2021 год. Это называется Look-ahead bias (подглядывание в будущее).

    Данные нужно делить строго хронологически:

  • Train: (например, 2010–2018 гг.) — учим модель.
  • Validation: (2019–2020 гг.) — подбираем параметры.
  • Test: (2021–2022 гг.) — проверяем финальное качество.
  • Заключение

    Мы разобрали первый этап построения ML-системы. Теперь у вас есть понимание того, как собрать данные, почему важен Adjusted Close, зачем нужны логарифмические доходности и как правильно делить выборку. В следующих статьях мы перейдем к созданию признаков (Feature Engineering) и выбору моделей.

    2. Инжиниринг признаков: технические индикаторы и фундаментальные факторы

    Инжиниринг признаков: технические индикаторы и фундаментальные факторы

    В предыдущей статье мы научились собирать и очищать данные. Теперь у нас есть качественный набор OHLCV (Open, High, Low, Close, Volume). Но если мы подадим эти «голые» цифры в модель машинного обучения, результат, скорее всего, будет посредственным. Почему?

    Потому что модель должна не просто видеть цену, а понимать контекст. Растет рынок или падает? Высокая сейчас волатильность или низкая? Перекуплен актив или перепродан?

    Процесс создания переменных, которые помогают модели лучше понимать данные, называется Feature Engineering (Инжиниринг признаков). В финансовом ML признаки делятся на две большие группы: технические и фундаментальные.

    Технические индикаторы

    Технический анализ исходит из предположения, что вся необходимая информация уже заложена в цене и объеме. Мы используем математические формулы, чтобы извлечь из истории цен скрытые паттерны.

    1. Трендовые индикаторы

    Они помогают определить направление движения рынка. Самый простой и популярный пример — Скользящая средняя (Moving Average).

    #### Простая скользящая средняя (SMA)

    SMA сглаживает ценовой шум, показывая среднюю цену за определенный период.

    Где: * — значение простой скользящей средней в момент времени . * — размер окна (период усреднения, например, 14 дней). * — знак суммирования. * — цена закрытия в момент времени (текущая и предыдущие цены).

    Если текущая цена выше SMA, это часто интерпретируется как восходящий тренд.

    #### Экспоненциальная скользящая средняя (EMA)

    Проблема SMA в том, что она одинаково учитывает и вчерашнюю цену, и цену 20 дней назад. EMA придает больший вес последним данным, быстрее реагируя на изменения.

    !Сравнение SMA и EMA на ценовом графике

    2. Осцилляторы (Индикаторы импульса)

    Осцилляторы помогают понять силу движения и определить моменты разворота. Классический пример — RSI (Relative Strength Index).

    Где: * — индекс относительной силы. * — отношение среднего прироста цены к среднему падению за период (обычно 14 периодов).

    Значения RSI колеблются от 0 до 100. * : Актив перекуплен (цена выросла слишком быстро, возможна коррекция вниз). * : Актив перепродан (цена упала слишком сильно, возможен отскок вверх).

    3. Индикаторы волатильности

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

    Популярный инструмент — Полосы Боллинджера (Bollinger Bands). Они состоят из трех линий:

  • Средняя линия: SMA (обычно 20 периодов).
  • Верхняя линия: .
  • Нижняя линия: .
  • Где: * — стандартное отклонение (сигма). * — количество периодов. * — цена в -й период. * — средняя цена за период (мю).

    Когда полосы сужаются, волатильность падает (затишье перед бурей). Когда расширяются — начинается сильное движение.

    Фундаментальные факторы

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

    Макроэкономические показатели

    Эти данные влияют на весь рынок сразу.

  • Процентная ставка ЦБ: Рост ставки обычно давит на акции (кредиты становятся дороже).
  • Инфляция (CPI): Высокая инфляция обесценивает будущие доходы компаний.
  • Цена на нефть/золото: Важно для сырьевых экономик и секторов.
  • Микроэкономические показатели (данные компании)

    Эти данные выходят раз в квартал (отчетность).

    * P/E (Price to Earnings): Отношение цены акции к прибыли на акцию. Показывает, переоценена компания или недооценена. * EPS (Earnings Per Share): Прибыль на одну акцию.

    > Проблема частоты данных: Цены меняются каждую секунду, а P/E — раз в квартал. Чтобы объединить их, мы используем метод «растягивания» (forward fill). Значение P/E за 1-й квартал дублируется для каждого дня 2-го квартала до выхода нового отчета.

    Работа со временем (Time-based Features)

    Финансовые рынки цикличны. Поведение трейдеров в понедельник отличается от пятницы, а декабрь часто бывает месяцем роста («Ралли Санта-Клауса»).

    Мы можем извлечь признаки из даты: * День недели (0–6). * Месяц (1–12). * Квартал (1–4).

    Циклическое кодирование

    Проблема обычных чисел в том, что для модели месяц 12 (декабрь) и месяц 1 (январь) находятся далеко друг от друга (разница 11). Но во времени они соседи.

    Чтобы сохранить цикличность, используют Sin/Cos трансформацию:

    Где: * — новые признаки (координаты на круге). * — тригонометрические функции синус и косинус. * — число Пи (примерно 3.14159). * — текущее значение времени (например, номер месяца от 1 до 12). * — период цикла (для месяцев , для дней недели ).

    !Визуализация того, как Sin/Cos трансформация замыкает временной цикл

    Лаговые признаки (Lag Features)

    Это, пожалуй, самые мощные признаки для прогнозирования временных рядов. Мы просто берем значения из прошлого и подаем их как входные данные для текущего момента.

    Пример создания лагов для цены закрытия (): * (Цена вчера) * (Цена позавчера) * (Цена неделю назад)

    Это позволяет модели напрямую видеть динамику изменений.

    Опасность мультиколлинеарности

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

    Для линейных моделей это критично: они могут начать выдавать нестабильные предсказания. Для деревьев решений (Random Forest, XGBoost) это менее страшно, но все же избыточные признаки замедляют обучение и могут привести к переобучению.

    Совет: Всегда проверяйте корреляционную матрицу ваших признаков и удаляйте те, у которых корреляция близка к 1 (например, ).

    Реализация на Python

    Для расчета технических индикаторов не обязательно писать формулы вручную. Существуют отличные библиотеки, такие как ta (Technical Analysis Library) или pandas-ta.

    Заключение

    Мы превратили сырые данные в богатый набор признаков. Теперь наша модель «видит» тренды через скользящие средние, чувствует перегрев рынка через RSI и понимает сезонность через циклические признаки.

    В следующей статье мы перейдем к выбору архитектуры модели и процессу обучения. Мы разберем, почему для временных рядов часто используют LSTM и GRU, и как правильно настроить валидацию.

    3. Классические алгоритмы ML: от линейной регрессии до градиентного бустинга

    Классические алгоритмы ML: от линейной регрессии до градиентного бустинга

    В предыдущих статьях мы проделали огромную работу: собрали данные, очистили их от шума и создали мощные признаки (технические индикаторы и макроэкономические факторы). Теперь перед нами стоит главный вопрос: как научить компьютер находить закономерности в этих данных?

    Многие новички сразу бросаются изучать сложные нейронные сети (LSTM, Transformers), пропуская классические алгоритмы. Это ошибка. В финансовом мире, где данных часто мало, а шума много, классические модели машинного обучения (Machine Learning) часто превосходят глубокое обучение (Deep Learning) или служат отличным базовым решением (baseline).

    В этой статье мы пройдем путь от простейшей линейной регрессии до мощных ансамблевых методов, которые выигрывают соревнования на Kaggle.

    Постановка задачи: Регрессия или Классификация?

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

  • Регрессия (Regression): Мы пытаемся предсказать конкретное число. Например, цену закрытия завтра (yw_0w_1, w_2, ..., w_nx_1, x_2, ..., x_nY_{pred}N\sumT_i(x)ixf_kF_k(x)kF_{k-1}(x)\etaf_k(x)$ — новое дерево, обученное на ошибках предыдущих.
  • Преимущества бустинга: * Высочайшая точность. * Гибкость настроек.

    Риски: * Легко переобучить, если поставить слишком много деревьев.

    Метрики качества: Как измерить успех?

    В финансах стандартные метрики ML могут вводить в заблуждение. Тем не менее, мы используем их для настройки моделей.

    Для регрессии

    * MSE (Mean Squared Error): Штрафует за большие ошибки. Полезна, если мы боимся сильных промахов. * MAE (Mean Absolute Error): Средняя абсолютная ошибка. Легче интерпретировать (ошибка в долларах или процентах).

    Для классификации

    * Accuracy (Точность): Доля правильных ответов. Осторожно! Если рынок растет 60% времени, модель, которая всегда говорит «Покупать», будет иметь Accuracy 60%, но она бесполезна. * Precision и Recall: Важнее Accuracy. Precision показывает, сколько из наших сигналов «Покупать» были верными.

    > Важно: Финальным судьей всегда является Backtesting (тестирование на истории). Модель может иметь низкую ошибку MSE, но приносить убытки из-за комиссий или неправильного управления рисками.

    Пример кода (XGBoost)

    Вот как просто запустить мощный алгоритм на Python:

    Заключение

    Мы рассмотрели эволюцию алгоритмов от простых линий до сложных ансамблей. Для старта в алготрейдинге Random Forest и Gradient Boosting являются лучшим выбором благодаря их устойчивости и способности находить сложные паттерны.

    Однако, у всех этих моделей есть предел. Они плохо работают с «сырыми» последовательностями данных и не обладают «памятью» в том виде, в котором она нужна для анализа временных рядов. В следующей статье мы перейдем к Нейронным сетям и разберем архитектуры LSTM и GRU, созданные специально для последовательных данных.

    4. Глубокое обучение для трейдинга: LSTM, GRU и архитектуры Трансформеров

    Глубокое обучение для трейдинга: LSTM, GRU и архитектуры Трансформеров

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

    Для классического ML каждая строка данных — это отдельное событие. Модель не знает, что цена, которую она анализирует сейчас, идет сразу после цены, которую она видела шаг назад. Мы пытались компенсировать это созданием лаговых признаков (Lag Features), но это лишь «костыль».

    Сегодня мы погрузимся в мир Deep Learning (Глубокого обучения) и разберем архитектуры, созданные специально для работы с последовательностями: рекуррентные нейронные сети (RNN), их продвинутые версии LSTM и GRU, а также революционный механизм Attention (Внимание), лежащий в основе Трансформеров.

    Почему обычные нейросети не подходят?

    Обычная полносвязная нейронная сеть (Feedforward Neural Network) работает по принципу «один вход — один выход». Она принимает фиксированный вектор признаков и выдает прогноз. В контексте временных рядов это создает две проблемы:

  • Отсутствие контекста: Сеть не помнит, что происходило 10 шагов назад, если мы явно не подадим это на вход.
  • Фиксированный размер входа: Мы не можем подать на вход историю за 5 дней сегодня, а завтра — за 10 дней. Архитектура жестко задана.
  • Рекуррентные нейронные сети (RNN)

    Идея RNN (Recurrent Neural Network) гениально проста: давайте передавать информацию не только от слоя к слою, но и во времени.

    В RNN выход нейрона на текущем шаге зависит не только от текущего входа, но и от его собственного состояния на предыдущем шаге. Это создает своего рода краткосрочную память.

    Математически скрытое состояние обновляется так:

    Где: * — скрытое состояние (память) в момент времени . * — функция активации (гиперболический тангенс), сжимающая значения в диапазон [-1, 1]. * — весовая матрица для предыдущего скрытого состояния. * — скрытое состояние в предыдущий момент времени . * — весовая матрица для текущих входных данных. * — входные данные в момент времени (например, цена и индикаторы сегодня). * — вектор смещения (bias).

    Проблема исчезающего градиента

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

    В итоге сеть отлично помнит, что было вчера, но напрочь забывает, что было месяц назад. Это называется проблемой исчезающего градиента (Vanishing Gradient Problem).

    LSTM: Долгая краткосрочная память

    Чтобы решить проблему памяти, в 1997 году была предложена архитектура LSTM (Long Short-Term Memory). Она работает как конвейер, на котором сидит «менеджер», решающий, какую информацию пропустить дальше, какую запомнить, а какую забыть.

    !Структура ячейки LSTM с механизмом ворот и состоянием ячейки

    Ключевая особенность LSTM — наличие состояния ячейки (Cell State), которое проходит сквозь всю цепочку с минимальными изменениями. Регулируют поток информации три «вентиля» (gates).

    1. Вентиль забывания (Forget Gate)

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

    Где: * — вектор значений от 0 до 1 (0 — забыть полностью, 1 — сохранить). * — сигмоидальная функция активации. * — веса вентиля забывания. * — выход предыдущего шага. * — текущий вход. * — смещение.

    2. Вентиль ввода (Input Gate)

    Решает, какую новую информацию записать в ячейку памяти.

    3. Вентиль вывода (Output Gate)

    Определяет, что именно выдать наружу (в следующий скрытый слой или как предсказание) на основе текущей памяти и входа.

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

    GRU: Упрощенная версия LSTM

    Архитектура GRU (Gated Recurrent Unit) появилась в 2014 году как более легкая альтернатива LSTM. В ней нет отдельного состояния ячейки, а механизмы забывания и ввода объединены.

    В GRU всего два вентиля:

  • Update Gate (Вентиль обновления): Аналог комбинации Forget и Input gate в LSTM.
  • Reset Gate (Вентиль сброса): Решает, сколько прошлой информации нужно забыть.
  • Что выбрать для трейдинга? * LSTM мощнее и лучше работает на очень длинных и сложных последовательностях. * GRU обучается быстрее (меньше параметров) и часто показывает сравнимое качество на небольших датасетах.

    Обычно начинают с LSTM, а если модель слишком тяжелая — пробуют GRU.

    Трансформеры и механизм Attention

    До 2017 года RNN правили миром последовательностей. Но у них была проблема: они обрабатывают данные строго по порядку (шаг 1, шаг 2, шаг 3...). Это медленно и мешает параллельным вычислениям.

    Появление архитектуры Transformer (статья «Attention Is All You Need») изменило всё. Трансформеры отказались от рекурсии в пользу механизма Self-Attention (Само-внимание).

    Как работает Attention?

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

    Механизм Attention позволяет модели на каждом шаге видеть всю последовательность целиком и самой решать, какие прошлые моменты важны для текущего прогноза.

    Формула Scaled Dot-Product Attention:

    Где: * (Query) — запрос (то, что мы ищем, текущее состояние). * (Key) — ключ (метки данных в памяти, с которыми мы сверяем запрос). * (Value) — значение (сама информация, которую мы извлекаем). * — размерность векторов ключей (используется для масштабирования, чтобы градиенты не взрывались). * — функция, превращающая результаты в вероятности (веса внимания).

    В трейдинге Трансформеры позволяют находить сложные паттерны, которые разбросаны во времени и не связаны прямой последовательностью (например, реакция цены на событие, похожее на то, что было 3 года назад).

    Подготовка данных для Deep Learning

    Главная ошибка новичков при переходе от sklearn к tensorflow/pytorch — неправильная форма данных.

    Классические модели (Random Forest) ожидают 2D-матрицу: [Количество примеров, Количество признаков]

    LSTM и Трансформеры ожидают 3D-тензор: [Количество примеров, Длина окна (Time Steps), Количество признаков]

    !Формат 3D-тензора для подачи данных в рекуррентные нейронные сети

    Если вы используете окно в 30 дней и у вас 10 признаков (OHLCV + индикаторы), то один входной образец для сети будет иметь размерность (30, 10).

    Заключение

    Мы прошли путь от простых рекуррентных сетей до современных Трансформеров.

    * Используйте LSTM/GRU, если вам нужно стабильное решение для временных рядов, где важен порядок событий. * Смотрите в сторону Трансформеров, если у вас огромный объем данных и вы хотите найти сложные глобальные зависимости.

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

    5. Валидация моделей, бэктестинг торговых стратегий и метрики качества

    Валидация моделей, бэктестинг торговых стратегий и метрики качества

    Поздравляю! Вы прошли долгий путь: собрали данные, сгенерировали признаки, обучили классические модели и даже поэкспериментировали с нейросетями. У вас есть файл с весами модели, и она выдает предсказания. Готовы ли вы доверить ей свои деньги?

    Если ваш ответ «да», то, скорее всего, вы их потеряете. В финансовом машинном обучении (Financial ML) создание модели — это лишь 20% успеха. Остальные 80% — это валидация и бэктестинг.

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

    Проблема времени: почему стандартная валидация не работает

    В классическом Data Science (например, при распознавании котиков на фото) мы привыкли использовать K-Fold Cross-Validation (Кросс-валидацию по блокам). Мы перемешиваем данные, делим их на 5 частей, учим на 4-х и проверяем на 1-й.

    В финансах это строго запрещено.

    Причина проста: корреляция во времени. Финансовые данные — это последовательность. Если вы перемешаете данные и обучите модель на ценах за 2022 год, а проверите её на ценах за 2021 год, вы совершите ошибку Look-ahead bias (подглядывание в будущее). Модель «выучит» будущее, которого она не могла знать в момент торговли.

    Правильный подход: Walk-Forward Validation

    Единственный верный способ проверки — двигаться строго по хронологии. Мы используем метод Walk-Forward (Скользящее окно).

  • Шаг 1: Обучаем на [Январь-Март], тестируем на [Апрель].
  • Шаг 2: Обучаем на [Январь-Апрель], тестируем на [Май].
  • Шаг 3: Обучаем на [Январь-Май], тестируем на [Июнь].
  • Это имитирует реальный процесс: вы переобучаете модель по мере поступления новых данных.

    !Схематическое изображение процесса Walk-Forward валидации с расширяющимся окном обучения

    Метрики ML против Метрик Торговли

    Дата-сайентисты любят смотреть на MSE (среднеквадратичную ошибку) или Accuracy (точность). Трейдеры смотрят на P&L (Profit and Loss — прибыль и убыток). Эти метрики часто не коррелируют.

    Почему Accuracy обманчива?

    Представьте стратегию: * Рынок растет в 60% случаев. * Ваша модель всегда предсказывает «Рост». * Ваша Accuracy = 60%.

    Звучит неплохо? Но если во время падений (оставшиеся 40%) рынок обваливается сильнее, чем растет, вы потеряете деньги, имея высокую точность.

    Precision (Точность срабатывания)

    В трейдинге нам важнее Precision, чем Recall. Нам не нужно находить все возможности для заработка (Recall). Нам нужно, чтобы когда мы входим в сделку, мы были максимально уверены в успехе.

    Где: * — точность (доля верных срабатываний). * (True Positive) — истинно положительные (модель сказала «Покупать», и цена выросла). * (False Positive) — ложно положительные (модель сказала «Покупать», а цена упала).

    Высокий убивает депозит комиссиями и убытками.

    Финансовые метрики качества

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

    1. Коэффициент Шарпа (Sharpe Ratio)

    Показывает доходность на единицу риска. Это стандарт индустрии.

    Где: * — коэффициент Шарпа. * — доходность портфеля (стратегии). * — безрисковая ставка (например, доходность гособлигаций США, обычно 2-5%). * — стандартное отклонение доходности портфеля (риск/волатильность).

    * : Хорошая стратегия. * : Отличная стратегия. * : Грааль (или ошибка в расчетах).

    2. Максимальная просадка (Maximum Drawdown, MDD)

    Показывает максимальное падение капитала от пика до дна в процентах. Это мера боли, которую вам придется перетерпеть.

    Где: * — максимальная просадка. * — минимальное значение капитала после пика. * — значение капитала на пике перед падением.

    Если у стратегии доходность 100% годовых, но просадка 80%, ни один инвестор не даст вам денег. Вы просто закроете счет на дне падения.

    3. Профит-фактор (Profit Factor)

    Отношение валовой прибыли к валовому убытку.

    Где: * — профит-фактор. * — сумма всех прибыльных сделок. * — сумма всех убыточных сделок (по модулю).

    Значение должно быть больше 1.5–2.0 для устойчивой системы.

    Бэктестинг: Симуляция реальности

    Бэктестинг — это процесс прогона вашей стратегии на исторических данных. Вы пишете код, который «притворяется», что торгует в 2015, 2016... 2023 годах.

    Но здесь кроется главная ловушка новичков: игнорирование трения (Friction).

    Комиссии (Commissions)

    Каждая сделка стоит денег. Биржа берет комиссию (например, 0.1%). Если ваша модель торгует часто (скальпинг), комиссии могут съесть всю прибыль.

    Пример: * Прибыль сделки: +0.15% * Комиссия (вход + выход): 0.2% * Итог: Убыток -0.05%.

    Проскальзывание (Slippage)

    Это разница между ценой, которую вы видели на экране (сигнал модели), и ценой, по которой реально исполнилась сделка.

    Вы хотите купить Apple по 150.00. Вы отправляете ордер. Пока он летит на биржу (миллисекунды), цена становится 150.05. Вы купили дороже. В бэктестах обязательно нужно закладывать проскальзывание.

    !Сравнение кривой доходности стратегии с учетом и без учета транзакционных издержек

    Подводные камни (Biases)

    Даже с правильной валидацией можно обмануть себя.

    1. Ошибка выжившего (Survivorship Bias)

    Если вы берете список компаний из индекса S&P 500 сегодня и тестируете стратегию на их истории за 10 лет, вы совершаете ошибку. Вы игнорируете компании, которые обанкротились и вылетели из индекса за эти 10 лет. Ваша выборка искусственно «успешна».

    Решение: Использовать базы данных, включающие делистингованные (удаленные) акции.

    2. Подгонка (Overfitting / P-hacking)

    Если вы перебрали 1000 комбинаций параметров (размер окна RSI, количество слоев LSTM) и нашли одну, которая дает Шарп 3.0, это не стратегия. Это случайность.

    Решение: Проверять стратегию на отложенной выборке (Hold-out set), которую вы никогда не использовали при подборе параметров.

    Заключение курса

    Мы прошли полный цикл разработки ML-системы для фондового рынка:

  • Научились работать с OHLCV данными и понимать природу временных рядов.
  • Создали признаки на основе технического анализа и макроэкономики.
  • Разобрали классические модели (Бустинг) и глубокое обучение (LSTM, Трансформеры).
  • И сегодня мы узнали, как честно оценить результат через бэктестинг и коэффициент Шарпа.
  • Рынок — это самая сложная среда для машинного обучения из-за высокого уровня шума и конкуренции. Здесь нет кнопки «Бабло», но есть строгий научный подход, статистика и дисциплина. Удачи в ваших исследованиях и торговле!