fix(tradein/estimate): не строить цену по одному-двум аналогам, не отдавать 0 ₽ #2629

Merged
lekss361 merged 1 commit from fix/tradein-analog-sufficiency into main 2026-08-02 12:41:48 +00:00

1 commit

Author SHA1 Message Date
bot-backend
31f82fc5e9 fix(tradein/estimate): не строить цену по одному-двум аналогам, не отдавать 0 ₽
All checks were successful
CI / changes (pull_request) Successful in 7s
CI Trade-In / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 2m38s
Live-аудит на проде (2026-08-02): headline-медиана строилась даже по 1-4
листингам без проверки достаточности выборки (Серов 2к/45м2, n=3 листинга ->
42 391 руб/м2 vs честный ДКП-коридор 54 126, -36%; соседняя улица того же
города на других 1-2 лотах давала разброс до 1.3x). Каменск-Уральский на
редких room-count давал буквальный median_price_rub=0 без явного отказа.

Fix:
- HEADLINE_LISTINGS_MIN_N=5 (estimator.py) - ниже порога радиусная медиана
  подавляется (listings_clean НЕ очищается - нужен ghost-anchor guard'у #1871)
  и маршрутизируется на уже существующий deals-headline-fallback (#oblast-D,
  сделки Росреестра) или честный insufficient_data, если сделок тоже мало.
- deals-headline-fallback гейт исправлен с anchor_tier is None на anchor is
  None - anchor_tier оставался stale (не сбрасывался в None), когда
  _compute_same_building_anchor отклонял кандидата целиком, блокируя fallback
  даже при большом ДКП-покрытии (найдено live regen'ом бэктест-фикстуры).
- Честные explanation-тексты: отличают "объявлений действительно нет" от
  "нашли N, но недостаточно для доверия" - не показывают противоречивые
  сообщения одновременно.
- insufficient_data (computed field, median_price_rub<=0) остаётся
  единственным источником истины - PDF/API уже не показывают 0 как число.

Regenerated tests/fixtures/backtest_baseline.json: 8 из 277 прод-сделок
теперь используют deals-fallback вместо шумной 2-4-листинговой медианы
(mape_pct 13.23%->13.18%, headline spread_pct 17.98%->16.65%).
2026-08-02 15:16:08 +03:00