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,