
В онлайн-ритейле акции и скидки запускаются постоянно. Однако на практике часто оказывается, что увеличение скидки почти не влияет на продажи, хотя заметно снижает маржу. Это заставляет задуматься: какой размер скидки действительно имеет бизнес-ценность?
Меня зовут Лиза Петяева, я работаю старшим ML-инженером в Купере и отвечаю как раз за динамическое ценообразование (динцен). В этой статье я обзорно расскажу, как мы решаем проблему с целесообразностью скидок, какие модели используем и как происходит ценовая оптимизация.
Где и зачем нужно динамическое ценообразование
Наверное, одна из первых ассоциаций, возникающих с динамическим ценообразованием, — это изменение цен во время поиска билетов на самолет. Или же цены на отели, которые растут перед праздниками и в высокий сезон и падают, если покупать день в день.
Почему это происходит? Любой бизнес стремится эффективно использовать ограниченные ресурсы. Динамическое ценообразование помогает распределять эти ресурсы между клиентами в зависимости от текущего спроса. Авиакомпания стремится с наибольшей выгодой заполнить ограниченное количество мест в самолете. Отели не хотят, чтобы простаивали номера.
Универсальное правило следующее: в момент низкого спроса цену снижают, чтобы привлечь внимание большего количества потенциальных клиентов, а в высокий — повышают, чтобы остались только самые заинтересованные.

У нас в E‑grocery динамическое ценообразование работает в двух областях: доставка и заказы.
Например, курьеров не всегда хватает на точках, чтобы вовремя доставить все заказы по району. Поэтому мы можем регулировать цену доставки, чтобы сбалансировать нагрузку и поддержать качество сервиса.
В заказах — управляем ценами через скидки, чтобы стимулировать спрос. О последнем и пойдет речь дальше.
Итого — динамическое ценообразование помогает бизнесу балансировать спрос и предложение и поддерживать стабильное качество сервиса. Нам нужно понять, какой спрос будет при той или иной цене, и выбрать такие параметры цены или промо, которые позволяют системе работать устойчиво и эффективно.

Динамическое ценообразование в E‑grocery
На практике управление ценами товаров часто реализуется через промо-механики. Это могут быть процентные скидки, акции вида 1+1 или 3=2, дополнительные скидки от платформы или специальные предложения на отдельные товары. Такие акции позволяют стимулировать спрос.
Задача динамического ценообразования в этом контексте — подобрать такие параметры промо, которые увеличивают продажи, но при этом сохраняют экономическую эффективность.
Нам нужно определить оптимальную цену. Подходим к этой задаче в два этапа:
Прогноз спроса при заданной цене.
Оценка эластичности (насколько спрос изменится при изменении цены).
Важно подчеркнуть, что в этой задаче речь не идет о персональном ценообразовании. Цены и параметры промо определяются на уровне региона, города или магазина и одинаковы для всех пользователей.

Возьмем цену на шоколадные конфеты ассорти Merci. Предположим, базовая цена — 500 рублей, наша комиссия — 20%, остальное — цена закупки (себестоимость товара).
Мы хотим построить эластичность этого товара, и у нас есть неплохая история изменения цены за последние 8 недель (таблица 1). Видим, что было 7 разных цен, и, например, при базовой цене в 500 рублей продавалось по 100 коробок (выручка — 50 000, наша доля — 10 000).

Теперь предположим, что у нас большой запас этих товаров и мы хотим продать как можно больше, при этом не потеряв в прибыли. Выгодно ли будет давать скидку? Как видно из таблицы, снизив цену на 10% (до 450 рублей), доля платформы с одной коробки падает до 90 рублей, а спрос поднимается до 117 штук. Общая выручка — 52 650, прибыль — 10 530. Мы заработали на 530 рублей больше по сравнению с базовой ценой.

Конечно, это упрощенный пример. В реальных расчетах важно учитывать источник скидки (платформа или ритейлер), поскольку это напрямую влияет на итоговую прибыль.
Прогнозирование спроса
Про прогнозирование спроса достаточно много открытых источников. Не будем долго задерживаться на этой теме, потому что ее можно обсуждать долго и мучительно.
Отмечу только самое важное.
В динцене спрос может измеряться объемом заказов или GMV (Gross Merchandise Value — выручка). Нам важно знать, сколько человек придет, и сколько единиц товара они потенциально закажут по конкретной цене. Это и является целевой величиной — количество заказов или GMV за заданный период времени.
Что влияет на спрос?
дни недели, сезонность (продажа мороженого летом vs зимой);
промокампании, акции и скидки;
наличие товара (если его нет на полках, спрос сразу падает до нуля);
ограничения на витрине;
погодные условия (влияют на некоторые категории продуктов);
действия конкурентов.
Для предсказания спроса используются разные подходы — от ARIMA/SARIMA до бустингов и нейросетей. Модели обучаются на нескольких источниках данных: история продаж, история цен и скидок, различия цен между магазинами и ритейлерами, наблюдаемая реакция спроса на изменения цены.
Кривая эластичности спроса
По построению эластичности в проде намного меньше информации, чем по прогнозированию спроса, поэтому здесь остановимся подробнее.
При построении кривой эластичности стоит обратная задача — убрать все факторы, используемые для предсказания спроса, и оставить только «чистую» зависимость спроса от цены. Ниже описан один из подходов построения.
Мы используем три основных источника данных: история продаж товара, история цен и скидок, а также наблюдаемые различия цен между магазинами и ритейлерами. Последнее особенно ценно — естественная вариация цен на один и тот же товар в разных точках позволяет оценить ценовую чувствительность без искусственного экспериментирования.
Предположим, что у каждого покупателя существует максимальная готовность платить T (Reservation Price). Покупка происходит тогда и только тогда, когда цена P не превышает эту величину:

S(P) — функция выживаемости (Survival Function). Она показывает долю клиентов, чья готовность платить превышает уровень P. Интуитивно ее можно интерпретировать как долю потенциальных покупателей, готовых купить товар по цене P. Чем выше цена — тем меньше клиентов остается в рынке, поэтому S(P) убывает по мере роста P.
Таким образом, задача построить чистую ценовую зависимость сводится к оценке функции S(P) — то есть распределения резервных цен покупателей.
Допустим, оцененная эластичность E=−1,5. Значит, изменение цены на 1% приводит к изменению спроса примерно на 1,5% в противоположном направлении.
Как это мы это делаем на практике?
Нормализуем продажи по времени наблюдения: кол-во покупок по цене / кол-во дней с этой ценой:

Агрегируем наблюдения по ценовым бинам.
Получаем эмпирическую оценку:

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

Далее сглаживаем полученную зависимость параметрической моделью (например, экспоненциальной S(P) = e −λP).
После оценки S(P) эластичность получается напрямую из определения:

Комментарий: Поскольку у эластичностей нет таргета, нужно заранее определить критерии для кривых, с которыми вы готовы работать в проде. Например, в E‑grocery мы не ожидаем, что спрос на товар будет падать при уменьшении цены по эффекту Веблена (демонстративное поведение). Поэтому если в проде встречаются такие эластичности, мы считаем их браком и фильтруем.
Комментарий: В базовой реализации предсказание спроса возможно хранить в эластичности, как в примере Merci выше, но в этом случае нужно накладывать дополнительное ограничение для предсказуемости результатов. К примеру: спрос на товар должен быть не сильно волатильным и не сезонным в течение года. Тогда предсказание спроса эластичностью может быть в пределах допустимого доверительного интервала. Если же модель предсказания спроса используется отдельно — кривая эластичности показывает только коэффициент изменения спроса при изменении цены.
Зачем нам одновременно прогноз спроса и эластичность
Сценарий 1. Эластичность без спроса
Предположим, что эластичность шоколада Merci оценена достаточно высоко: E=−1,5, то есть снижение цены на 10% приводит к росту количества товара примерно на 15%.
Эластичность отражает относительное изменение спроса, но ничего не говорит о его абсолютном масштабе. Представим, что после окончания сезона поток потенциальных покупателей резко снижается: за неделю страницу товара посещает всего 10 человек, и двое из них покупают товар за 500 рублей.
Снижаем цену до 450 рублей (−10%). Ожидаемый объем продаж:

Фактически это означает две или три продажи. При этом маржа теряется на всем объеме продаж.
Относительный рост спроса выглядит значительным (+15%), но абсолютный прирост минимален из-за низкого трафика, и дополнительный объем товара не компенсирует снижение цены.

Сценарий 2. Спрос без эластичности
Теперь рассмотрим обратный сценарий. Предположим, что Merci — товар, который покупают по необходимости. Для него характерна низкая ценовая эластичность:
E≈−0,2, то есть снижение цены на 10% приводит лишь к росту количества только на 2%.
Пусть в высокий сезон базовый спрос Q(0) составляет 100 единиц, при цене P(0)=500 рублей. Если цена снижается на 10% до P(1) и составляет 450 рублей, ожидаемый объем продаж будет:

Маржа на единицу товара снижается на 50 рублей, и совокупное изменение прибыли оценивается так:

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

Сложности прогнозирования спроса в E-grocery
Прогнозировать спрос в E-grocery действительно сложно. Я выделяю минимум пять типичных подводных камней.
Плохая частотность данных. 95% ассортимента в E-grocery продается редко. Для новых или нишевых продуктов просто нет такой истории цен и продаж, чтобы построить надежную модель. Нужно обрабатывать редкие товары отдельно или использовать более простые подходы.
Сильная сезонность. Ягоды, мороженое, праздничные категории. Пиковые периоды искажают работу модели, если не отмечать их признаками. Без учета сезонности прогноз не попадает в реальные колебания.
Разный спрос по регионам и сегментам пользователей. Купер доставляет по всей России. Спрос в Москве совсем не такой, как в Екатеринбурге, Владивостоке или Нижнем Новгороде. Везде люди покупают по-разному и разные продукты.
Остатки создают ложные нули. Модель без учета наличия будет думать, что спрос на товар резко упал, хотя на деле его просто не было на полке. Если политика ценообразования не синхронизирована с управлением запасами, мы можем снизить цену и увеличить спрос, но фактически продавать будет нечего.
Смешение периодов с разной инфляцией и динамикой рынка. Мы живем в очень волатильной среде, и это тоже «помогает» модели деградировать.
Сложности моделирования эластичности
Плохая частотность данных. Мало точек по разным ценам → невозможно оценить наклон. Если у нас только раз в месяц покупают какую-нибудь банку огурцов, мы никогда не поймем, как люди реагируют на ее цену.
Неверное определение спроса. Мы не можем строить эластичность просто на фактах покупок по цене, потому что тогда вкладываем в нее сезонность, промо и прочий шум, от которого хотим избавиться.
Каннибализация и товары-субституты. Если у товара есть много аналогов, без учета этого факта сложно выделить чистый ценовой эффект.
Несовместимость метрик. Эластичность — это не классическая ML-модель, и нельзя через стандартные метрики (MAPE, RMSE) измерить, ошибаемся мы или нет.
«Шершавые» кривые. При подсчете эластичности по нескольким месяцам получается рваная кривая: в один месяц при цене 100 рублей купили 80 единиц товара, в другой — 100. Нужно уметь сглаживать или удалять аномалии.
Несогласованность кривых между неделями. Отсутствие стабильной формы спроса в некоторых категориях требует корректировок.
Влияние конкурентов. Спрос может расти просто потому, что конкурент убрал скидку, а не из-за нашей скидки.
Оценка моделей. Модель предсказания спроса
Теперь можем обсудить метрику и оценку моделирования. Часто используют MAPE (среднюю абсолютную процентную ошибку) либо ее модификации, нормируя на спрос. Это позволяет сильнее штрафовать промахи там, где спрос большой, и слабее — в «нишевых» товарах с единичными покупками.

Пример различий между MAPE и WAPE адаптирован из учебника по машинному обучению.
Изучим пример. У нас есть прогноз продаж, и в целом мы видим, что модель справляется хорошо для топового товара. Но если мы считаем по предсказанию MAPE, ошибка составляет 36,7%. Все потому, что мы считаем равнозначной процентную ошибку на разных по популярности товарах. Хотя в реальности больше ценим ошибку на большом спросе.
Если мы используем WAPE (взвешенная абсолютная ошибка) — модификацию метрики MAPE, ошибки на популярных товарах будут иметь больший вклад в итоговую метрику, чем ошибки на редких позициях. Это связано с тем, что ошибка нормируется на суммарный объем спроса.

Модель предсказания эластичности
У эластичности нельзя оценить как классическую ML модель с таргетом. Если в задачах машинного обучения обработка данных влияет на качество модели, а сам таргет в задачах обучения с учителем определен, то эластичность меняется в зависимости от обработки данных, выбора функции моделирования, выбранного периода моделирования и огромного количества других факторов. Поэтому перед применением эластичности мы дополнительно оцениваем ее качество.
Важно подчеркнуть: речь идет не о метрике точности модели, а скорее о метрике ранжирования, позволяющей выделить товары, для которых ценовая зависимость выглядит наиболее устойчивой и экономически интерпретируемой.
При оценке качества нас интересуют несколько свойств одновременно.
Во-первых, устойчивость оценки во времени — насколько сильно меняется эластичность при пересчете на разных временных окнах.
Во-вторых, согласованность реакции спроса на изменение цены, то есть наличие системной и монотонной ценовой зависимости.
Дополнительно учитываются стабильность исходных данных, достаточность объема продаж и регулярность успешного обучения модели. Все эти факторы отражают не величину эластичности, а надежность ее оценки.
Интуитивно мы хотим, чтобы в верхнюю часть рейтинга попадали товары, для которых кривая спроса выглядела гладкой и монотонной, знак эластичности был стабильным, оценки повторялись от окна к окну, а объем наблюдений был достаточен для статистически осмысленного вывода. Именно такие SKU наиболее предсказуемы и создают минимальный риск при ценовой оптимизации.
Итоговый скор формируется как взвешенная сумма факторов:

Мы ранжируем товары не по величине эластичности, а по надежности ее оценки. В оптимизацию в первую очередь попадают товары с высоким качественным скором, поскольку для них риск ошибочного ценового решения минимален.
Насколько точен именно сам механизм построения эластичности, мы можем оценить в эксперименте, но об этом в следующих сериях…
Оптимизация прибыли
Теперь, когда получена оценка функции спроса и эластичности, можно поставить задачу оптимизации. Целью может быть максимизация прибыли, выручки, доли рынка или числа заказов. Для определенности рассмотрим задачу максимизации прибыли.
Базовые предположения для упрощенной постановки задачи:
товары оптимизируются независимо;
отсутствует каннибализация и перекрестная эластичность;
запас не ограничен;
эластичность постоянна.
В этой постановке задача решается отдельно для каждого товара.
Обозначения:
Q(P) — ожидаемый спрос при цене P;
Π(P) — прибыль;
a — масштаб спроса (уровень трафика и интереса к товару);
E — ценовая эластичность (E <0);
C — себестоимость.
Предположим, что локально спрос можно аппроксимировать моделью с постоянной эластичностью:

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

Подставляя выражение для спроса, получаем:

А дальше приступаем к самому нахождению оптимальной цены:

Финальный шаг — экономическая интерпретация.
Так как E<0, дробь E/(E+1) положительна. Формулу удобно переписать через модуль эластичности:

Если |E|→1+ (почти неэластичный спрос), оптимальная цена стремится к бесконечности.
Если |E| велико (сильно эластичный спрос), оптимальная цена приближается к себестоимости.
При −1<E<0 (неэластичный спрос) формула дает P(*)<0, что экономически бессмысленно. Это не ошибка — просто сигнал о том, что при неэластичном спросе прибыль монотонно растет с ценой и внутреннего максимума не существует. Формулу оптимальной цены можно применять только при E <−1. Для неэластичных товаров оптимальная цена упирается во внешние ограничения — рыночный потолок или целевую долю рынка.
Оптимальная цена определяется не направлением изменения, а чувствительностью спроса к цене.
Если спрос мало реагирует на цену (|E| близко к 1), то снижение цены почти не увеличивает объем, и скидки приводят главным образом к потере маржи. В этом случае оптимальная цена оказывается существенно выше себестоимости.
Если же спрос сильно эластичен (|E| велико), то даже небольшое снижение цены приводит к значительному росту объема. В такой ситуации работа ближе к себестоимости может быть экономически оправданной стратегией.
Оптимальная цена — это точка, в которой эти два эффекта в точности компенсируют друг друга.

Продолжение следует
Итак, мы разобрали базовые принципы динамического ценообразования в E-grocery: зачем оно нужно, как устроена кривая эластичности и почему для принятия ценовых решений недостаточно ни одной только эластичности, ни одного только прогноза спроса — нужны оба инструмента одновременно.
За рамками статьи осталось много интересного. Как повысить покрытие товаров эластичностями, если у большинства недостаточно продаж? Как оценить качество построения эластичности? Как выбрать стратегию оптимизации, когда цель бизнеса — не всегда максимум прибыли? Об этом — в следующих материалах серии.
Оставляйте свои вопросы и дополнения в комментариях :)
