fix(mera/backtest): свежая фикстура не реплеилась, а разрез по сегментам врал по построению #3254
No reviewers
Labels
No labels
Fable 5 ревью
GG-форсайт
admin
analytics
auth
automation
bug
business
chore
ci
compliance
data
data-moat
docs
duplicate
dx
enhancement
feedback/max
generative
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#3254
Loading…
Add table
Reference in a new issue
No description provided.
Delete branch "fix/3251-backtest-harness-stale-fixture-and-outcome-bucketing"
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?
Summary
Три связанные правки в харнесе бэктеста + замена фикстуры. Пункты 3 и 4 из плана сессии; открывают дорогу #3248.
1. Свежая фикстура не реплеилась вообще
replay_fixtureжёстко пинилestimate_dedup_analogs_enabled = False. Это верно только для фикстуры, захваченной до #2173, когда дедуп был выключен по умолчанию. Любая свежая фикстура становилась нереплеибельной: приdedup=Trueна захвате часть сделок уходит под sufficiency-гейт сmedian_ppm2<=0,ratio_resolverдля них не зовётся, а реплей сdedup=Falseих оценивает и падает наcontrol flow diverged from capture(331 сделка из 1600). Теперь значение берётся изsettings_at_capture; фикстуры без этого поля ведут себя как раньше.2.
per_segmentврёт по построениюРазрез группирует ошибки по SOLD ₽/м² — по величине, которую движок и предсказывает. Корзины отобраны по шуму исхода → регрессия к среднему: даже несмещённый предиктор выглядит завышающим в дешёвых корзинах и занижающим в дорогих.
Контрольный опыт (13 074 сделки ЕКБ), предиктор БЕЗ сегментного перекоса по построению:
Артефакт больше «находки». По нему уже один раз откалибровали
estimate_segment_multipliers(#2255) — множители обезврежены комментарием в #3249. Блок оставлен для сравнимости с историей прогонов, но помечен предупреждением в докстринге и в печатном выводе.3. Новый разрез
per_area_bucketОсь независима от исхода, границы совпадают с
asking_to_sold_ratios(30/44/62/85) — промах конкретного бакета ratio виден сразу. Аддитивно:area_rows=Noneу старых вызывающих даёт пустой словарь, форма ответа не меняется.4. Фикстура заменена на свежую
Прежняя от 2026-07-04 старше перехода ratio на area-бакеты (#2620, 2026-08-05) — она измеряла точность конфигурации, которой в проде уже нет. Новая: 1600 сделок ЕКБ с 2025-06, 1269 оценённых,
--resolve-house-id.unrecorded_lookup_callsСдвиг метрик — смена измерительной выборки, НЕ регресс движка. Выборка больше в 4.7 раза и отражает действующую конфигурацию.
5. Каверза (d) в докстринге модуля
Предсказание идёт из центроида улицы, а не из адреса дома: в открытом датасете Росреестра нет номера дома (
deals.address= «Екатеринбург, Краснолесья»), кадастры все вида66:41:0000000:0(пригодных 0 из 108 623), и 65 971 сделка за 2025+ садится всего в 3 137 координат. Отсюда же--resolve-house-idрезолвит лишь ~40%.Test plan
pytest tests/test_backtest_regression_gate.py tests/test_backtest_fixture_roundtrip.py tests/test_backtest_estimator.py— 77 passedunrecorded_lookup_calls = 0, числа сходятся с прямым прогоном по БДper_area_bucketна старой фикстуре не двигаетoverall(12.63 / −3.74 байт-в-байт) — блок чисто аддитивныйruff check+ruff format --checkчисто