fix(tradein/estimator): clamp premium headline к коридору сделок + робастный anchor (#1795) #1807
No reviewers
Labels
No labels
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
Fable 5 ревью
feedback/max
generative
GG-форсайт
needs-discussion
needs-human
observability
pause-bots
performance
priority/p0
priority/p1
priority/p2
priority/p3
scope/backend
scope/db
scope/devops
scope/frontend
scope/qa
scrapers
security
site-finder
stage/1
stage/2
status/blocked
status/done
status/needs-analysis
status/needs-fix
status/qa
status/ready
status/review
status/wip
tech-debt
tradein
ux
week ревью 1
wontfix
вторичка
ИРД
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: lekss361/gendesign#1807
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/tradein-estimator-premium-clamp-1795"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема (#1795)
Trade-in estimator системно завышает headline для бизнес/премиум — ~2× выше коридора реальных сделок Росреестра (эконом/комфорт сходятся ±5%). Малышева 30: TI 296k ₽/м² vs медиана сделок 138k (n20); Куйбышева 44: 324k vs 129k (n30); Татищева 20: 310k vs 150k (n29).
Корень — три складывающихся механизма: (1)
_compute_anchorзаменяет радиусную медиану similarity-weighted средним, которое на право-скошенном премиум-распределении тянут элитные комплы из Tier C micro-radius; (2) MAD-clip (k=3.5) слишком мягкий на малых n; (3) ДКП-коридор сделок — только advisory, headline не опускает.Фикс — 4 шага, все за settings-флагами (дефолты = ВКЛ, OFF восстанавливает старое поведение)
1. Soft-кламп headline к коридору сделок (главное) — новая чистая функция
_apply_corridor_clamp(estimator.py:3893-3937), вызов2665-2691ДО блока expected_sold (asking↔sold↔range пересчитываются от склампленного headline автоматически).dkp_rawфетч перенесён вверх (2074-2083), advisory-блок переиспользует тот же объект. Кламп приmedian_ppm2 > high_ppm2×(1+slack)Иcount>=min_nИtier!="A"→ жёсткий кап кhigh_ppm2×(1+slack), множитель кmedian_price/range_low/range_high. Флаги:estimate_corridor_clamp_enabled=True,estimate_corridor_clamp_min_n=10,estimate_corridor_clamp_slack=0.25.2. Ужесточённый MAD-clip на малых выборках в
_compute_same_building_anchor(1683-1702): приtier!="A"Иn<10эффективныйmad_k=2.5. Флаги:estimate_sb_mad_k_small_n=2.5,estimate_sb_small_n_threshold=10. NB: добавлен guardtier!="A"(отклонение от спека, обосновано) — без него агрессивный clip съедал легитимные топ-юниты того же дома → anchor=None → fallback на заниженную медиану, ломал 13 pre-existing Tier-A тестов. Tier-A exemption консистентен с философией issue.3. Гейт Tier C (
2295-2320): приanchor_tier=="C"Иanchor_ppm2 > corridor_high×1.5→ anchor=None (оставляем консервативную радиусную медиану). Флаг:estimate_anchor_tier_c_corridor_mult=1.5.4. Жёстче Tukey на малых выборках в
_filter_outliers(3940-3962): приn<15k снижается 1.5→1.0. Флаги:estimate_outlier_small_n_threshold=15,estimate_outlier_tukey_k_small=1.0.Тесты
tests/test_estimator_pure_units.py:_apply_corridor_clamp(выше коридора+n>=10+tierC→клампится; в коридоре→no-op; tier A→exempt; n<min→no-op; флаг OFF→no-op; tier None→клампится; zero corridor→no-op) + Tukey малых выборок.forgejo/main(провереноgit stash):test_cian_valuation::test_cache_hit_returns_cached(KeyError) +test_search_api::test_search_cache_hit(401 env-auth) — к этому фиксу отношения не имеют.DoD
corridor_high×1.25(≈172-190k вместо 296-324k), кроме Tier-A override.median_ppm2 <= high×(1+slack)→ no-op, покрыто тестом).Связано: #652 (dkp_corridor), #651 (sb_anchor), #677/#681 (asking→sold).