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

Узнайте, как создать ML-проект для прогнозирования цен! Разберём всё: от сбора данных и фичей до обучения модели и запуска в продакшн.

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


Содержание

  1. Сбор и подготовка данных
  2. Инженерия признаков
  3. Обзор моделей машинного обучения
  4. Метрики оценки качества
  5. Типичный workflow проекта
  6. Краткий кейс‑стади
  7. Лучшие практики и подводные камни
  8. Инструменты и библиотеки

Прогнозирование цен – одна из самых востребованных задач в финансовой аналитике, энергетике, сельском хозяйстве и торговле. Традиционно такие прогнозы делали с помощью эконометрических моделей (ARIMA, VAR) или экспертных оценок. За последние годы машинное обучение (ML) стало основным инструментом, позволяющим учитывать огромное количество факторов, нелинейных зависимостей и сезонных эффектов.

Ключевые причины, почему ML превосходит классические подходы:

  • Способность работать с разнородными данными (ценовые ряды, макроэкономика, новости, соцсети).
  • Автоматическое выявление скрытых паттернов без необходимости ручного построения уравнений.
  • Гибкость в выборе горизонта прогнозирования (1 день, 1 месяц, 12 месяцев).

Сбор и подготовка данных

2.1 Источники данных

Для построения надёжного прогноза цен необходимо собрать несколько категорий данных:

  • Исторические цены – биржевые котировки, цены на сырьё, индексы.
  • Макроэкономические индикаторы – ВВП, инфляция, курс валют, процентные ставки.
  • Факторные данные – погода, сезонность, объемы производства, запасы.
  • Текстовые данные – новости, аналитика, соцсети (sentiment‑анализ).
  • Технические индикаторы – скользящие средние, RSI, Bollinger Bands и др.

2.2 Сбор данных

Для получения данных часто используют API:

  • Yahoo Finance, Alpha Vantage – финансовые котировки.
  • Quandl, World Bank API – макроэкономика.
  • OpenWeather, NOAA – погодные условия.
  • Twitter API, Reddit API – тексты и настроения.

2.3 Очистка и трансформация

Ключевые шаги:

  1. Объединение таблиц (join по дате).
  2. Обработка пропусков – интерполяция, заполнение средним, forward‑fill.
  3. Удаление выбросов – Z‑score, IQR‑метод.
  4. Нормализация/стандартизация – MinMaxScaler, StandardScaler.
  5. Преобразование дат – извлечение year, month, day_of_week, is_holiday.

2.4 Разделение на наборы

Для временных рядов рекомендуется использовать time‑based split:

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

Инженерия признаков (Feature Engineering)

3.1 Лаговые признаки

Самый базовый способ – добавить значения цены за предыдущие n шагов:

df['price_lag_1'] = df['price'].shift(1)
df['price_lag_7'] = df['price'].shift(7)
df['price_lag_30'] = df['price'].shift(30)

3.2 Скользящие статистики

Среднее, медиана, стандартное отклонение за окно.

df['ma_7'] = df['price'].rolling(7).mean
df['std_30'] = df['price'].rolling(30).std

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

Для финансовых рядов часто используют:

  • RSI (Relative Strength Index)
  • MACD (Moving Average Convergence Divergence)
  • Bollinger Bands

3.4 Факторные и внешние признаки

Пример: связь цены нефти с курсом доллара:

df['oil_price_usd'] = oil_df['price']
df['usd_rub'] = fx_df['USD_RUB']
df['oil_price_rub'] = df['oil_price_usd'] * df['usd_rub']

3.5 Текстовые признаки

Для новостных заголовков применяют:

  • Bag‑of‑Words / TF‑IDF
  • Word2Vec, FastText, BERT‑эмбеддинги
  • Sentiment‑score (положительный / отрицательный)

Обзор моделей машинного обучения

Выбор модели зависит от объёма данных, требуемой интерпретируемости и горизонта прогноза.

4.1 Классические статистические модели

  • ARIMA / SARIMA – хороши для коротких предсказаний, когда данные стационарны.
  • VAR (Vector Autoregression) – учитывает несколько взаимосвязанных рядов.
  • Prophet (Facebook) – прост в настройке, учитывает праздники и сезонность.

4.2 Модели машинного обучения

Модель Плюсы Минусы Тип задачи
Linear Regression Простота, интерпретируемость Не учитывает нелинейности Базовый бенчмарк
Ridge / Lasso Регуляризация, отбор признаков Тоже линейна Регрессия с большим числом признаков
Random Forest Устойчив к шуму, работает с нелинейностями Может переобучаться при небольшом наборе Средне‑длинные горизонты
Gradient Boosting (XGBoost, LightGBM, CatBoost) Высокая точность, работа с категориальными данными Требует тщательной настройки гиперпараметров Лучший общий выбор
Support Vector Regression (SVR) Эффективен на небольших наборах Сложно масштабировать Тонкие датасеты
LSTM / GRU (рекуррентные сети) Улавливают долгосрочные зависимости Требуют больших объёмов данных, сложны в обучении Прогнозы на 1‑12 месяцев
Temporal Convolutional Networks (TCN) Быстрее RNN, хороши для длинных рядов Менее популярны, меньше готовых решений Альтернатива LSTM
Transformer‑based модели (Informer, Autoformer) Сильные долгосрочные предсказания, масштабируются Требуют GPU и больших данных Продвинутые исследовательские проекты

4.3 Выбор модели «под задачу»

Рекомендации:

  • Для быстрого прототипа – начните с Linear Regression → XGBoost.
  • Если данные нестационарны и есть ярко выраженная сезонность – используйте SARIMA + экстрафичеры.
  • Для длинных горизонтов (6‑12 месяцев) – экспериментируйте с LSTM/Transformer.
  • Если важна интерпретируемость – предпочтительнее Random Forest + SHAP‑анализ.

Метрики оценки качества

Для регрессионных задач обычно применяют:

  • MAE (Mean Absolute Error) – средняя абсолютная ошибка.
  • MSE / RMSE (Mean Squared Error / Root Mean Squared Error) – штрафует большие отклонения.
  • MAPE (Mean Absolute Percentage Error) – процентная ошибка, удобна для сравнения разных товаров.
  • SMAPE (Symmetric MAPE) – более устойчив к нулевым значениям.
  • R² (коэффициент детерминации) – показывает долю объяснённой дисперсии.

Для финансовых приложений часто используют verlust‑функцию, учитывающую стоимость ошибок (например, штраф за недооценку цены).

Кросс‑валидация для временных рядов

Стандартный k‑fold не подходит. Вместо него используют:

  • TimeSeriesSplit (sklearn) – «скользящее окно».
  • Rolling‑origin evaluation – каждый новый тестовый набор начинается после последнего тренировочного.

Типичный workflow проекта

  1. Определение цели – прогноз цены через 1, 3, 6, 12 месяцев.
  2. Сбор данных – API, скачивание CSV, парсинг веб‑страниц.
  3. EDA (Exploratory Data Analysis) – визуализация, корреляции, автокорреляционная функция (ACF).
  4. Предобработка – очистка, заполнение пропусков, масштабирование.
  5. Инженерия признаков – лаги, скользящие окна, внешние индексы.
  6. Разделение данных – train/validation/test с учётом времени.
  7. Базовое моделирование – простая линейная регрессия как «baseline».
  8. Подбор модели – GridSearch / RandomSearch / Optuna для гиперпараметров.
  9. Оценка – расчёт MAE, RMSE, MAPE на валидации и тесте.
  10. Интерпретация – SHAP‑значения, важность признаков.
  11. Деплой – API (FastAPI, Flask), Docker‑контейнер, CI/CD.
  12. Мониторинг – drift‑детекция, переобучение модели каждый квартал.

Краткий кейс‑стади: прогноз цены алюминия

7.1 Данные

  • Исторические цены LME (London Metal Exchange) – дневные закрытия за 2010‑2026 гг.
  • Курс USD/RUB, индексы промышленного производства, цены нефти (Brent).
  • Погодные данные (температура, осадки) для основных шахт.
  • Тональность новостей (Twitter, Bloomberg) – скользящее среднее sentiment‑score.

7.2 Препроцессинг

Пропуски в котировках заполняли forward‑fill, а в макро‑данных – линейной интерполяцией. Признаки стандартизировали с помощью StandardScaler.

7.3 Признаки

# lag features
for lag in [1, 3, 7, 30]:
 df[f'price_lag_{lag}'] = df['price'].shift(lag)

df['price_ma_7'] = df['price'].rolling(7).mean
df['price_std_30'] = df['price'].rolling(30).std

df['oil_price_usd'] = oil_df['price']
df['usd_rub'] = fx_df['USD_RUB']
df['oil_price_rub'] = df['oil_price_usd'] * df['usd_rub']

df['sentiment_3d'] = df['sentiment'].rolling(3).mean

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

Сравнили три подхода:

  1. SARIMA(2,1,2)(1,0,1)[12] – базовый статистический.
  2. XGBoost (500 деревьев, learning_rate=0.05, max_depth=6).
  3. LSTM (2 слоя, 64 нейрона, look_back=30 дней).

7.5 Оценка (на тестовом 2026‑год)

Модель MAE RMSE MAPE
SARIMA 0.78 $/т 1.02 $/т 3.4 %
XGBoost 0.55 $/т 0.78 $/т 2.3 %
LSTM 0.48 $/т 0.71 $/т 2.0 %

Лучший результат показал LSTM, однако XGBoost оказался более интерпретируемым – SHAP‑анализ выявил ключевые признаки: price_lag_30, oil_price_rub, sentiment_3d.

7.6 Деплой

Модель завернули в Docker‑контейнер, создали REST‑endpoint /predict на FastAPI, настроили автоматический переобучающий пайплайн в Airflow, который каждую неделю собирает новые данные и обновляет модель.


Лучшие практики и подводные камни

  • Не смешивайте тренировочные и тестовые данные. При работе с временными рядами важна строгая хронология.
  • Контролируйте «дрейф» (data drift). Периодически проверяйте, не изменились ли распределения признаков.
  • Сезонность. Добавляйте признаки month, day_of_week, is_holiday – они часто дают значительный прирост точности.
  • Регуляризация. При работе с большим числом лагов используйте Lasso/Ridge, чтобы избежать переобучения.
  • Тестируйте несколько горизонтов. Модель, хорошая на 1‑дневный прогноз, может плохо работать на 6‑месячный.
  • Интерпретируемость. Для бизнес‑задач часто важнее объяснить, почему модель предсказывает рост цены, чем минимизировать ошибку.
  • Объём данных. Глубокие нейронные сети требуют минимум несколько тысяч точек; если их нет – лучше использовать градиентный бустинг.
  • Обучение на «скользящем окне». При переобучении модели каждые N дней используйте только последние M лет данных.

Инструменты и библиотеки

Тип Библиотека / Платформа Краткое описание
Язык Python Самый популярный для ML и анализа данных.
DataFrames pandas Работа с таблицами, чтение CSV/Excel, временные индексы.
Визуализация matplotlib, seaborn, plotly Графики временных рядов, корреляций.
Статистика statsmodels ARIMA, SARIMA, тесты на стационарность (ADF).
ML‑модели scikit‑learn Линейные модели, RandomForest, SVR.
Градиентный бустинг XGBoost, LightGBM, CatBoost Быстрый training, поддержка категориальных признаков.
Нейронные сети TensorFlow / Keras, PyTorch LSTM, GRU, Transformer‑модели.
Текст NLTK, spaCy, transformers (HuggingFace) Токенизация, sentiment‑анализ, BERT‑эмбеддинги.
Автоматический поиск гиперпараметров Optuna, Hyperopt, scikit‑optimize Bayesian Optimization.
Деплой FastAPI, Flask, Docker, Kubernetes Создание API‑сервиса, контейнеризация.
Оркестрация Airflow, Prefect, Dagster Планирование ETL‑ и переобучающих пайплайнов.
Мониторинг Prometheus + Grafana, Evidently AI Отслеживание метрик модели в продакшн.

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

  • Сбор разнообразных источников данных и их качественную предобработку.
  • Тщательную инженерию признаков, особенно лагов и сезонных индикаторов.
  • Сравнение нескольких моделей (от простых регрессий до LSTM/Transformer) и выбор оптимального компромисса между точностью и интерпретируемостью.
  • Регулярную оценку модели на отложенных временных отрезках и мониторинг дрейфа.
  • Автоматизацию пайплайна от загрузки данных до вывода модели в продакшн.

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

Удачной разработки!