From d5201c37f6c90bd606e95e945056d717e28d4c09 Mon Sep 17 00:00:00 2001 From: bot-backend Date: Sat, 29 Aug 2026 22:49:46 +0300 Subject: [PATCH] =?UTF-8?q?docs(mera/estimate):=20=D0=BF=D0=BE=D0=BC=D0=B5?= =?UTF-8?q?=D1=82=D0=B8=D1=82=D1=8C=20=D1=81=D0=B5=D0=B3=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BD=D1=8B=D0=B5=20=D0=BC=D0=BD=D0=BE=D0=B6=D0=B8=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B8=20=D0=BA=D0=B0=D0=BA=20=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B1=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D0=BD=D0=B0=20=D0=B0=D1=80=D1=82=D0=B5=D1=84?= =?UTF-8?q?=D0=B0=D0=BA=D1=82=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Комментарий к estimate_segment_multipliers утверждал, что движок систематически занижает верхние сегменты (бизнес -16.3%, элит -25.7%), и множители 1.08/1.06 это чинят. Посылка неверна: _segment_metrics в бэктесте группирует ошибки по SOLD руб/м2 — по той самой величине, которую движок предсказывает. Группировка по исходу даёт регрессию к среднему, и монотонный спуск «чем дороже сегмент, тем сильнее занижаем» появляется у любого предиктора. Контрольный опыт на 13074 сделках ЕКБ: предиктор без сегментного перекоса по построению даёт в тех же корзинах бизнес -17.04%, элит -30.06% — больше, чем наблюдавшийся перекос движка (-9.74% и -18.45% на n=1191). Перекрёстная проверка с бэндом по независимому прокси (цена собственного дома) градиента не показывает вовсе. Флаг выключен, поведение не меняется — правка только текстовая. Смысл: не дать включить множители по прежнему обоснованию, подняв бизнес и элит на 6-8% без причины. Историческая посылка сохранена, но помечена как ненадёжная. --- tradein-mvp/backend/app/core/config.py | 29 ++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tradein-mvp/backend/app/core/config.py b/tradein-mvp/backend/app/core/config.py index 42db90af..8c190c48 100644 --- a/tradein-mvp/backend/app/core/config.py +++ b/tradein-mvp/backend/app/core/config.py @@ -718,6 +718,32 @@ class Settings(BaseSettings): estimate_quarter_from_coords_enabled: bool = False # ── Сегментная поправка эстиматора по ценовому бэнду (#2255) ────────────── + # + # ⚠ НЕ ВКЛЮЧАТЬ БЕЗ ПЕРЕЗАМЕРА. Посылка, на которой откалиброваны множители + # ниже («движок занижает верхние сегменты»), 2026-08-29 признана АРТЕФАКТОМ + # измерения, а не свойством движка. + # + # Причина: `scripts/backtest_estimator.py::_segment_metrics` группирует ошибки + # ПО SOLD ₽/м² — по той самой величине, которую движок предсказывает. Группировка + # по исходу даёт регрессию к среднему: в дешёвых корзинах любой предиктор выглядит + # завышающим, в дорогих — занижающим, даже при нулевом перекосе. + # + # Контрольный опыт (13 074 сделки ЕКБ с 2025-06): предиктор БЕЗ сегментного + # перекоса по построению — медиана окружения 1 км ÷ общий уровень — даёт в тех же + # корзинах эконом +22.28%, бизнес −17.04%, элит −30.06%. Это БОЛЬШЕ наблюдавшегося + # перекоса движка (бизнес −9.74%, элит −18.45% на n=1191), т.е. движок «занижает» + # ровно настолько, насколько этого требует способ замера, и даже меньше. + # + # Перекрёстная проверка: те же сделки, но бэнд задан НЕЗАВИСИМЫМ прокси (медиана + # активных объявлений собственного дома, own_n>=3) — градиент исчезает, остаётся + # ровный уровень +20…+27% (это разрыв asking↔sold, его чинит asking_to_sold_ratio). + # + # Следствие: включение флага подняло бы бизнес/элит на 6-8% БЕЗ ОСНОВАНИЯ. + # Прежде чем трогать — перевести `_segment_metrics` на независимый бэнд и + # перемерить. Абзац «band-mismatch» ниже описывает симптом того же артефакта. + # Разбор: vault `segment-bias-is-regression-to-the-mean-artifact`. + # + # ИСТОРИЧЕСКАЯ ПОСЫЛКА (сохранена как есть, НЕ опирайся на неё): # Эстиматор систематически занижает верхние сегменты (live-бэктест n=561, # 2026-07-03): эконом +3.2%, комфорт −4.5%, бизнес −16.3% (n=76), # элит −25.7% (n=16). Множитель применяется к median_price/median_ppm2 и @@ -740,6 +766,9 @@ class Settings(BaseSettings): # бизнес bias −10.4→−3.2, элит −30→−24.6, эконом почти intact (MAPE 18.0). # Дальнейшее сжатие bias без роста MAPE — только с confidence-гейтом # (не применять множитель на low-confidence предсказаниях) → follow-up issue. + # NB (2026-08-29): «bias −10.4→−3.2» выше меряет схлопывание АРТЕФАКТА, а не + # исправление ошибки — см. предупреждение в начале блока. Рост общего MAPE + # +1.87pp при этом настоящий: множитель двигает реальные цены. # Пересчёт биасов — см. scripts/backtest_estimator.py --calibrate-segments. estimate_segment_multipliers: dict[str, float] = { "эконом": 1.00, -- 2.45.3