ibiza
CPM · CTR …
/

Bid shading на практике: как платить меньше и не терять показы

≈ 7 мин чтения · обновлено

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, приходится оценивать распределение по выигрышам и проигрышам при разных ставках — это медленнее и требует экспериментов с ценой.

Фильтрация выборки

  1. Только ценовые проигрыши. Код 102 (Lost to Higher Bid). Проигрыши по флору (100), креативу (2xx) и таймауту (2) про конкурентов ничего не говорят.
  2. Одна валюта и единицы. min_to_win приходит в валюте и единицах ставки — CPM. Смешение валют ломает квантили.
  3. Свежесть. Конкуренция меняется в течение дня и недели; берут скользящее окно и выбрасывают старые наблюдения.
  4. Достаточный объем. Квантиль по пяти наблюдениям — шум. Нужен порог минимального числа наблюдений, ниже которого 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 от изменения рынка. Схема:

  1. Случайно делим аукционы (или пользователей) на две группы. В контрольной ставка не снижается, в тестовой — снижается.
  2. Деление детерминированное — по хешу идентификатора, чтобы одна единица всегда попадала в одну группу.
  3. Сравниваем не 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 позволяет заметить, когда модель устарела: например, после смены правил аукциона на бирже.

Порядок внедрения

  1. Проверить тип аукциона на каждой бирже: shading включается только там, где действует первая цена.
  2. Собрать данные без снижения. Неделя-две ставок по исходной оценке дают первое распределение min_to_win и базовые метрики для сравнения.
  3. Включить на части трафика. Тестовая группа с умеренным квантилем и заметной маржой, контрольная — без снижения.
  4. Сравнить экономику, а не только долю выигрышей: цену показа, объем, цену результата.
  5. Расширять постепенно, снижая маржу и подбирая квантиль по типам кампаний.
  6. Оставить контрольную группу навсегда: несколько процентов трафика без снижения — дешевая страховка от устаревшей модели.

Отдельно стоит решить, что делать с парами «креатив × слот» без данных. Безопасный вариант по умолчанию — исходная ставка без снижения: лучше переплатить на редких показах, чем систематически проигрывать на новых слотах.

Риски и как их закрыть

Риск Что происходит Защита
Биржа на второй цене 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?

Это ожидаемо: ставка стала ниже, и часть аукционов уходит конкурентам. Вопрос в том, окупает ли экономия на каждом показе потерю их количества.