gendesign/backend/app/services/forecasting/__init__.py
Light1YT f3b04331f4 feat(forecasting): demand-supply forecast engine (#980, 952-A §9.7)
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.
2026-06-03 11:56:28 +05:00

102 lines
3.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""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",
]