Цена как фактор: OFFER_PRICE, отклонение от медианы модели и средней по категории

Рейтинг: 0% · 0 голосов
Разбор устройства поиска и факторов ранжирования: реконструкция формулы, поведенческие, текстовые, ссылочные и хостовые факторы, антиспам, что живо и что давно мёртво. Аналитика на основе метаданных факторов web_production.
Ответить
Аватара пользователя
anna_seo
Сообщения: 70
Зарегистрирован: 11 май 2026, 05:31

Цена как фактор: OFFER_PRICE, отклонение от медианы модели и средней по категории

Сообщение anna_seo »

Зачем Маркету вообще знать цену как сигнал

Разбираю по исходникам товарной вертикали goods (ya/extsearch/goods). Сразу дисклеймер, чтобы потом не было вопросов: это реконструкция по реестру факторов и тегам, а не официальная формула Маркета. Ранжирует CatBoost-подобная модель (деревья решений), у факторов там НЕТ фиксированных процентных весов. Поэтому ниже я нигде не пишу "цена это N% выдачи" - такого числа не существует в природе. Говорю только качественно: где сигнал сильный, где слабый, и что вообще может крутить магазин.

Главное, что надо понять про цену в товарной выдаче: голая цифра в рублях сама по себе почти бесполезна. iPhone за 70k и чехол за 300 рублей - это не "дорогой" и "дешёвый" товар в одном смысле. Поэтому в реестре сырая цена есть, но рядом с ней живёт целый куст нормированных факторов - отношение цены оффера к медиане по модели и к средней по категории. Вот это и есть настоящая ценовая конкурентность, а не абсолютное число.

Сырые ценовые факторы (база)

Это то, что приходит прямо из фида и из агрегатов по модели/категории. Самый первый фактор реестра, Index 0 - это буквально цена оффера.

Код: Выделить всё

Index  Name                                  Tags (места выдачи)
0      OFFER_PRICE                           TG_BASE TG_OFFER TG_BLENDER_PLACE
                                             TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
-      OFFER_OLD_PRICE                       TG_BASE TG_MODEL_OFFER_PLACE
419    OVERALL_AVG_CATEGORY_PRICE            TG_BASE TG_DOCUMENT_STATIC
                                             TG_BLENDER_PLACE TG_TEXT_PLACE
420    OVERALL_MEDIAN_MODEL_PRICE            TG_BASE TG_DOCUMENT_STATIC
                                             TG_BLENDER_PLACE TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
-      AVG_MODEL_PRICE / MIN_MODEL_PRICE     TG_BASE TG_MODEL TG_BLENDER_PLACE
       MAX_MODEL_PRICE                       TG_MODEL_OFFER_PLACE TG_TEXT_PLACE
-      DELIVERY_PRICE                        TG_BASE TG_DELIVERY TG_TEXT_PLACE
Расшифровка по смыслу:
  • OFFER_PRICE - цена конкретного предложения. Базовый кирпич, но модель его почти всегда смотрит не сам по себе, а в паре с нормировками ниже.
  • OFFER_OLD_PRICE - старая (зачёркнутая) цена. Существует именно для того, чтобы можно было посчитать величину скидки. Живёт только на карточке товара (TG_MODEL_OFFER_PLACE).
  • OVERALL_MEDIAN_MODEL_PRICE - медианная цена по всем офферам этой модели. То есть "сколько вообще стоит вот эта конкретная железка у всех продавцов".
  • OVERALL_AVG_CATEGORY_PRICE - средняя цена по категории целиком. Это уже про ценовой сегмент: дешёвый/средний/премиум товар внутри своего класса.
  • MIN/MAX/AVG_MODEL_PRICE - разброс цен внутри модели.
Что доказано кодом: OFFER_PRICE имеет Index 0 и теги TG_OFFER + все три места выдачи (текстовая, карточка с офферами, блендер). Цена считается на каждом уровне, где Маркет вообще ранжирует. Что реконструкция: то, что модель "не любит" голую цену и опирается на нормировки - вывод из того, что отдельных нормированных факторов в реестре в разы больше, чем сырых.
Нормировки - вот где живёт реальная конкурентность

Это ядро темы. Цена оффера делится на ориентир - медиану модели или среднюю по категории. Получается безразмерное отношение, которое одинаково осмысленно и для чехла, и для iPhone.

Код: Выделить всё

Index  Name                                              Смысл (price / orientir)
421    OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE        цена / медиана по модели
-      OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE        то же, но + доставка
       _WITH_DELIVERY
-      OFFER_PRICE_DIV_OVERALL_AVG_CATEGORY_PRICE        цена / средняя по категории
1659   DIFF_TO_MIN_PRICE                                 отрыв от минимума (TG_OFFER)
252    MODEL_MAX_PRICE_TO_MIN_PRICE                      разброс цен внутри модели
-      MODEL_AVG_PRICE_TO_MIN_PRICE                      средняя к минимуму
-      MODEL_MAX_PRICE_TO_AVG_PRICE                      макс к средней
-      PRICE_DIV_PERC1_PRICE_IN_CATEGORY_FOR_PRISM       цена / 1й перцентиль категории
-      PRICE_DIV_PERC50_PRICE_IN_CATEGORY_FOR_PRISM      цена / медиана категории (prism)
-      PRICE_DIV_AVG_PRICE_IN_CATEGORY_FOR_PRISM         цена / средняя категории (prism)
Как это читать:
  • OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE = 1.0 означает "ты ровно по медиане за эту модель". Меньше 1 - ты дешевле большинства, больше 1 - дороже. Версия _WITH_DELIVERY важна отдельно: Маркет умеет сравнивать с учётом доставки, и тут можно проиграть конкуренту, у которого товар на рубль дороже, но доставка бесплатная.
  • DIFF_TO_MIN_PRICE (TG_OFFER) - насколько ты отстаёшь от самого дешёвого оффера в модели. Это прямой сигнал "ты не самый дешёвый и вот настолько". Тег TG_FORMULA_CHECK_PARROT у него и у MIN_MODEL_PRICE намекает, что эти величины ещё и контролируются на вменяемость на уровне формулы.
  • PRICE_DIV_PERC1 / PERC50 / AVG ..._FOR_PRISM - семейство prism. Сравнивает цену не с моделью, а с распределением по категории: с первым перцентилем (по сути самые дешёвые предложения), с медианой и со средней. Это и есть "ценовой сегмент внутри категории".
  • MODEL_MAX_PRICE_TO_MIN_PRICE и соседи - характеризуют не тебя, а саму карточку: насколько в ней растащены цены. Если разброс огромный, медиана как ориентир работает хуже, и модель это видит.
Граница: OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE (Index 421) и пара _WITH_DELIVERY стоят на TG_BLENDER_PLACE и TG_MODEL_OFFER_PLACE - это доказанные кодом места, где цена-относительно-медианы реально участвует в подмешивании и в карточке. А вот трактовка "дешевле медианы = выше" - реконструкция: дерево решений может вести себя нелинейно, слишком низкая цена иногда читается как подозрительная (не тот товар, серый, битый).
Скидки, промо, юнит-экономика

Код: Выделить всё

Name                       Tags                          Смысл
DISCOUNT_IN_RUB            TG_DOCUMENT TG_BASE           размер скидки в рублях
MODEL_DISCOUNT            TG_DOCUMENT TG_BASE           скидка на уровне модели
PROMO_PRICE_IN_RUB        TG_DOCUMENT TG_BASE           промо-цена
HAS_ACTIVE_PROMO          TG_DOCUMENT TG_BASE           есть активное промо (флаг)
MODEL_HAS_PROMO           TG_DOCUMENT TG_BASE           промо на модели (флаг)
UE_TO_PRICE               TG_OFFER TG_MODEL_OFFER_PLACE  юнит-экономика к цене
                          TG_TEXT_PLACE
PRICE_SEGMENT_IN_CART     TG_OFFER TG_MODEL_OFFER_PLACE  ценовой сегмент в корзине
Тут важно: DISCOUNT_IN_RUB, MODEL_DISCOUNT, HAS_ACTIVE_PROMO, MODEL_HAS_PROMO - все на TG_DOCUMENT, ни один не помечен TG_DEPRECATED/TG_UNUSED, то есть это живые сигналы. Маркет отдельно знает и факт промо (флаг), и его величину в рублях. Флаг HAS_ACTIVE_PROMO дешёво "подсвечивает" товар как акционный, а DISCOUNT_IN_RUB/PROMO_PRICE_IN_RUB уже про реальную выгоду.

UE_TO_PRICE стоит особняком - это юнит-экономика относительно цены. Стоит на TG_OFFER и попадает в текстовую выдачу и карточку. По названию это маркетплейсовый, "синий" сигнал про маржинальность/ставку относительно цены, а не чисто пользовательский. Помним свежую практику 2025-2026: в Бусте продаж часть ставки можно пустить на снижение цены, чтобы стать главным оффером в карточке - вот такие вещи и цепляются за этот пласт факторов.

Что из этого реально контролирует магазин
  • OFFER_PRICE - очевидно, цена в фиде. Но оптимизировать надо не абсолют, а отношение к медиане модели и к перцентилям категории. Цель - попасть в зону "не хуже медианы", в идеале ближе к минимуму, но без явного демпинга в подвал (это ловит и Маркет, и собственные репрайсеры).
  • DIFF_TO_MIN_PRICE - смотрите отчёты "Конкурентность цен" и "Цены конкурентов" в кабинете. Они фактически показывают вам ту же дельту до минимума, что видит индекс.
  • Доставка - версия _WITH_DELIVERY означает, что бесплатная/дешёвая доставка напрямую улучшает вашу относительную цену. Платная доставка может убить выгодную цену в сравнении.
  • Промо - HAS_ACTIVE_PROMO и DISCOUNT_IN_RUB живые. Но скидка должна быть честной (через OFFER_OLD_PRICE), а не нарисованной завышением старой цены.
  • Стабильность - индекс раскатывается шардами раз в ~12 часов, так что моментального отклика на смену цены не ждите, ценовые агрегаты по модели и категории тоже не мгновенные.
Итог и границы вывода
Доказано кодом: в реестре есть живые (не deprecated) факторы OFFER_PRICE (0), OVERALL_MEDIAN_MODEL_PRICE (420), OVERALL_AVG_CATEGORY_PRICE (419), OFFER_PRICE_DIV_OVERALL_MEDIAN_MODEL_PRICE (421) и его _WITH_DELIVERY, DIFF_TO_MIN_PRICE (1659), семейство ..._FOR_PRISM, MODEL_*_PRICE_TO_*_PRICE (252 и соседи), DISCOUNT_IN_RUB, HAS_ACTIVE_PROMO, UE_TO_PRICE. Их теги показывают места выдачи: блендер, карточка с офферами, текстовая выдача.

Реконструкция (НЕ доказано): направление влияния ("дешевле = выше"), нелинейность, любые проценты. CatBoost не даёт факторам статических весов - всё зависит от контекста запроса и категории. Среди разобранных ключевых ценовых факторов мёртвых (TG_DEPRECATED/TG_UNUSED) не обнаружено.
Практический вывод одной строкой: оптимизируйте не рубли, а свою позицию относительно медианы модели и перцентилей категории с учётом доставки - именно это закодировано в куче DIV-факторов, и именно это вам показывают отчёты конкурентности в кабинете.
👍 ❤️ 🔥 😄 🤔
Ответить
Поделиться темой: ✈ Telegram VK

Вернуться в «SEO и факторы ранжирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей