Замер калибровки доверительного интервала по регионам #3535

Merged
lekss361 merged 1 commit from fix/pi-calibration-by-region into main 2026-09-16 16:28:19 +00:00
Owner

Зачем

Вилка цены строится множителями estimate_pi_low_mult = 0.649 / estimate_pi_high_mult = 1.392 — эмпирические p10/p90 отношения sold/expected_sold, снятые один раз на Екатеринбурге (#1966, n=2366). Проверить, что они всё ещё дают заявленные 80% попаданий, было нечем: харнесс печатал p25/p75 знаковой ошибки, то есть 50%-ный интервал.

Прод-паритетный замер (--engine full --resolve-house-id --spread scattered --seed 42 --since 2025-06-01) показал, что 80% не выдерживаются нигде:

регион n покрытие вилки
77 Москва 1969 69.0%
50 область 1632 75.4%
66 ЕКБ 1362 66.7%

Хуже всего в регионе, на котором калибровали. Это инструмент, чтобы пересчитать множители по регионам.

Что внутри

  • --pi-report — p10/p50/p90 отношения r = sold_total / expected_sold_price (рублёвые итоги: множитель в эстиматоре применяется к итоговой цене, не к ₽/м²), фактическое покрытие текущей вилки, покрытие предложенной [p10, p90], ширина обеих. Разрез по комнатным корзинам.
  • --pi-report-json PATH — те же числа машиночитаемо, чтобы свести регионы без парсинга текста.
  • Множители читаются из живых settings, не хардкодятся.

Харнесс остаётся READ-ONLY, без флага вывод байт-в-байт прежний — замороженный регресс-гейт не трогается.

Test plan

  • Офлайн на фикстуре: --from-fixture tests/fixtures/backtest_full_fixture.json.gz --pi-reportpropos% = 79.7-80.1 по всем корзинам, то есть величина r согласована с определением множителей.
  • ruff format + ruff check чисто.
  • Боевой прогон по 77/50/66 после деплоя — числа пойдут в отдельный PR с самими множителями.
## Зачем Вилка цены строится множителями `estimate_pi_low_mult = 0.649` / `estimate_pi_high_mult = 1.392` — эмпирические p10/p90 отношения `sold/expected_sold`, снятые один раз на Екатеринбурге (#1966, n=2366). Проверить, что они всё ещё дают заявленные 80% попаданий, было нечем: харнесс печатал p25/p75 знаковой ошибки, то есть 50%-ный интервал. Прод-паритетный замер (`--engine full --resolve-house-id --spread scattered --seed 42 --since 2025-06-01`) показал, что 80% не выдерживаются нигде: | регион | n | покрытие вилки | |---|---|---| | 77 Москва | 1969 | 69.0% | | 50 область | 1632 | 75.4% | | 66 ЕКБ | 1362 | **66.7%** | Хуже всего в регионе, на котором калибровали. Это инструмент, чтобы пересчитать множители по регионам. ## Что внутри - `--pi-report` — p10/p50/p90 отношения `r = sold_total / expected_sold_price` (рублёвые итоги: множитель в эстиматоре применяется к итоговой цене, не к ₽/м²), фактическое покрытие текущей вилки, покрытие предложенной `[p10, p90]`, ширина обеих. Разрез по комнатным корзинам. - `--pi-report-json PATH` — те же числа машиночитаемо, чтобы свести регионы без парсинга текста. - Множители читаются из живых `settings`, не хардкодятся. Харнесс остаётся READ-ONLY, без флага вывод байт-в-байт прежний — замороженный регресс-гейт не трогается. ## Test plan - [x] Офлайн на фикстуре: `--from-fixture tests/fixtures/backtest_full_fixture.json.gz --pi-report` → `propos%` = 79.7-80.1 по всем корзинам, то есть величина `r` согласована с определением множителей. - [x] `ruff format` + `ruff check` чисто. - [ ] Боевой прогон по 77/50/66 после деплоя — числа пойдут в отдельный PR с самими множителями.
lekss361 added 1 commit 2026-09-16 16:07:40 +00:00
feat(backtest): замер калибровки доверительного интервала по регионам
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI / changes (pull_request) Successful in 12s
CI Trade-In / browser-tests (pull_request) Has been skipped
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 4m53s
2591968286
Вилка цены строится множителями estimate_pi_low_mult/high_mult, которые
калибровали один раз на Екатеринбурге (#1966, n=2366) как эмпирические
p10/p90 отношения sold/expected_sold. Проверить, что они всё ещё дают
заявленные 80% попаданий, было нечем: харнесс считал только p25/p75
знаковой ошибки, то есть 50%-ный интервал.

--pi-report печатает p10/p50/p90 отношения r = sold_total /
expected_sold_price (рублёвые итоги — множитель в эстиматоре применяется
именно к итоговой цене), фактическое покрытие текущей вилки и покрытие
предложенной [p10, p90], плюс ширину обеих. Разрез по комнатным корзинам.
--pi-report-json кладёт те же числа машиночитаемо, чтобы свести регионы.

Множители читаются из живых settings, не хардкодятся. Без флага вывод
харнесса байт-в-байт прежний — замороженный регресс-гейт не трогается.

Проверено на фикстуре: propos% = 79.7-80.1 по всем корзинам, то есть
величина r согласована с определением множителей.
lekss361 merged commit 0c6b5a4548 into main 2026-09-16 16:28:19 +00:00
lekss361 deleted branch fix/pi-calibration-by-region 2026-09-16 16:28:20 +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#3535
No description provided.