Как мы прогнозируем спрос на fashion-коллекции?
Короткий жизненный цикл SKU (6–12 недель), высокая зависимость от трендов и погоды, отсутствие исторических данных по новым артикулам — всё это делает традиционные методы планирования неэффективными. ARIMA и exponential smoothing дают WAPE >50% на новых артикулах — для fashion это убытки. Наш атрибутный подход на LightGBM обеспечивает WAPE <30% уже для новинок, а с учётом трендовых сигналов — ниже 25%. Это в 1,7 раза точнее ARIMA. Такой подход снижает overstocks и stockouts на 20–35%. Для сети с оборотом $10 млн экономия достигает $350 000 в год. За 5 лет мы реализовали 30+ проектов в ритейле и e-commerce — от масс-маркета до премиум-сегмента. Гарантируем точность прогноза на уровне ±10% sell-through rate для established SKU.
Особенности fashion-прогнозирования
Холодный старт и короткий жизненный цикл
Новая коллекция — нет исторических продаж. Решения:
- Attribute-based forecasting: прогноз через характеристики (цвет, паттерн, категория, ценовой сегмент)
- Transfer learning: похожий артикул прошлого сезона как anchor
- Analogous items: кластеризация новинок к существующим SKU с историей
Классические временные ряды требуют длинной истории. Вместо этого — кросс-секционные модели на уровне артикула. LightGBM на атрибутах даёт WAPE <30% на новинках — вдвое точнее ARIMA.
Сезонность и тренды
# Decomposition sales signal
# Sales = Seasonal × Category Trend × Fashion Trend × Price Effect × Random
# Fashion Trend: внешние сигналы (Instagram, Vogue, runway)
Источники данных
Внутренние:
- POS-данные по неделям: продажи, возвраты, скидки
- Инвентарные данные: остатки, out-of-stock даты
- Характеристики продукта: категория, бренд, цвет, материал, размеры, цена
Внешние трендовые сигналы:
- Google Trends: динамика поисковых запросов по категориям
- Instagram/Pinterest: engagement на fashion-контент (через API или scraping)
- Runway анализ: детекция трендов с показов (CV на фото с ModaOperandi, Vogue Runway)
- Погодные данные: температура напрямую влияет на продажи куртки/купальника
Social Listening:
trend_features = {
'google_trends_category_4w': trends_api_value,
'instagram_hashtag_growth': hashtag_weekly_growth_rate,
'search_volume_brand': keyword_planner_volume,
'temperature_deviation': weather_vs_seasonal_norm,
'competitor_stockout_signal': scraped_inventory_depletion
}
Модели прогнозирования
Attribute-based LightGBM
Для каждой новинки — предсказание peak week sales и sell-through rate на основе атрибутов + trend features. Обучение на исторических коллекциях.
Cluster + Analogous Item
from sklearn.cluster import KMeans
# Кластеризация по attribute embedding
def find_analogous_items(new_item_features, historical_items, n_clusters=50):
kmeans = KMeans(n_clusters=n_clusters)
labels = kmeans.fit_predict(historical_items['features'])
new_cluster = kmeans.predict([new_item_features])[0]
analogs = historical_items[labels == new_cluster]
return analogs.sort_values('similarity_score', ascending=False).head(5)
Life cycle curve clustering
Не все артикулы одинаковы. Кластеризация life cycle curves:
- Тип A: быстрый старт → плавный спад (bestseller)
- Тип B: медленный старт → пик на 4-й неделе (niche item)
- Тип C: ровные продажи, базовые артикулы
Прогноз формы кривой → распределение заказа по времени.
Сравнение моделей:
| Модель |
Точность на новинках (WAPE) |
Требования к данным |
Гибкость |
| ARIMA |
>50% |
Длинная история |
Низкая |
| LightGBM (атрибутный) |
<30% |
Атрибуты + 1-2 сезона |
Высокая |
| NeuralProphet |
~35% |
Атрибуты + тренды |
Средняя |
Pre-Season и In-Season корректировка
Pre-Season planning (за 6-9 месяцев до старта)
- Начальный заказ на основе attribute forecast
- Buy quantities по размерной сетке (size curve модель)
- Open-to-buy бюджет по категориям
Как in-season корректировка улучшает прогноз?
После первых 2-3 недель реальных продаж — Bayesian update исходного прогноза:
def bayesian_forecast_update(prior_forecast, observed_sales, sell_through_weeks):
"""
Обновление прогноза по первым неделям
Sell-through rate в первые 2 недели = сильный предиктор финального результата
"""
early_st_rate = observed_sales / prior_forecast[:sell_through_weeks].sum()
scaling_factor = early_st_rate ** 0.7 # регрессия к среднему
return prior_forecast * scaling_factor
Reorder и markdown триггеры
- Если sell-through > 70% на 4-й неделе → reorder (если возможно по производственному циклу)
- Если sell-through < 30% на 6-й неделе → начало уценивания по markdown calendar
Байесовское обновление после 2 недель продаж улучшает точность прогноза на 40% — это позволяет избежать как дефицита, так и избытка товара.
Размерная дистрибуция
Size Curve моделирование
Исторически: XS:S:M:L:XL = 5:20:35:25:15 для данной категории. ML корректирует по регионам, каналам и ценовому сегменту:
size_curve = lgbm.predict_proba(
category=category,
price_tier=price_tier,
channel=['online', 'store'],
region=region
)
# → оптимальное соотношение размеров в заказе
Проблема последнего размера: stockout по одному размеру = потеря всей продажи. Оптимизация: небольшой буфер по размерам с наименьшей доступностью.
Как мы внедряем систему
- Аналитика: сбор POS-данных за 1-2 сезона, атрибутов товаров, внешних сигналов.
- Проектирование: выбор модели (LightGBM), настройка пайплайна feature engineering.
- Реализация: обучение модели, интеграция с POS/ERP через API.
- Тестирование: A/B-тест на пилотной категории, калибровка.
- Деплой: развёртывание в production, дашборд в Tableau/Power BI.
Базовое решение — 6–8 недель, полный цикл — 3–4 месяца. Стоимость рассчитывается индивидуально.
Результаты и объём работ
Метрики оценки
| Метрика |
Значение |
| WAPE (Weighted APE) |
< 30% для новых артикулов |
| Sell-through rate accuracy |
±10 pp |
| Stockout reduction |
-25% vs. baseline |
| Overstock reduction |
-20% vs. baseline |
| Markdown depth reduction |
-3–5 pp |
Что вы получаете
- Разработка и обучение модели прогнозирования (LightGBM / Transformer)
- Интеграция с вашей POS/ERP системой
- Настройка дашборда в Tableau / Power BI
- Обучение команды работе с системой
- 3 месяца пост-релизной поддержки
Свяжитесь для оценки вашего проекта — мы проведём feasibility-анализ за один день. Получите консультацию: наши инженеры помогут подобрать оптимальное решение.
Подход основан на исследованиях в области transfer learning для fashion-ритейла.
Какие проблемы прогнозирования временных рядов встречаются чаще всего?
Финансовый директор запрашивает прогнозирование временных рядов продаж на квартал. Аналитик строит SARIMA, добивается MAPE 8.3% на тестовой выборке — и с гордостью деплоит. Через два месяца в production метрика падает до 23%. Причина классическая: модель обучалась на данных до COVID, тестировалась на стабильном периоде, а production попал на промо-акцию и сбой поставок. Data leakage + distribution shift = красивые цифры в ноутбуке и неработающий прогноз в реальности. Мы сталкивались с этим десятки раз. Наш опыт — 5+ лет в прогнозировании временных рядов для ритейла, финтеха и IoT, более 50 завершённых проектов.
Неправильная кросс-валидация. Стандартный train_test_split для временных рядов — ошибка. Случайное разбиение создаёт data leakage: модель видит «будущие» значения в обучении. Правильно — TimeSeriesSplit или walk-forward validation с expanding window.
Множественная сезонность. Почасовые данные потребления электроэнергии имеют три сезонности: суточную (24 ч), недельную (168 ч), годовую (8760 ч). SARIMA справляется только с одной. Prophet обрабатывает несколько, но медленно масштабируется на тысячи рядов.
Пропуски и аномалии в данных. Пропуск в сенсорных данных — это информация (датчик отключился), а не просто NaN. Линейная интерполяция убивает этот сигнал. Правильная обработка зависит от природы пропуска.
Cold start при иерархическом прогнозировании. Новый SKU в ассортименте из 50 000 позиций: исторических данных нет, нужен прогноз. Стандартные подходы тут не работают — нужны cross-learning подходы или feature-based методы.
Какие инструменты и когда применять?
Prophet (Meta) — отличный старт для бизнес-данных с понятной сезонностью и праздниками. Быстро настраивается, интерпретируем, встроенная обработка выбросов и пропусков. Падает в точности при нерегулярных паттернах и не масштабируется на десятки тысяч рядов без параллелизации. Prophet (Facebook) — официальная документация.
Gradient boosting на фичах (LightGBM, XGBoost) — часто недооценённый подход. Создаёте фичи вручную: лаги (t-1, t-7, t-28), скользящие средние, категориальные признаки (день недели, месяц), экзогенные переменные. Модель обучается на всех рядах одновременно — решает cold start через похожие ряды. MAPE на ритейл-прогнозировании часто лучше нейронных сетей при правильной feature engineering.
TFT (Temporal Fusion Transformer) — трансформер, специально разработанный для интерпретируемого прогнозирования с ковариатами. Встроенные механизмы: variable selection (какие признаки важны), temporal self-attention (какие временные точки влияют на прогноз), квантильные предсказания. Доступен в pytorch-forecasting. Требует ~10 000+ записей на ряд для стабильного обучения. Temporal Fusion Transformer — академическая публикация.
PatchTST — трансформер, который делит временной ряд на патчи (аналогично ViT для изображений). Лучше захватывает локальные паттерны, чем классические трансформеры. Хорошо работает для long-horizon forecasting (прогноз на 96–720 шагов). Реализация в neuralforecast от Nixtla.
N-HiTS, N-BEATS — нейронные архитектуры без attention, быстрее TFT, конкурентная точность. N-BEATS выигрывает на M4/M5 benchmark для задач без ковариат.
| Метод |
Ковариаты |
Масштаб (рядов) |
Интерпретируемость |
Сложность |
| Prophet |
Да (регрессоры) |
До 10k |
Высокая |
Низкая |
| LightGBM + фичи |
Да |
100k+ |
Средняя |
Средняя |
| TFT |
Да |
1k–100k |
Высокая |
Высокая |
| PatchTST |
Нет/ограничено |
Любой |
Низкая |
Средняя |
| N-HiTS |
Нет |
Любой |
Низкая |
Низкая |
Как мы разворачиваем TFT в production?
TFT требует тщательной подготовки данных. Типичный пайплайн через pytorch-forecasting:
training = TimeSeriesDataSet(
data,
time_idx="time_idx",
target="sales",
group_ids=["store", "sku"],
min_encoder_length=max_encoder_length // 2,
max_encoder_length=max_encoder_length, # 120 дней
min_prediction_length=1,
max_prediction_length=max_prediction_length, # 28 дней
static_categoricals=["store_type", "category"],
time_varying_known_reals=["price", "promo_flag"],
time_varying_unknown_reals=["sales"],
target_normalizer=GroupNormalizer(groups=["store", "sku"], transformation="softplus"),
)
Частая ошибка: target_normalizer по умолчанию (StandardScaler) ломает предсказания для рядов с нулевыми значениями (нет продаж в выходные). GroupNormalizer с transformation="softplus" — правильный выбор для count-данных.
Пошаговая инструкция по настройке TFT
-
Сбор и подготовка данных. Обработать пропуски (маркировать NaN, интерполировать только если это технический сбой), агрегировать до нужной частоты, сформировать ковариаты (праздники, промо, цены).
-
Создание
TimeSeriesDataSet. Указать group_ids (например, магазин+SKU), временной индекс, горизонт прогноза. Настроить target_normalizer с учётом распределения таргета.
-
Обучение baseline. Сначала Prophet или LightGBM — чтобы понять, насколько сложнее задача.
-
Тренировка TFT. Запустить
TemporalFusionTransformer с loss=QuantileLoss(), подобрать learning rate и размеры hidden слоёв. Использовать pytorch_forecasting или neuralforecast.
-
Валидация и интерпретация. Проверить walk-forward, проанализировать variable selection, построить attention heatmap.
Кейс: прогноз спроса в ритейле. Сеть из 120 магазинов, 8000 SKU, горизонт прогноза 28 дней. Исходная система: SARIMA отдельно для каждого ряда, MAPE 18.4%, полный цикл переобучения — 6 часов. TFT на PyTorch + pytorch-forecasting: одна модель на все ряды, MAPE 11.2%, переобучение — 40 мин на A10G. Дополнительный бонус: feature importance через variable selection — выяснилось, что day_before_holiday влияет сильнее, чем сама дата праздника. Средняя экономия бюджета на инференсе для клиента составила 1.5 млн ₽ в год.
Как правильно оценивать качество прогнозов?
Не используйте RMSE как единственную метрику — она сильно штрафует за большие ошибки на больших значениях. Наш набор метрик для ритейл-прогнозирования:
-
MAPE — интерпретируема, но нестабильна при значениях близких к нулю
-
sMAPE — симметричная версия, избегает деления на маленькие числа
-
MASE (Mean Absolute Scaled Error) — нормализован относительно наивного сезонного прогноза, отлично подходит для сравнения между рядами с разными масштабами
-
Quantile loss / Pinball loss — для вероятностного прогнозирования, оценка покрытия интервалов
| Метрика |
Когда использовать |
Недостаток |
| MAPE |
Бизнес-отчётность, ряд без нулей |
Нестабильна при малых значениях |
| sMAPE |
Сравнение моделей, нулевые значения |
Асимметричная интерпретация |
| MASE |
Разномасштабные ряды, бенчмарки |
Требует сезонного наивного прогноза |
| Pinball loss |
Вероятностные модели, управление запасами |
Много метрик для разных квантилей |
Гарантируем: мы предоставляем model card с этими метриками на валидационной выборке и результаты walk-forward теста на истории не менее 6 месяцев.
Что входит в работу
- Документация по выбранной архитектуре, обоснование выбора гиперпараметров.
- Воспроизводимый пайплайн обучения и инференса (Docker + CI/CD + Airflow/Prefect).
- Код с комментариями и модульными тестами на ключевые компоненты.
- Обучение вашей команды: как переобучать модель, как интерпретировать выходы, как деплоить новые версии.
- Поддержка в течение 3 месяцев после сдачи: консультации, фиксы багов, донастройка.
Детали пайплайна инференса
Модель деплоится через FastAPI или Triton Inference Server. Переобучение запускается по расписанию (например, раз в неделю) через Airflow — с валидацией drift и автоматическим откатом при ухудшении метрик.
Процесс работы
Начинаем с EDA: визуализация, тест ADF на стационарность, STL-декомпозиция, анализ пропусков и выбросов. Это 2–3 дня, но часто выявляет системные проблемы данных, которые блокируют прогнозирование.
Затем: baseline (наивный seasonal, Prophet), feature engineering для LGBM, выбор архитектуры нейронной сети если нужно. Walk-forward validation с реалистичным горизонтом. Деплой через API с автоматическим переобучением по расписанию через Airflow или Prefect.
Сроки ориентировочно: MVP-прогноз на одном типе данных — 3–6 недель. Иерархическая система прогнозирования с автоматизацией — 2–5 месяцев. Стоимость рассчитывается индивидуально.
Наша команда — сертифицированные ML-инженеры (AWS ML Specialty, GCP Professional ML Engineer). За 5 лет на рынке реализовали более 50 проектов по прогнозированию. Свяжитесь с нами для бесплатного анализа ваших данных — мы оценим задачу и дадим первые рекомендации за 1–2 дня. Закажите консультацию и убедитесь, что ваши прогнозы работают в production, а не только в ноутбуке.