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

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

Что вообще значит «прогнозировать цену»

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

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

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

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

Почему начинают с линейной регрессии

Линейная регрессия — это не просто «hello world» в машинном обучении. В финансовом моделировании она служит первой проверкой гипотезы: есть ли вообще в данных хоть какой-то предсказательный сигнал. Я всегда запускаю её до того, как браться за XGBoost или ансамбли, потому что она мгновенно подсвечивает проблемы с признаками и помогает избежать пустой траты времени.

Что она дает

  • прозрачную интерпретацию каждого коэффициента — сразу видно, какой фактор и с каким весом влияет на прогноз;
  • быстрое обучение, что критично, когда нужно за час перебрать десятки гипотез;
  • отличный baseline: если более сложная модель не превосходит линейную, значит, усложнение не оправдано;
  • минимум гиперпараметров — не нужно тратить время на подбор;
  • возможность быстро выявить утечку будущей информации или мультиколлинеарность.

Чего от нее не стоит ждать

  • чудес на сильно зашумлённых временных рядах — она не умеет вытягивать сигнал из чистого шума;
  • стабильной работы без тщательной предобработки данных, особенно на сырых ценах;
  • корректных результатов, если не проверена временная структура сплита и нет защиты от look-ahead bias.

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

Линейная регрессия простыми словами

Математически линейная регрессия ищет зависимость вида:

\[
y = b_0 + b_1 x_1 + b_2 x_2 + … + b_n x_n
\]

Где:

  • \(y\) — целевая переменная (например, доходность следующего дня);
  • \(x_1, x_2, …\) — признаки, которые мы построили на исторических данных;
  • \(b_0\) — свободный член (константа);
  • \(b_1, b_2, …\) — веса, которые модель подбирает, чтобы минимизировать ошибку прогноза.

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

Какие данные подходят для прогноза цен

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

  • OHLCV: open, high, low, close, volume — это скелет любого финансового анализа;
  • доходности за различные периоды;
  • скользящие средние и их комбинации;
  • волатильность (историческая, rolling standard deviation);
  • технические индикаторы — RSI, MACD, Bollinger Bands, но только как производные признаки, а не как магия;
  • рыночный контекст: индекс широкого рынка, секторальный ETF, валютный курс, процентные ставки;
  • календарные признаки: день недели (понедельники и пятницы часто ведут себя иначе), месяц, даты экспираций, отчётности.

Что лучше предсказывать

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

Цель Что прогнозируем Плюсы Минусы
Цена Следующую цену Понятно для новичка Сильная зависимость от масштаба, нестационарность
Доходность Изменение цены Чаще стабильнее, ближе к стационарному ряду Менее интуитивно для интерпретации
Направление Рост/падение Удобно для классификации и торговых сигналов Теряется информация о величине движения

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

Как подготовить признаки для модели

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

Базовые признаки

  • лаги цены: \(close_{t-1}, close_{t-2}, close_{t-5}\);
  • лаги доходности — они помогают уловить краткосрочную инерцию;
  • скользящие средние (SMA, EMA) — дают сглаженный тренд;
  • отклонение цены от скользящей средней — аналог индикатора перекупленности/перепроданности;
  • rolling standard deviation — прокси волатильности;
  • объём и его изменения — часто опережающий индикатор;
  • high-low range за период — показывает внутридневной размах.

Пример полезных признаков

  • доходность за 1 день;
  • доходность за 5 дней — недельный тренд;
  • отношение цены к SMA-20;
  • разница между SMA-5 и SMA-20 — «золотой крест» в упрощённом виде;
  • волатильность за 10 дней;
  • объём выше или ниже среднего за 20 дней.

Что важно помнить

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

Как выглядит рабочий пайплайн

Ниже — практический порядок действий, который я использую для любого базового проекта на Python, будь то прототип торговой стратегии или исследовательский анализ.

Шаг 1. Собрать и очистить данные

Загружаем исторический ряд (обычно через API брокера или специализированные библиотеки) и тщательно проверяем:

  • пропущенные торговые дни — выходные и праздники не должны быть пустыми дырами, их нужно корректно заполнять или исключать;
  • нулевые объёмы там, где их быть не должно — признак ошибки данных;
  • корректность учёта корпоративных действий (сплиты, дивиденды) — без этого цены окажутся искажёнными;
  • соответствие таймзоны — часто котировки приходят в UTC, а локальный рынок закрывается в другом часовом поясе;
  • дублирующиеся записи — биржевые данные иногда грешат повторами.

Шаг 2. Сформировать целевую переменную

Варианты:

  • цель = цена через 1 день;
  • цель = доходность через 1 день (рекомендую);
  • цель = направление следующего дня (+1/-1).

Для регрессии я почти всегда беру доходность:

\[
r_t = \frac{P_t — P_{t-1}}{P_{t-1}}
\]

Шаг 3. Построить признаки

Например:

  • лаги;
  • rolling mean;
  • rolling volatility;
  • объёмные фичи;
  • технические индикаторы (строго на исторических окнах).

Шаг 4. Разделить данные по времени

Никакого случайного перемешивания! Это одна из главных ловушек, которая даёт завышенные метрики и ложное чувство успеха.
Правильно:

  • train — самый старый период;
  • validation — более свежий, на котором будем подбирать гиперпараметры;
  • test — последний по времени отрезок, который модель вообще не видела при обучении.

Шаг 5. Обучить baseline

Начинаем с простых моделей:

  • линейная регрессия;
  • Ridge;
  • Lasso;
  • Elastic Net.

Шаг 6. Проверить качество на тесте

Для регрессии смотрим на:

  • MAE — средняя абсолютная ошибка;
  • RMSE — квадратичная ошибка, штрафует за выбросы;
  • \(R^2\) — доля объяснённой дисперсии.

Но для торговых задач этого критически мало. Я всегда добавляю:

  • direction accuracy — точность угадывания направления;
  • profit factor и max drawdown — смоделированной стратегии на основе сигналов модели;
  • Sharpe ratio — соотношение доходности к риску;
  • стабильность по периодам: разбиваю тест на подпериоды и смотрю, нет ли провалов.

Базовые модели, с которых стоит начать

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

Модель Когда использовать Плюсы Минусы
Linear Regression Быстрый baseline Простота, интерпретируемость Плохо переносит мультиколлинеарность
Ridge Regression Много похожих признаков (например, разные MA) Стабилизирует веса, уменьшает переобучение Интерпретация чуть сложнее
Lasso Regression Нужно автоматически отобрать признаки Может занулять слабые факторы Чувствительна к масштабу, требует нормировки
Elastic Net Комбинация L1 и L2 регуляризации Баланс отбора и стабильности Требует настройки двух гиперпараметров
Decision Tree Есть подозрение на нелинейные зависимости Простая интерпретация, визуализация правил Легко переобучается, нужна обрезка
Random Forest Сложнее линейной модели, нужен нелинейный baseline Хороший баланс качества и устойчивости Тяжелее объяснять, больше параметров
Gradient Boosting Сильный практический baseline Часто даёт лучший результат на табличных данных Легко переобучить без контроля, требует тщательной валидации

Для первых шагов в прогнозировании цен я обычно сравниваю линейную регрессию, Ridge и Random Forest. Этого достаточно, чтобы понять, есть ли в данных линейный сигнал и стоит ли копать глубже.

Почему линейная регрессия часто проигрывает

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

Основные причины

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

Что с этим делать

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

Наивный прогноз — обязательная точка сравнения

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

Часто используемые наивные прогнозы:

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

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

Типовые ошибки новичков

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

1. Утечка будущего (look-ahead bias)

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

  • скользящая средняя посчитана с использованием будущих значений — технический индикатор «заглядывает» вперёд;
  • признаки стандартизированы (среднее и std вычислены) на всем датасете до разделения на train/test — модель уже знает масштаб будущего;
  • в обучающий набор случайно попали данные после даты прогноза — например, из-за ошибки в фильтрации по дате.

2. Случайный train-test split

Для временных рядов нельзя перемешивать данные. Я видел результаты, где \(R^2\) на тесте был 0.8, а после исправления на временной сплит падал до отрицательных значений. Это жёсткая, но полезная отрезвляющая процедура.

3. Прогноз цены вместо доходности

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

4. Слишком много признаков

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

5. Игнорирование транзакционных издержек

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

6. Оценка только по \(R^2\)

Для торговых задач \(R^2\) — слабый ориентир. Важнее, приносит ли модель практическую пользу: улучшает ли направленную точность, увеличивает ли profit factor, снижает ли просадки.

Пример рабочего набора признаков

Для быстрого прототипа я часто беру минимальный набор, который уже позволяет понять, есть ли в данных какая-то структура:

  • доходность за 1, 2, 5 дней;
  • SMA-5, SMA-10, SMA-20;
  • отношение close к SMA-20 — простой осциллятор;
  • rolling volatility за 10 дней;
  • объём и его отклонение от среднего за 20 дней;
  • high-low range — внутридневной размах;
  • день недели (one-hot encoding).

Такой набор из 10–15 фич уже позволяет оценить, есть ли сигнал. Если на этом базисе линейная модель не показывает ничего вменяемого, то добавление ещё полусотни индикаторов вряд ли кардинально изменит картину.

Как понять, что модель действительно полезна

Хорошая модель в прогнозировании цен — это не та, у которой красивый \(R^2\) или минимальная RMSE на истории. Это та, которая стабильно работает на новых данных и приносит практическую пользу после учёта всех издержек.

Признаки адекватной модели

  • результаты на test хуже, чем на train, но не провальные — естественное снижение из-за переобучения;
  • качество стабильно на разных временных отрезках, а не держится на одном удачном периоде;
  • модель обгоняет наивный baseline по направлению и по экономическим метрикам;
  • торговая стратегия на основе её сигналов остаётся прибыльной после комиссий и проскальзывания;
  • признаки имеют понятную экономическую интерпретацию — это не «чёрный ящик».

Красные флаги

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

Пошаговый чек-лист перед запуском модели

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

  • Определена цель: цена, доходность или направление.
  • Данные очищены от пропусков и дублей, учтены корпоративные действия.
  • Признаки рассчитаны только по прошлым значениям, и это проверено на нескольких примерах вручную.
  • Данные разделены строго по времени, порядок не нарушен.
  • Есть наивный baseline, и его метрики зафиксированы.
  • Проверены MAE, RMSE и бизнес-метрики (direction accuracy, profit factor с учётом комиссий).
  • Учтены комиссии и проскальзывание, реалистичные для данного инструмента.
  • Проведена проверка на нескольких временных окнах (например, 3-6 месяцев подряд).
  • Результат сравнён с простой стратегией, не использующей ML.

Когда линейной регрессии уже мало

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

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

Тогда можно смотреть в сторону:

  • деревьев решений;
  • Random Forest;
  • Gradient Boosting;
  • XGBoost/LightGBM;
  • простых нейросетей для временных рядов (LSTM, Temporal CNN).

Но даже после перехода к бустингу или нейросетям линейная регрессия остаётся обязательной точкой отсчёта. Если более сложная модель не может обогнать линейную хотя бы на 10–20% по ключевой метрике, это повод усомниться в её адекватности.

Практический вывод

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

Линейная регрессия помогает быстро понять:

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

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

FAQ

Можно ли прогнозировать именно цену, а не доходность?

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

Почему случайное разбиение данных — ошибка?

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

Что лучше для старта: линейная регрессия или деревья?

Для первого шага — однозначно линейная регрессия и Ridge. Они быстры, интерпретируемы и позволяют понять, есть ли в данных линейный сигнал. Затем можно сравнить с простым деревом решений и Random Forest, чтобы оценить нелинейные эффекты. Но пропускать линейный baseline нельзя — иначе вы рискуете построить сложный ансамбль, который не даёт значимого прироста над простой моделью.

Дает ли ML прибыль в трейдинге?

Иногда да, если соблюдены три условия: корректные признаки без утечек, строгая временная валидация и полный учёт издержек. Но чаще всего ML-модели показывают скромное преимущество, которое легко обнуляется комиссиями или проскальзыванием. Без чёткого понимания этих ограничений даже точная модель может оказаться убыточной. Я видел десятки стратегий, которые отлично выглядели на истории, но сливали в реальной торговле именно из-за игнорирования транзакционных издержек.

Нужно ли использовать технические индикаторы?

Можно, но не как магическую палочку. Индикаторы — это просто производные признаки, которые математически преобразуют цену и объём. Важно их качество и адекватность задаче, а не количество. Лучше взять 2–3 осмысленных индикатора (например, RSI и MACD) и правильно рассчитать их на исторических окнах, чем загрузить модель сотней случайных сигналов, которые будут ловить шум.

Что считать хорошим результатом?

В финансах универсального ответа нет. Модель должна быть значимо лучше наивного baseline и приносить пользу после вычета комиссий и проскальзывания. Для меня хороший результат — это когда стратегия на основе сигналов модели имеет положительный profit factor и Sharpe ratio, а точность направления стабильно выше 50% хотя бы на 2–3 процентных пункта. Но главное — стабильность на разных периодах и рыночных режимах.