Цель статьи – дать полное представление о том, как построить проект машинного обучения, способный прогнозировать цены на товары, сырьевые ресурсы, финансовые инструменты и другие объекты. Мы разберём все этапы: от сбора и подготовки данных до выбора модели, её обучения, оценки и вывода в продакшн.
Содержание
- Сбор и подготовка данных
- Инженерия признаков
- Обзор моделей машинного обучения
- Метрики оценки качества
- Типичный workflow проекта
- Краткий кейс‑стади
- Лучшие практики и подводные камни
- Инструменты и библиотеки
Прогнозирование цен – одна из самых востребованных задач в финансовой аналитике, энергетике, сельском хозяйстве и торговле. Традиционно такие прогнозы делали с помощью эконометрических моделей (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 Очистка и трансформация
Ключевые шаги:
- Объединение таблиц (join по дате).
- Обработка пропусков – интерполяция, заполнение средним, forward‑fill.
- Удаление выбросов – Z‑score, IQR‑метод.
- Нормализация/стандартизация – MinMaxScaler, StandardScaler.
- Преобразование дат – извлечение 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, 3, 6, 12 месяцев.
- Сбор данных – API, скачивание CSV, парсинг веб‑страниц.
- EDA (Exploratory Data Analysis) – визуализация, корреляции, автокорреляционная функция (ACF).
- Предобработка – очистка, заполнение пропусков, масштабирование.
- Инженерия признаков – лаги, скользящие окна, внешние индексы.
- Разделение данных – train/validation/test с учётом времени.
- Базовое моделирование – простая линейная регрессия как «baseline».
- Подбор модели – GridSearch / RandomSearch / Optuna для гиперпараметров.
- Оценка – расчёт MAE, RMSE, MAPE на валидации и тесте.
- Интерпретация – SHAP‑значения, важность признаков.
- Деплой – API (FastAPI, Flask), Docker‑контейнер, CI/CD.
- Мониторинг – 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 Моделирование
Сравнили три подхода:
- SARIMA(2,1,2)(1,0,1)[12] – базовый статистический.
- XGBoost (500 деревьев, learning_rate=0.05, max_depth=6).
- 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 и учитывая перечисленные лучшие практики, вы сможете построить надёжную систему предсказания цен, которая будет адаптироваться к меняющимся рыночным условиям и приносить реальную бизнес‑ценность.
Удачной разработки!