Bid shading на практике: как платить меньше и не терять показы
Bid shading — это снижение ставки в аукционе первой цены до уровня, которого исторически хватало для выигрыша, плюс страховочная маржа. На практике строят распределение минимальной выигрышной цены (${AUCTION_MIN_TO_WIN} из уведомлений биржи) для каждой пары «креатив × слот», выбирают квантиль, умножают на маржу и не дают ставке выйти за пределы флора и исходной оценки. Проверяют эффект слепым тестом с контрольной группой без снижения.
Зачем снижать ставку
В аукционе первой цены победитель платит свою ставку. Если вы оценили тысячу показов в 100 ₽ и ставите 100 ₽, а следующая ставка была 70 ₽, вы переплатили 30 ₽ — их можно было оставить себе, ничего не потеряв. Bid shading пытается угадать эти 70 ₽ заранее. Теория — в статье «Аукцион первой и второй цены», определение — в глоссарии «Bid shading».
Важно. Shading имеет смысл только в первой цене (
BidRequest.at = 1). Во второй цене цену определяет конкурент, и снижение ставки уменьшает только число выигрышей, а не платеж.
Шаг 1. Собрать данные о цене выигрыша
Источники сигнала
| Источник | Что дает | Ограничения |
|---|---|---|
${AUCTION_MIN_TO_WIN} в lurl |
Сколько нужно было поставить, чтобы сравняться с победителем | Биржа может оставлять пустым; макрос появился в OpenRTB 2.6 |
${AUCTION_MIN_TO_WIN} при выигрыше |
Сколько хватило бы: следующая ставка или флор | Не все биржи подставляют при выигрыше |
${AUCTION_LOSS} |
Код причины: использовать только ценовые проигрыши (102) | Без кода в выборку попадут отказы по креативу |
Цена клиринга ${AUCTION_PRICE} |
Сколько заплатили при выигрыше | В первой цене равна ставке, нового не говорит |
Флор imp.bidfloor |
Нижняя граница | Не отражает конкуренцию |
Если биржа не присылает min_to_win, приходится оценивать распределение по выигрышам и проигрышам при разных ставках — это медленнее и требует экспериментов с ценой.
Фильтрация выборки
- Только ценовые проигрыши. Код 102 (Lost to Higher Bid). Проигрыши по флору (100), креативу (2xx) и таймауту (2) про конкурентов ничего не говорят.
- Одна валюта и единицы.
min_to_winприходит в валюте и единицах ставки — CPM. Смешение валют ломает квантили. - Свежесть. Конкуренция меняется в течение дня и недели; берут скользящее окно и выбрасывают старые наблюдения.
- Достаточный объем. Квантиль по пяти наблюдениям — шум. Нужен порог минимального числа наблюдений, ниже которого shading для пары не включается.
Почему «креатив × слот», а не просто слот
Конкуренция зависит от места размещения (у разных слотов разные флоры и покупатели) и от формата креатива: на один и тот же запрос с несколькими форматами за баннер и за видео торгуются разные покупатели. Пара «объявление × слот» — компромисс между точностью и объемом данных. Чем мельче разрез, тем точнее распределение, но тем больше пар не набирают минимальную выборку.
Шаг 2. Выбрать квантиль
Пусть по паре «креатив × слот» за последние часы собрано 10 ценовых проигрышей, min_to_win в рублях CPM (условные числа):
52, 55, 58, 60, 61, 63, 66, 70, 74, 90
Если бы мы ставили ровно min_to_win, мы бы сравнялись с победителем. Квантиль распределения показывает, какую долю этих аукционов мы бы выиграли при данной ставке:
| Квантиль | Значение, ₽ | Доля «выигранных» аукционов из выборки |
|---|---|---|
| 0,5 (медиана) | ~62 | около половины |
| 0,7 | ~67 | около 70 % |
| 0,9 | ~76 | около 90 % |
Чем выше квантиль, тем выше win rate и тем больше переплата в аукционах, которые выиграли бы и дешевле. Если исходная оценка 100 ₽, ставка по квантилю 0,7 экономит около трети цены — но только на выигранных показах.
Как выбирать квантиль
- От цели кампании. Если важен объем (охват, установки в сроки) — квантиль выше; если важна цена результата — ниже.
- От формы распределения. Если распределение узкое (52–70), разница между квантилями невелика и можно брать низкий. Если длинный хвост (до 90 и выше), высокий квантиль дорог.
- Квантиль ≠ win rate. Выборка состоит из проигрышей при старых ставках. Когда ставка меняется, меняется и состав аукционов, в которых вы проигрываете, — реальный win rate будет отличаться от квантиля. Поэтому квантиль — начальная точка, которую калибруют по фактическому win rate.
Шаг 3. Добавить маржу и ограничения
Итоговая ставка:
ставка = min( оценка, max( флор + шаг, квантиль × (1 + маржа) ) )
- Маржа страхует от шума: распределение посчитано с задержкой, а конкуренты меняют поведение. Маржа 5–10 % — условная отправная точка, а не норма; ее подбирают тестом.
- Потолок — оценка показа. Shading может только снижать ставку. Если квантиль с маржой выше ценности показа, ставим оценку или не ставим вовсе.
- Пол — флор. Ставка ниже
bidfloorгарантированно проиграет с кодом 100.
Пример: оценка 100 ₽, квантиль 0,7 = 67 ₽, маржа 8 %, флор 40 ₽. Ставка = min(100, max(40,01; 67 × 1,08)) = 72,36 ₽.
Маржа и квантиль работают вместе
Высокий квантиль с нулевой маржой и низкий квантиль с большой маржой могут дать одинаковую ставку, но ведут себя по-разному. Квантиль следует за формой распределения: если конкуренция на слоте выросла, ставка поднимется сама. Маржа — фиксированный запас поверх него, который не реагирует на рынок. Поэтому основную настройку делают квантилем, а маржу держат небольшой и меняют редко — только когда тест показывает систематический недобор выигрышей.
Шаг 4. Слепой тест
Без контрольной группы невозможно отличить эффект shading от изменения рынка. Схема:
- Случайно делим аукционы (или пользователей) на две группы. В контрольной ставка не снижается, в тестовой — снижается.
- Деление детерминированное — по хешу идентификатора, чтобы одна единица всегда попадала в одну группу.
- Сравниваем не win rate, а экономику:
| Метрика | Контроль | Тест (условный пример) | Как читать |
|---|---|---|---|
| Win rate | 22 % | 17,4 % | Падение ожидаемо |
| Средняя цена показа, ₽ CPM | 98 | 71 | Экономия на показе |
| Показы | 10 000 | 7 900 | Потеря объема |
| Расход, ₽ | 980 | 561 | — |
| Клики | 100 | 79 | При неизменном CTR |
| Цена клика, ₽ | 9,8 | 7,1 | Главный итог |
Тест «выиграл», если цена результата (клика, установки, конверсии) снизилась, а потеря объема приемлема для кампании. Если цена результата не изменилась, а объем упал, shading только мешает.
Важно. Слепой тест — это еще и защита на будущее. Небольшая постоянная контрольная группа без shading позволяет заметить, когда модель устарела: например, после смены правил аукциона на бирже.
Порядок внедрения
- Проверить тип аукциона на каждой бирже: shading включается только там, где действует первая цена.
- Собрать данные без снижения. Неделя-две ставок по исходной оценке дают первое распределение
min_to_winи базовые метрики для сравнения. - Включить на части трафика. Тестовая группа с умеренным квантилем и заметной маржой, контрольная — без снижения.
- Сравнить экономику, а не только долю выигрышей: цену показа, объем, цену результата.
- Расширять постепенно, снижая маржу и подбирая квантиль по типам кампаний.
- Оставить контрольную группу навсегда: несколько процентов трафика без снижения — дешевая страховка от устаревшей модели.
Отдельно стоит решить, что делать с парами «креатив × слот» без данных. Безопасный вариант по умолчанию — исходная ставка без снижения: лучше переплатить на редких показах, чем систематически проигрывать на новых слотах.
Риски и как их закрыть
| Риск | Что происходит | Защита |
|---|---|---|
| Биржа на второй цене | Shading режет выигрыши, не снижая цену | Включать только при at = 1 |
| Малая выборка | Квантиль по единицам наблюдений скачет | Порог минимального числа наблюдений, иначе — без shading |
| Устаревшие данные | Сбор остановился, распределение замерло | Ограниченный срок жизни распределения, после — откат на исходную ставку |
| Динамические флоры | Площадка поднимает флор вслед за ставками | Следить за кодом 100 и средним bidfloor по слоту |
| Смещение выборки | Проигрыши видны только при текущих ставках | Калибровать по фактическому win rate, держать контрольную группу |
Пустой min_to_win |
Биржа не раскрывает цену | Не подставлять ноль: пустые значения исключать |
| Смешение валют | Квантиль по рублям и долларам вместе | Нормализовать к одной валюте до расчета |
Связь с автобидом
Shading отвечает на вопрос «сколько минимально нужно для выигрыша», а стратегия ставок — на вопрос «сколько выигрышей нам нужно». Если у кампании есть цель по доле выигрышей, квантиль подбирают итеративно: ставка двигается вверх, когда фактический win rate ниже цели, и вниз, когда выше. Разбор проигрышей, на которых строится выборка, — в статье «Почему я проиграл аукцион».
Bid shading в DSP Ibiza
В DSP Ibiza bid shading устроен по схеме из этой статьи. Квантиль считается по ценовым проигрышам (код 102 с непустым min_to_win) для каждой пары «объявление × слот» в скользящем окне и регулярно пересчитывается. Ставка умножается на маржу, только снижается и не опускается ниже флора плюс минимальный шаг. Пары с малой выборкой пропускаются, а если данные устарели, DSP возвращается к исходной ставке. Объявления в режиме второй цены shading не затрагивает. Автобид отдельно калибрует ставку под целевой win rate. Как включить и настроить — в документации: bid shading и автобид.
Частые вопросы
На каких данных строится bid shading?
На распределении минимальной выигрышной цены: макрос ${AUCTION_MIN_TO_WIN} в уведомлениях о проигрыше и выигрыше, а также цены клиринга по выигрышам. Данные собирают отдельно для каждой комбинации креатива и места размещения.
Сколько данных нужно, чтобы включить shading на слоте?
Столько, чтобы квантиль перестал скакать: задают порог минимального числа ценовых проигрышей на пару «креатив × слот» и ниже него ставку не снижают. В Ibiza этот порог по умолчанию — 50 проигрышей.
Как понять, что bid shading работает?
Сравнить слепым тестом: часть трафика торгуется без снижения, часть — со снижением. Shading работает, если цена показа упала сильнее, чем число показов, а итоговая цена результата (клика, установки) не выросла.
Почему после включения shading упал win rate?
Это ожидаемо: ставка стала ниже, и часть аукционов уходит конкурентам. Вопрос в том, окупает ли экономия на каждом показе потерю их количества.