Assemble merged §9.x services into per-(segment×horizon) DemandSupplyForecast: demand (§9.2 pace × §9.4 norm × §9.5 macro, linear no-compound) vs supply (open + phased hidden h/18 + future_online − absorbed, §9.3) → balance / deficit_index[-1,+1] + §9.7 future competitors. Pure synthesis, no §9.x math rebuilt; β counted EXACTLY ONCE (via §9.4 only; rate_sensitivity surfaced for phrase only; §9.5 orthogonal). Supply net clamped ≥0; deficit_index None on supply≤0 (no fake infinite deficit). confidence=MIN(components) capped medium; advisory=True always. Deterministic, no LLM, no SQL, un-wired. 89 unit tests (pure helpers + mocked orchestrator incl. adversarial β-once test), all green.
102 lines
3.4 KiB
Python
102 lines
3.4 KiB
Python
"""Forecasting services — детерминированный форсайт-слой Site Finder v2.
|
||
|
||
#951 (Site Finder v2 / «GG-форсайт», EPIC 7 «Чувствительность к ключевой ставке»).
|
||
|
||
Этот пакет — фундамент data-independent логики прогноза: monthly макро-ряды,
|
||
классификатор режима ставки, лаговые помощники. Всё ДЕТЕРМИНИРОВАННО, БЕЗ LLM.
|
||
|
||
Слои (по PR):
|
||
• macro_series (#951b) — monthly макро-ряд + классификатор режима ставки (X-ось §9.6).
|
||
• sales_series (#951c) — monthly ряд продаж по сегменту (Y-ось §9.6).
|
||
• rate_sensitivity (#951d) — §9.6 чувствительность продаж к key_rate (CORE, ADVISORY).
|
||
• macro_coefficient (#951e) — §9.5 макро-коэффициент (композитный множитель, ADVISORY).
|
||
• demand_normalization (#951f) — §9.4 нормализация спроса под смену режима ставки (ADVISORY).
|
||
• demand_supply_forecast (#952a) — §9.8 центральный движок: спрос (§9.4×§9.5) vs
|
||
предложение (§9.3) по горизонтам → баланс/индекс дефицита (СБОРКА, ADVISORY).
|
||
|
||
Источники данных:
|
||
• макро — таблица macro_indicator через reader site_finder/macro.py (reuse).
|
||
• продажи — objective_corpus_room_month / objective_lots (см. sales_series).
|
||
"""
|
||
|
||
from __future__ import annotations
|
||
|
||
from app.services.forecasting.demand_normalization import (
|
||
DemandNormalization,
|
||
compute_demand_normalization,
|
||
normalization_factor,
|
||
)
|
||
from app.services.forecasting.demand_supply_forecast import (
|
||
DemandSupplyForecast,
|
||
compute_demand_supply_forecast,
|
||
hold_last_rate,
|
||
)
|
||
from app.services.forecasting.macro_coefficient import (
|
||
MacroCoefficient,
|
||
assemble_coefficient,
|
||
compute_macro_coefficient,
|
||
f_issuance,
|
||
f_mortgage_rate,
|
||
f_overdue,
|
||
f_rate,
|
||
renormalize_contributions,
|
||
segment_steepness,
|
||
)
|
||
from app.services.forecasting.macro_series import (
|
||
MonthlyMacro,
|
||
classify_regime,
|
||
get_monthly_macro,
|
||
is_confounded_window,
|
||
macro_at_lag,
|
||
)
|
||
from app.services.forecasting.rate_sensitivity import (
|
||
RateSensitivity,
|
||
best_lag,
|
||
compute_rate_sensitivity,
|
||
ols_slope_r2,
|
||
shrink,
|
||
)
|
||
from app.services.forecasting.sales_series import (
|
||
SalesSeries,
|
||
SegmentSpec,
|
||
build_sales_series,
|
||
fill_month_grid,
|
||
log_diff,
|
||
price_bucket_of,
|
||
room_area_bucket_of,
|
||
)
|
||
|
||
__all__ = [
|
||
"DemandNormalization",
|
||
"DemandSupplyForecast",
|
||
"MacroCoefficient",
|
||
"MonthlyMacro",
|
||
"RateSensitivity",
|
||
"SalesSeries",
|
||
"SegmentSpec",
|
||
"assemble_coefficient",
|
||
"best_lag",
|
||
"build_sales_series",
|
||
"classify_regime",
|
||
"compute_demand_normalization",
|
||
"compute_demand_supply_forecast",
|
||
"compute_macro_coefficient",
|
||
"compute_rate_sensitivity",
|
||
"f_issuance",
|
||
"f_mortgage_rate",
|
||
"f_overdue",
|
||
"f_rate",
|
||
"fill_month_grid",
|
||
"get_monthly_macro",
|
||
"hold_last_rate",
|
||
"is_confounded_window",
|
||
"log_diff",
|
||
"macro_at_lag",
|
||
"normalization_factor",
|
||
"ols_slope_r2",
|
||
"price_bucket_of",
|
||
"renormalize_contributions",
|
||
"room_area_bucket_of",
|
||
"segment_steepness",
|
||
"shrink",
|
||
]
|