feat(tradein/estimator): сегментная поправка headline+выкуп по ценовому бэнду за флагом (#2255) #2293

Merged
bot-backend merged 1 commit from feat/tradein-segment-multiplier into main 2026-07-03 18:43:39 +00:00
Collaborator

Что

Issue #2255: эстиматор систематически занижает верхние сегменты (бизнес −10.4%, элит −30% на детерминированном sample). Сегментная поправка за фичефлагом, default OFF — мерж безопасен, путь байт-в-байт, включение отдельным решением.

  • _apply_segment_multiplier: множитель по ценовому бэнду PRICE_SEGMENTS_PPM2 (константа вынесена в estimator как единый источник; backtest импортирует лениво через PEP 562 — бэндинг доказуемо идентичен скореру) к headline (median_price/ppm2/range) и к expected_sold (выкуп) той же пропорцией — бэктест скорит именно выкуп, поправка обязана доехать до оффера. honest_ratio инвариантен, «выкуп ≤ headline» сохраняется.
  • Вставка в _price_from_inputs после IMV-blend/corridor-clamp/quarter-index, перед _apply_range_floor. Битый/пустой multipliers-dict → no-op с warning (не роняет живую оценку).
  • Разбор asymmetric IMV-lift (acceptance-пункт): lift в проде мёртв (0/773 оценок) — оставлен как есть, bias живёт в основном спайне (зафиксировано в issue).
  • Новый режим --calibrate-segments в backtest (print-only: bias → raw → shrinkage λ=n/(n+40) → m).

Калибровка (три конфигурации, один детерминированный sample 300, туннель к прод-БД)

config overall MAPE бизнес bias элит bias эконом
OFF 13.55% −10.35% −30.2% +7.7% / 17.9%
v4 (1.12/1.10) +3.08 п.п. +0.41% −21.8% +10.4% / 20.2%
V2 (1.08/1.06) — выбран +1.87 п.п. −3.18% −24.6% intact (18.0%)

v4 отвергнут: band-by-predicted утечка (эконом-sold сделки, predicted в бизнес-бэнд, задираются дальше). Эконом/комфорт намеренно ×1.00. Дальнейшее сжатие bias без роста MAPE — только с confidence-гейтом (follow-up issue будет заведён).

Тесты

22 в новом файле (OFF-noop, пропорция headline+выкуп, инварианты, битый конфиг, комфорт-noop осознанный) + 470 -k estimator свип + hermetic regression gate зелёный БЕЗ регенерации baseline. ruff+UP clean.

Ревью

code-reviewer: APPROVE (все 6 фокус-пунктов зелёные, gate прогнан ревьюером самостоятельно).

Решение о включении — за Anton

Трейд-офф при ON: +1.87 п.п. overall MAPE в обмен на честные офферы бизнес/элит (сейчас занижены на 10-30% не в пользу клиента). Включается одним env-флагом, обратимо.

Refs #2255

## Что Issue #2255: эстиматор систематически занижает верхние сегменты (бизнес −10.4%, элит −30% на детерминированном sample). Сегментная поправка **за фичефлагом, default OFF** — мерж безопасен, путь байт-в-байт, включение отдельным решением. - `_apply_segment_multiplier`: множитель по ценовому бэнду `PRICE_SEGMENTS_PPM2` (константа вынесена в estimator как единый источник; backtest импортирует лениво через PEP 562 — бэндинг доказуемо идентичен скореру) к headline (median_price/ppm2/range) **и к expected_sold (выкуп)** той же пропорцией — бэктест скорит именно выкуп, поправка обязана доехать до оффера. honest_ratio инвариантен, «выкуп ≤ headline» сохраняется. - Вставка в `_price_from_inputs` после IMV-blend/corridor-clamp/quarter-index, перед `_apply_range_floor`. Битый/пустой multipliers-dict → no-op с warning (не роняет живую оценку). - **Разбор asymmetric IMV-lift** (acceptance-пункт): lift в проде мёртв (0/773 оценок) — оставлен как есть, bias живёт в основном спайне (зафиксировано в issue). - Новый режим `--calibrate-segments` в backtest (print-only: bias → raw → shrinkage λ=n/(n+40) → m). ## Калибровка (три конфигурации, один детерминированный sample 300, туннель к прод-БД) | config | overall MAPE | бизнес bias | элит bias | эконом | |---|---|---|---|---| | OFF | 13.55% | −10.35% | −30.2% | +7.7% / 17.9% | | v4 (1.12/1.10) | +3.08 п.п. ❌ | +0.41% | −21.8% | +10.4% / 20.2% ❌ | | **V2 (1.08/1.06) — выбран** | **+1.87 п.п.** | **−3.18%** | **−24.6%** | **intact (18.0%)** | v4 отвергнут: band-by-predicted утечка (эконом-sold сделки, predicted в бизнес-бэнд, задираются дальше). Эконом/комфорт намеренно ×1.00. Дальнейшее сжатие bias без роста MAPE — только с confidence-гейтом (follow-up issue будет заведён). ## Тесты 22 в новом файле (OFF-noop, пропорция headline+выкуп, инварианты, битый конфиг, комфорт-noop осознанный) + 470 `-k estimator` свип + **hermetic regression gate зелёный БЕЗ регенерации baseline**. ruff+UP clean. ## Ревью code-reviewer: ✅ APPROVE (все 6 фокус-пунктов зелёные, gate прогнан ревьюером самостоятельно). ## Решение о включении — за Anton Трейд-офф при ON: +1.87 п.п. overall MAPE в обмен на честные офферы бизнес/элит (сейчас занижены на 10-30% не в пользу клиента). Включается одним env-флагом, обратимо. Refs #2255
bot-backend added 1 commit 2026-07-03 18:41:08 +00:00
feat(tradein/estimator): сегментная поправка headline+выкуп по ценовому бэнду за флагом (#2255)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 8s
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 1m38s
7f483d0759
_apply_segment_multiplier: множитель по бэнду PRICE_SEGMENTS_PPM2 (единый
источник в estimator, backtest импортирует лениво через PEP 562 —
бэндинг доказуемо идентичен скореру) к median_price/ppm2/range И к
expected_sold (выкуп) той же пропорцией — бэктест скорит expected_sold,
поправка обязана доехать до оффера. Вставка после IMV-blend/
corridor-clamp/quarter-index, перед range_floor; honest_ratio инвариантен
(числитель и знаменатель ×один factor), «выкуп ≤ headline» сохраняется.

Калибровка OFF/ON (детерминированный sample 300, туннель): только
бизнес ×1.08 / элит ×1.06 (V2). v4 (1.12/1.10) отвергнут: band-by-predicted
утечка эконом-sold→predicted-бизнес даёт +3.08pp overall MAPE; V2 =
лучший трейд-офф (+1.87pp, бизнес bias −10.4→−3.2, элит −30→−24.6,
эконом intact). Эконом/комфорт намеренно 1.00. Дальнейшее сжатие bias —
только с confidence-гейтом (follow-up).

Флаг estimate_segment_multiplier_enabled default OFF — путь байт-в-байт,
hermetic regression gate зелёный БЕЗ регенерации baseline. Битый/пустой
multipliers-dict → no-op с warning. + режим --calibrate-segments в
backtest (print-only: bias→raw→shrinkage λ→m).

Refs #2255
bot-backend merged commit d15ff3d99d into main 2026-07-03 18:43:39 +00:00
bot-backend deleted branch feat/tradein-segment-multiplier 2026-07-03 18:43:39 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2293
No description provided.