1 Panoramica del modello

Il pricing di un contratto Life Care Reverse Mortgage (LCRM) dipende da due variabili finanziarie stocastiche:

\[r_t \;\text{— rendimento BTP 10Y (tasso d'interesse)} \qquad H_t \;\text{— indice OECD prezzi immobiliari Italia}\]

Questo documento calibra separatamente i due processi e fornisce evidenza empirica che supporta l’ipotesi di indipendenza tra i rischi. Il percorso seguito è il seguente:

  1. Sezione 4 — CIR per il tasso d’interesse. Il tasso \(r_t\) segue un processo Cox-Ingersoll-Ross (CIR), calibrato tramite MLE sulla densità di transizione chi-quadro non-centrale esatta.

  2. Sezione 5 — GBM come modello iniziale per la property. Un primo tentativo con il Geometric Brownian Motion rivela, attraverso i diagnostici, due violazioni sistematiche: autocorrelazione seriale nei log-return e volatilità condizionale variabile nel tempo (volatility clustering). Questi risultati motivano la scelta di un modello più ricco.

  3. Sezione 6 — Studio della correlazione tra i due rischi. Prima di definire il modello finale per la property, analizziamo empiricamente la dipendenza tra \(r_t\) e \(H_t\). Il risultato — una correlazione stimata non significativamente diversa da zero — giustifica la calibrazione separata e l’assunzione di indipendenza.

  4. Sezione 7 — ARMA-GARCH come modello finale per la property. Il modello ARMA\((p,q)\)-GARCH\((m,n)\) (Shao, 2019) corregge entrambe le limitazioni del GBM e produce residui ben specificati. La selezione BIC a media libera espone però un’instabilità di stima da quasi-radice-unitaria (deriva implicita implausibile, 4-7 volte la media storica); la sezione documenta il problema e la correzione adottata — media fissata al valore campionario storico.

  5. Sezione 8 — Confronto e raccomandazioni.

Dati utilizzati:

Serie Fonte Frequenza Periodo
Indice nominale house prices OECD Trimestrale 1970-Q1 – 2025-Q4
Rendimento lordo BTP 10Y BCE/Banca d’Italia Mensile 1991-Apr – 2026-May

2 Dati grezzi

2.1 Indice nominale house prices

Prime 8 righe — Indice OECD nominal house prices Italia
quarter_id date_q house_price_index
1970-Q1 1970-01-01 3.0
1970-Q2 1970-04-01 3.0
1970-Q3 1970-07-01 3.1
1970-Q4 1970-10-01 3.1
1971-Q1 1971-01-01 3.2
1971-Q2 1971-04-01 3.2
1971-Q3 1971-07-01 3.2
1971-Q4 1971-10-01 3.2
ggplot(dt_house_prices, aes(x = date_q, y = house_price_index)) +
  geom_line(color = "#1f77b4", linewidth = 0.7) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  scale_y_continuous(labels = scales::comma) +
  labs(
    title    = "Indice Nominale House Prices Italia (OECD)",
    subtitle = "Frequenza trimestrale",
    x        = NULL,
    y        = "Indice (base 100)"
  ) +
  theme_lcrm()

L’indice mostra un trend di crescita quasi ininterrotto fino al 2008, una fase di correzione prolungata fino al 2014–2015, e una ripresa sostenuta nel periodo post-COVID.

2.2 Rendimento BTP 10Y

Prime 8 righe — Rendimento lordo BTP 10Y
date_m yield_10y_pct yield_10y
1991-04-01 13.4334 0.1343
1991-05-01 13.0598 0.1306
1991-06-01 13.0936 0.1309
1991-07-01 13.3371 0.1334
1991-08-01 13.4484 0.1345
1991-09-01 13.0171 0.1302
1991-10-01 12.7906 0.1279
1991-11-01 12.9078 0.1291
ggplot(dt_yields, aes(x = date_m, y = yield_10y_pct)) +
  geom_line(color = "#d62728", linewidth = 0.6) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "Rendimento Lordo BTP 10 Anni",
    subtitle = "Frequenza mensile | in percentuale",
    x        = NULL,
    y        = "Rendimento (%)"
  ) +
  theme_lcrm()

La serie mostra un forte regime discendente dai livelli di doppia cifra degli anni ’90 fino ai minimi storici del 2021, con rialzo brusco nel 2022–2023.


3 Preparazione e allineamento dei dati

3.1 Metodo di aggregazione

Il tasso mensile è aggregato a frequenza trimestrale con metodo quarter_end.

  • quarter_end: si utilizza il valore dell’ultimo mese del trimestre. Preferito per la calibrazione di un processo di stato CIR, poiché preserva il livello puntuale senza introdurre smoothing.
  • quarter_mean: media dei tre mesi (alternativa per analisi di sensitività).

3.2 Dataset di calibrazione

cat(sprintf(
  "Campione comune: %d trimestri  |  da %s a %s\n",
  nrow(dt_cal), min(dt_cal$date_q), max(dt_cal$date_q)
))
## Campione comune: 138 trimestri  |  da 1991-07-01 a 2025-10-01
Prime 8 righe — Dataset di calibrazione trimestrale
date_q house_price_index yield_10y property_log_return delta_yield
1991-07-01 63.1 0.13017 0.01920 -0.00077
1991-10-01 64.3 0.12952 0.01884 -0.00065
1992-01-01 65.3 0.12575 0.01543 -0.00377
1992-04-01 66.1 0.13102 0.01218 0.00527
1992-07-01 66.7 0.14113 0.00904 0.01011
1992-10-01 67.0 0.13659 0.00449 -0.00453
1993-01-01 67.2 0.12902 0.00298 -0.00757
1993-04-01 66.8 0.11673 -0.00597 -0.01229

3.3 Data quality checks

Data quality checks
check result detail
Missing dates (calibration) OK Nessun trimestre mancante
Missing values OK Nessun NA
Duplicates OK 0 duplicati
Non-positive house index OK 0 valori non positivi
Negative rates OK 0 osservazioni con tasso < 0
Sample size INFO 138 trimestri (1991-07-01 – 2025-10-01)

3.4 Trasformazioni

Log-return trimestrali property \(R^H_t = \ln(H_t / H_{t-\Delta})\):

ggplot(dt_cal, aes(x = date_q, y = property_log_return)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey60") +
  geom_line(color = "#2ca02c", linewidth = 0.6) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "Log-Return Trimestrale — Indice House Prices",
    subtitle = expression(R[t]^H == ln(H[t] / H[t - Delta])),
    x        = NULL, y = "Log-return"
  ) +
  theme_lcrm()

Variazione trimestrale del tasso \(\Delta r_t = r_t - r_{t-\Delta}\):

ggplot(dt_cal, aes(x = date_q, y = delta_yield)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey60") +
  geom_line(color = "#ff7f0e", linewidth = 0.6) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "Variazione Trimestrale BTP 10Y",
    subtitle = expression(Delta * r[t] == r[t] - r[t - Delta]),
    x        = NULL, y = "Δr"
  ) +
  theme_lcrm()


4 Calibrazione CIR — Tasso d’interesse BTP 10Y

Il tasso d’interesse \(r_t\) è modellato con il processo Cox-Ingersoll-Ross (CIR):

\[dr_t = \kappa(\theta - r_t)\,dt + \sigma_r\sqrt{r_t}\,dW^r_t\]

Il CIR è la scelta naturale per i tassi d’interesse: garantisce la positività del processo (sotto la condizione di Feller \(2\kappa\theta \geq \sigma_r^2\)) e cattura il mean reversion verso un livello di lungo periodo \(\theta\).

4.1 Modello e distribuzione condizionata

La distribuzione condizionata esatta è una chi-quadro non-centrale riscalata:

\[r_{t+\Delta} \mid r_t \;\sim\; c\,\chi'^2_d(\lambda)\]

\[c = \frac{\sigma_r^2(1-e^{-\kappa\Delta})}{4\kappa}, \quad d = \frac{4\kappa\theta}{\sigma_r^2}, \quad \lambda = \frac{4\kappa e^{-\kappa\Delta}\,r_t}{\sigma_r^2(1-e^{-\kappa\Delta})}\]

Questa densità di transizione esatta è la base della calibrazione MLE che segue — non si fa ricorso a discretizzazioni Eulero.

4.2 Metodo di calibrazione

Metodo principale: MLE — massimizzazione della log-likelihood esatta basata sulla densità chi-quadro non-centrale.

Benchmark: Euler quasi-MLE (discretizzazione del processo) — utilizzato per inizializzare l’ottimizzazione L-BFGS-B e come controllo di sanità dei parametri.

4.3 Parametri calibrati

Parametri CIR: confronto MLE vs Euler
Parametro Simbolo MLE Euler
kappa κ (mean reversion) κ 0.178038 0.155622
theta θ (livello lungo periodo) θ 0.034416 0.032529
sigma_r σ_r (volatilità) σᵣ 0.056826 0.051207
## Log-likelihood MLE:  515.5939
## Numero osservazioni: 137

Il confronto con l’Euler conferma la coerenza della stima MLE: i parametri sono stabili e la log-likelihood MLE è superiore (come atteso).

4.4 Vincoli e condizione di Feller

Controlli parametri CIR
check result detail
kappa > 0 OK kappa = 0.178038
theta > 0 OK theta = 0.034416
sigma_r > 0 OK sigma_r = 0.056826
Feller condition (2kθ >= σ²) OK 2kθ/σ² = 3.7950 (>= 1 richiesto)
Convergenza ottimizzatore OK codice convergenza: 0
Log-likelihood finita OK loglik = 515.5939

La condizione di Feller (\(2\kappa\theta \geq \sigma_r^2\)) garantisce che il processo rimanga quasi sicuramente positivo. Il rapporto \(2\kappa\theta/\sigma_r^2\) è pari a 3.795.

4.5 Diagnostica CIR

4.5.1 Serie osservata vs livello di mean reversion \(\hat\theta\)

ggplot(dt_cal, aes(x = date_q)) +
  geom_line(aes(y = yield_10y * 100), color = "#1f77b4", linewidth = 0.7) +
  geom_hline(yintercept = par_cir$theta * 100,
             linetype = "dashed", color = "#d62728", linewidth = 0.9) +
  annotate("text",
           x     = min(dt_cal$date_q),
           y     = par_cir$theta * 100 + 0.35,
           label = sprintf("θ̂ = %.2f%%", par_cir$theta * 100),
           hjust = 0, color = "#d62728", size = 3.5) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "BTP 10Y — Osservato vs Livello di Mean Reversion θ̂",
    subtitle = sprintf("κ = %.4f | θ = %.4f | σᵣ = %.4f",
                       par_cir$kappa, par_cir$theta, par_cir$sigma_r),
    x = NULL, y = "Rendimento (%)"
  ) +
  theme_lcrm()

4.5.2 Drift stimato \(\hat\kappa(\hat\theta - r_t)\) vs livello del tasso

Il mean reversion implica che il drift sia positivo quando \(r_t < \theta\) (il tasso tende a salire verso la media) e negativo quando \(r_t > \theta\). Il grafico seguente verifica questa relazione lineare nei dati.

drift_dt <- copy(dt_cal)[!is.na(yield_10y)]
drift_dt[, cir_drift_annual := par_cir$kappa * (par_cir$theta - yield_10y)]

ggplot(drift_dt, aes(x = yield_10y * 100, y = cir_drift_annual)) +
  geom_hline(yintercept = 0, linetype = "dashed", color = "grey60") +
  geom_vline(xintercept = par_cir$theta * 100,
             linetype = "dashed", color = "#d62728", alpha = 0.7) +
  geom_point(size = 1.5, alpha = 0.6, color = "#1f77b4") +
  geom_smooth(method = "lm", se = FALSE, color = "#ff7f0e", linewidth = 0.8) +
  labs(
    title    = "Drift CIR vs Livello del Tasso",
    subtitle = expression(kappa * (theta - r[t])),
    x = "Rendimento BTP 10Y (%)", y = "Drift annuo stimato"
  ) +
  theme_lcrm()

4.5.3 Volatilità istantanea \(\hat\sigma_r\sqrt{r_t}\) nel tempo

La volatilità del CIR è proporzionale a \(\sqrt{r_t}\): aumenta quando i tassi sono alti e si comprime quando i tassi sono bassi. Il grafico documenta questo comportamento sui dati italiani.

ggplot(dt_cal, aes(x = date_q,
                    y = par_cir$sigma_r * sqrt(pmax(yield_10y, 0)))) +
  geom_line(color = "#9467bd", linewidth = 0.7) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "Volatilità Istantanea CIR nel Tempo",
    subtitle = expression(hat(sigma)[r] * sqrt(r[t])),
    x = NULL, y = "Volatilità istantanea"
  ) +
  theme_lcrm()

4.5.4 Residui standardizzati (approssimazione Euler)

\[\hat{z}^r_t = \frac{r_t - r_{t-\Delta} - \hat\kappa(\hat\theta - r_{t-\Delta})\Delta}{\hat\sigma_r\sqrt{r_{t-\Delta}}\sqrt{\Delta}}\]

ggplot(dt_cal[!is.na(z_rate)], aes(x = date_q, y = z_rate)) +
  geom_hline(yintercept = c(-2, 0, 2),
             linetype = c("dashed", "solid", "dashed"),
             color    = c("grey50", "grey30", "grey50"), alpha = 0.7) +
  geom_line(color = "#8c564b", linewidth = 0.5) +
  geom_point(data = dt_cal[!is.na(z_rate) & abs(z_rate) > 2.5],
             color = "#d62728", size = 2) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = "Residui Standardizzati CIR",
    subtitle = "Valori |z| > 2.5 evidenziati in rosso",
    x = NULL, y = "z-score"
  ) +
  theme_lcrm()

4.5.5 QQ plot residui CIR

cir_res <- sort(dt_cal$z_rate[!is.na(dt_cal$z_rate)])
qq_cir  <- data.frame(theoretical = qnorm(ppoints(length(cir_res))),
                       sample      = cir_res)

ggplot(qq_cir, aes(x = theoretical, y = sample)) +
  geom_abline(slope = 1, intercept = 0,
              color = "#d62728", linewidth = 0.8, linetype = "dashed") +
  geom_point(size = 1.5, alpha = 0.6, color = "#8c564b") +
  labs(
    title    = "QQ Plot — Residui Standardizzati CIR",
    subtitle = "Approssimazione Euler vs N(0,1)",
    x = "Quantili teorici N(0,1)", y = "Quantili osservati"
  ) +
  theme_lcrm()

I residui si distribuiscono ragionevolmente vicino alla normale: il CIR descrive bene la dinamica del tasso italiano sul campione disponibile.


5 Property: GBM come modello iniziale

Prima di scegliere il modello definitivo per \(H_t\), partiamo dal Geometric Brownian Motion (GBM) — il modello di riferimento nella letteratura LCRM (Dowd et al. 2019, MAF_Chapter). L’analisi diagnostica che segue guiderà la scelta verso un modello più adeguato.

5.1 Modello e formule

Il property segue un GBM puro:

\[\frac{dH_t}{H_t} = \mu_H\,dt + \sigma_H\,dW^H_t \implies d\ln H_t = \left(\mu_H - \tfrac{1}{2}\sigma_H^2\right)dt + \sigma_H\,dW^H_t\]

Sotto questa ipotesi i log-return trimestrali \(R^H_t = \ln(H_t/H_{t-\Delta})\) sono i.i.d. normali con media \((\mu_H - \frac{1}{2}\sigma_H^2)\Delta\) e varianza \(\sigma_H^2\Delta\).

5.2 Stima dei parametri

Dato \(R^H_t = \ln(H_t/H_{t-\Delta})\) con \(\Delta = 1/4\):

\[\hat{\sigma}_H = \frac{sd(R^H_t)}{\sqrt{\Delta}}, \qquad \hat{m}_H = \frac{\overline{R^H_t}}{\Delta}, \qquad \hat{\mu}_H = \hat{m}_H + \tfrac{1}{2}\hat{\sigma}_H^2\]

Parametri calibrati GBM property
Parametro Simbolo Valore Std.Err Unità
μ_H (drift aritmetico) μ_H 0.019082 0.001541 annua
m_H (drift log-indice) m_H 0.018774 NA annua
σ_H (volatilità) σ_H 0.024801 0.001498 annua

5.3 Diagnostica: test delle ipotesi del GBM

Il GBM richiede che i log-return siano i.i.d. normali. Verifichiamo questa ipotesi sistematicamente.

5.3.1 Distribuzione: istogramma con normale calibrata

mu_log <- (par_gbm$mu_H - 0.5 * par_gbm$sigma_H^2) * DELTA
sd_log <- par_gbm$sigma_H * sqrt(DELTA)

ggplot(dt_cal, aes(x = property_log_return)) +
  geom_histogram(aes(y = after_stat(density)), bins = 30,
                 fill = "#9ecae1", color = "white", alpha = 0.8) +
  stat_function(fun = dnorm, args = list(mean = mu_log, sd = sd_log),
                color = "#d62728", linewidth = 0.9) +
  labs(
    title    = "Istogramma Log-Return Property",
    subtitle = sprintf("Normale calibrata: media = %.4f, sd = %.4f", mu_log, sd_log),
    x = "Log-return trimestrale", y = "Densità"
  ) +
  theme_lcrm()

5.3.2 Distribuzione: QQ plot vs normale teorica

qqdt <- data.frame(
  theoretical = qnorm(ppoints(nrow(dt_cal))),
  sample      = sort(dt_cal$property_log_return)
)
ggplot(qqdt, aes(x = theoretical, y = sample)) +
  geom_abline(slope = sd_log, intercept = mu_log,
              color = "#d62728", linewidth = 0.8, linetype = "dashed") +
  geom_point(size = 1.8, alpha = 0.65, color = "#1f77b4") +
  labs(
    title    = "QQ Plot — Log-Return Property",
    subtitle = "vs Distribuzione Normale Teorica",
    x = "Quantili teorici", y = "Quantili osservati"
  ) +
  theme_lcrm()

5.3.3 Test formali di normalità

Test di normalità — log-return property
Test Valore p-value
Shapiro-Wilk (W) 0.9762 0.0162
Jarque-Bera (stat) 5.3457 NA
Skewness -0.1831 NA
Kurtosi ecc. -0.8920 NA

Il test di Shapiro-Wilk rifiuta la normalità al 5%. Il QQ plot mostra code asimmetriche. L’ipotesi di distribuzione normale condizionale del GBM è sotto pressione, ma la deviazione non è drammatica in valore assoluto.

5.3.4 Struttura seriale: ACF dei log-return

Il GBM richiede log-return serialmente indipendenti. L’ACF rivela immediatamente una violazione di questa ipotesi:

acf_data  <- acf(dt_cal$property_log_return, plot = FALSE, lag.max = 20)
acf_dt    <- data.frame(lag = as.numeric(acf_data$lag[-1]),
                         acf = as.numeric(acf_data$acf[-1]))
ci_bound  <- 1.96 / sqrt(nrow(dt_cal))

ggplot(acf_dt, aes(x = lag, y = acf)) +
  geom_hline(yintercept = c(-ci_bound, ci_bound),
             linetype = "dashed", color = "#d62728", alpha = 0.7) +
  geom_hline(yintercept = 0, color = "grey40") +
  geom_segment(aes(xend = lag, yend = 0), color = "#1f77b4", linewidth = 0.8) +
  geom_point(color = "#1f77b4", size = 2) +
  scale_x_continuous(breaks = acf_dt$lag) +
  labs(
    title    = "ACF — Log-Return Property",
    subtitle = "Bande di confidenza al 95% — valori fuori banda indicano autocorrelazione significativa",
    x = "Lag (trimestri)", y = "Autocorrelazione"
  ) +
  theme_lcrm()

Diversi lag cadono fuori dalle bande di confidenza. Il test di Ljung-Box conferma:

Test di Ljung-Box — log-return property (H0: indipendenza seriale)
Lag Statistica p-value
4 303.4449 0
8 437.2047 0
12 521.8081 0

L’ipotesi di indipendenza seriale è rifiutata a tutti i lag testati. Il mercato immobiliare italiano mostra momentum: le fasi di crescita e le fasi di correzione tendono a persistere nel tempo.

5.3.5 Struttura della volatilità: ACF dei log-return al quadrato

La dipendenza seriale nella varianza è il secondo segnale critico. Un processo i.i.d. non dovrebbe mostrare autocorrelazione nei quadrati:

R_sq  <- dt_cal$property_log_return^2
acf_sq <- acf(R_sq, plot = FALSE, lag.max = 16)
acf_sq_dt <- data.frame(lag = as.numeric(acf_sq$lag[-1]),
                          acf = as.numeric(acf_sq$acf[-1]))
ci_b <- 1.96 / sqrt(nrow(dt_cal))

ggplot(acf_sq_dt, aes(x = lag, y = acf)) +
  geom_hline(yintercept = c(-ci_b, ci_b),
             linetype = "dashed", color = "#d62728", alpha = 0.7) +
  geom_hline(yintercept = 0, color = "grey40") +
  geom_segment(aes(xend = lag, yend = 0), color = "#9467bd", linewidth = 0.8) +
  geom_point(color = "#9467bd", size = 2) +
  scale_x_continuous(breaks = acf_sq_dt$lag) +
  labs(
    title    = "ACF dei Log-Return al Quadrato — Evidenza di Effetti ARCH",
    subtitle = "Autocorrelazioni nei quadrati indicano volatilità condizionale variabile nel tempo",
    x = "Lag (trimestri)", y = expression("Autocorrelazione di" ~ R[t]^{H^2})
  ) +
  theme_lcrm()

Anche i quadrati mostrano autocorrelazione significativa: si tratta di volatility clustering, un fenomeno tipico dei mercati finanziari. Il GBM, con volatilità costante \(\sigma_H\), non è in grado di catturarlo.

5.3.6 Stazionarietà: test ADF

Test ADF sui log-return della property (H0: radice unitaria)
Statistica Valore
ADF test statistic -2.2438
p-value 0.475
Lag utilizzato 5
Interpretazione Non rifiuto H0: possibile radice unitaria

I log-return sono stazionari (come atteso: sono già prime differenze del log-indice). Il problema non è l’integrazione della serie, ma la struttura di dipendenza interna.

5.3.7 Riepilogo: perché il GBM non basta

Ipotesi GBM Evidenza empirica Valutazione
Log-return normali Shapiro-Wilk rifiuta; code asimmetriche nel QQ Violazione lieve
Log-return i.i.d. Ljung-Box p ≈ 0 a lag 4, 8, 12 Violazione grave
Volatilità costante ACF dei quadrati significativa (effetti ARCH) Violazione grave

Le due violazioni gravi — memoria nella media e volatility clustering — sono esattamente le strutture che il modello ARMA-GARCH è progettato per catturare. Prima di passare al modello finale, però, analizziamo la relazione tra i due rischi.


6 Indipendenza tra tasso d’interesse e prezzi immobiliari

Prima di definire il modello finale per la property, è fondamentale stabilire se \(r_t\) e \(H_t\) evolvano in modo correlato. Un’eventuale dipendenza strutturale richiederebbe una modellazione congiunta; la sua assenza giustifica invece la calibrazione separata.

6.1 Strategia di analisi

Per confrontare le due serie su una scala comparabile, trasformiamo ciascuna nelle proprie probabilità integrali di trasformazione (PIT) rispetto al modello calibrato:

  • PIT del tasso (CIR esatto): \(\hat{u}^r_t = F_{\chi'^2}(r_{t+\Delta}/c \mid d, \lambda_t)\) — la CDF di transizione esatta del CIR valutata sull’osservazione storica.
  • PIT della property (GBM): \(\hat{u}^H_t = \Phi(\hat{z}^H_t)\) — il log-return standardizzato trasformato in probabilità.

Invertendo con la normale standard si ottengono score gaussiani: \[\hat{z}^r_t = \Phi^{-1}(\hat{u}^r_t), \qquad \hat{z}^H_t = \Phi^{-1}(\hat{u}^H_t)\]

Se i due processi fossero indipendenti, \(\hat{z}^r_t\) e \(\hat{z}^H_t\) sarebbero i.i.d. \(N(0,1)\) e la loro correlazione di Pearson sarebbe zero (in media).

6.2 Scatter plot degli score: nessuna struttura apparente

shocks_dt  <- dt_cal[!is.na(z_rate_copula) & !is.na(z_property)]
rho_label  <- sprintf("ρ̂ = %.4f", par_corr$rho_hat)

ggplot(shocks_dt, aes(x = z_rate_copula, y = z_property)) +
  geom_hline(yintercept = 0, color = "grey70", linewidth = 0.4) +
  geom_vline(xintercept = 0, color = "grey70", linewidth = 0.4) +
  geom_point(alpha = 0.5, size = 1.8, color = "#1f77b4") +
  geom_smooth(method = "lm", se = TRUE,
              color = "#d62728", fill = "#fcbba1", linewidth = 0.9) +
  annotate("text",
           x     = min(shocks_dt$z_rate_copula) * 0.9,
           y     = max(shocks_dt$z_property) * 0.9,
           label = rho_label,
           hjust = 0, color = "#d62728", size = 4, fontface = "bold") +
  labs(
    title    = "Score PIT: tasso CIR vs property GBM",
    subtitle = "Retta di regressione con banda di confidenza 95% — nessuna struttura lineare evidente",
    x = expression(hat(z)[t]^r == Phi^{-1}(F[CIR](r[t+Delta]*"|"*r[t]))),
    y = expression(hat(z)[t]^H == Phi^{-1}(F[GBM](H[t+Delta]*"|"*H[t])))
  ) +
  theme_lcrm()

La nuvola di punti non mostra alcuna struttura lineare sistematica. La retta di regressione è quasi orizzontale e la banda di confidenza è ampia.

6.3 Test di correlazione e intervallo di confidenza

Test di correlazione tra score PIT del tasso e della property
Statistica Valore
ρ̂ (Pearson) 0.145606
t-statistic 1.71
p-value (H₀: ρ=0) 0.0896
IC 95% inferiore -0.0227
IC 95% superiore 0.3059
N osservazioni 137
Periodo inizio 1991-10-01
Periodo fine 2025-10-01

L’intervallo di confidenza al 95% contiene zero: non c’è evidenza statistica di correlazione tra gli shock del tasso d’interesse e quelli dei prezzi immobiliari.

6.4 Correlazione rolling: instabilità nel tempo

ggplot(dt_rolling[!is.na(rho_roll)], aes(x = date_q, y = rho_roll)) +
  geom_hline(yintercept = par_corr$rho_hat,
             linetype = "dashed", color = "#d62728", linewidth = 0.8) +
  geom_hline(yintercept = 0, color = "grey60", linewidth = 0.4) +
  geom_line(color = "#2ca02c", linewidth = 0.7) +
  geom_ribbon(aes(ymin = pmin(rho_roll, par_corr$rho_hat),
                  ymax = pmax(rho_roll, par_corr$rho_hat)),
              alpha = 0.15, fill = "#2ca02c") +
  annotate("text",
           x     = max(dt_rolling$date_q[!is.na(dt_rolling$rho_roll)]),
           y     = par_corr$rho_hat + 0.04,
           label = sprintf("ρ̂ statica = %.3f", par_corr$rho_hat),
           hjust = 1, color = "#d62728", size = 3.5) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  scale_y_continuous(limits = c(-1, 1)) +
  labs(
    title    = sprintf("Correlazione Rolling (finestra: %d trimestri = %d anni)", ROLLING_WINDOW_Q, ROLLING_WINDOW_Q %/% 4),
    subtitle = "Linea tratteggiata = correlazione statica sull'intero campione",
    x = NULL, y = "Correlazione rolling"
  ) +
  theme_lcrm()

La correlazione rolling cambia segno più volte nel campione: positiva nel periodo pre-2000, negativa durante la crisi del 2008, vicina a zero nel periodo recente. Questo rafforza la conclusione: non esiste una dipendenza strutturale stabile tra i due rischi — qualunque correlazione osservata in sotto-periodi è rumore, non segnale.

6.5 Conclusione: l’ipotesi di indipendenza è supportata dai dati

I due rischi, tasso d’interesse e prezzi immobiliari, possono essere calibrati e simulati separatamente senza perdita di accuratezza statisticamente rilevante. Questa conclusione è in linea con le assunzioni strutturali dei framework MAF_Chapter e IME (2025), che adottano l’indipendenza come ipotesi fondante.


7 Calibrazione ARMA-GARCH — Property (modello finale)

Le evidenze della Sezione 5 motivano il passaggio dal GBM al modello ARMA\((p,q)\)-GARCH\((m,n)\) nella tradizione di Shao (2019). Il modello ARMA cattura la memoria nella media dei log-return (momentum); il componente GARCH cattura la variabilità condizionale della volatilità (volatility clustering). Poiché i due rischi sono indipendenti (Sezione 6), questo modello calibra la sola property senza richiedere alcun aggiustamento al modello CIR.

7.1 Modello teorico ARMA(p,q)-GARCH(m,n)

Equazione della media:

\[y_t = \psi_y + \sum_{i=1}^{p} \phi_i\, y_{t-i} + \sum_{j=1}^{q} \theta_j\, z_{t-j} + z_t, \qquad z_t \sim \mathcal{N}(0, \sigma_t^2)\]

Equazione della varianza condizionale:

\[\sigma_t^2 = \psi_{\sigma^2} + \sum_{i=1}^{m} \mu_i\, \sigma_{t-i}^2 + \sum_{j=1}^{n} \nu_j\, z_{t-j}^2\]

Componente Ruolo
\(\psi_y\) costante della media
\(\phi_i\) coefficienti AR — memoria nei livelli di crescita (momentum)
\(\theta_j\) coefficienti MA — memoria negli shock passati
\(\psi_{\sigma^2}\) costante della varianza condizionale
\(\mu_i\) coefficienti GARCH — persistenza della volatilità
\(\nu_j\) coefficienti ARCH — reazione della volatilità agli shock

Stima: massima verosimiglianza (MLE) sulla log-likelihood gaussiana condizionale: \[\ell = \sum_{t} \left[ -\frac{1}{2}\log(2\pi\sigma_t^2) - \frac{(y_t - \hat\mu_t)^2}{2\sigma_t^2} \right]\]

7.2 Selezione del modello (BIC)

La griglia di ricerca copre ARMA\((p,q)\)-GARCH\((m,n)\) con \(p \in \{0,1,2,3\}\), \(q \in \{0,1,2,3,4,5\}\), \(m \in \{1,2\}\), \(n \in \{1,2\}\) — per un totale di 96 combinazioni. A differenza di Shao (2019), che fissa il componente GARCH all’ordine \((1,1)\) per i dati U.S. per parsimonia, la calibrazione italiana estende la ricerca anche sull’ordine GARCH. Il modello è selezionato minimizzando il BIC.

7.2.1 Prima passata: mu stimato liberamente

Griglia BIC — ARMA(p,q)-GARCH(m,n) sui log-return property italiani, mu libero (96 modelli)
Modello LogLik AIC BIC
ARMA(2,0)-GARCH(1,1) 506.94 -7.2600 -7.1327
ARMA(3,3)-GARCH(1,2) 518.01 -7.3480 -7.1146
ARMA(1,1)-GARCH(1,1) 505.47 -7.2387 -7.1115
ARMA(3,3)-GARCH(1,1) 515.01 -7.3189 -7.1068
ARMA(3,4)-GARCH(1,1) 515.88 -7.3171 -7.0838
ARMA(1,0)-GARCH(1,1) 500.52 -7.1815 -7.0754
ARMA(3,5)-GARCH(1,1) 517.17 -7.3213 -7.0668
ARMA(3,4)-GARCH(2,1) 516.99 -7.3187 -7.0641
ARMA(3,3)-GARCH(2,1) 514.39 -7.2955 -7.0621
ARMA(2,0)-GARCH(2,2) 506.96 -7.2312 -7.0615
ARMA(2,1)-GARCH(1,2) 506.95 -7.2312 -7.0615
ARMA(3,5)-GARCH(2,1) 519.10 -7.3348 -7.0591
ARMA(3,4)-GARCH(1,2) 516.55 -7.3123 -7.0578
ARMA(1,0)-GARCH(1,2) 501.55 -7.1819 -7.0546
ARMA(3,5)-GARCH(1,2) 518.60 -7.3275 -7.0518
ARMA(2,2)-GARCH(1,2) 508.58 -7.2404 -7.0494
ARMA(1,0)-GARCH(2,1) 500.82 -7.1714 -7.0441
ARMA(1,1)-GARCH(2,2) 505.65 -7.2123 -7.0426
ARMA(3,4)-GARCH(2,2) 517.85 -7.3167 -7.0409
ARMA(3,3)-GARCH(2,2) 514.95 -7.2892 -7.0346
ARMA(2,1)-GARCH(2,2) 506.96 -7.2169 -7.0260
ARMA(1,0)-GARCH(2,2) 501.55 -7.1674 -7.0189
ARMA(3,5)-GARCH(2,2) 518.71 -7.3146 -7.0176
ARMA(1,2)-GARCH(1,1) 497.23 -7.1048 -6.9563
ARMA(3,0)-GARCH(1,1) 496.37 -7.0924 -6.9439
ARMA(2,1)-GARCH(1,1) 495.93 -7.0859 -6.9374
ARMA(1,3)-GARCH(1,1) 498.14 -7.1035 -6.9338
ARMA(2,0)-GARCH(1,2) 495.61 -7.0813 -6.9328
ARMA(2,0)-GARCH(2,1) 495.60 -7.0812 -6.9327
ARMA(2,5)-GARCH(1,2) 507.49 -7.1810 -6.9264
ARMA(3,1)-GARCH(1,1) 497.63 -7.0961 -6.9264
ARMA(1,1)-GARCH(1,2) 495.13 -7.0743 -6.9258
ARMA(1,1)-GARCH(2,1) 495.12 -7.0742 -6.9257
ARMA(2,2)-GARCH(1,1) 497.37 -7.0923 -6.9226
ARMA(1,2)-GARCH(1,2) 497.24 -7.0904 -6.9207
ARMA(1,2)-GARCH(2,1) 497.23 -7.0903 -6.9206
ARMA(3,2)-GARCH(1,1) 499.31 -7.1060 -6.9151
ARMA(3,0)-GARCH(1,2) 496.38 -7.0780 -6.9083
ARMA(3,0)-GARCH(2,1) 496.37 -7.0779 -6.9082
ARMA(1,4)-GARCH(1,1) 498.83 -7.0990 -6.9080
ARMA(2,3)-GARCH(1,1) 498.47 -7.0938 -6.9029
ARMA(2,1)-GARCH(2,1) 495.93 -7.0714 -6.9017
ARMA(1,3)-GARCH(1,2) 498.15 -7.0891 -6.8982
ARMA(1,3)-GARCH(2,1) 498.14 -7.0890 -6.8981
ARMA(3,1)-GARCH(1,2) 497.64 -7.0818 -6.8909
ARMA(3,1)-GARCH(2,1) 497.63 -7.0816 -6.8907
ARMA(2,2)-GARCH(2,1) 497.37 -7.0778 -6.8869
ARMA(2,4)-GARCH(2,2) 504.74 -7.1411 -6.8866
ARMA(2,4)-GARCH(1,1) 499.76 -7.0979 -6.8858
ARMA(1,2)-GARCH(2,2) 497.24 -7.0759 -6.8850
ARMA(3,2)-GARCH(1,2) 499.32 -7.0916 -6.8795
ARMA(3,2)-GARCH(2,1) 499.31 -7.0915 -6.8794
ARMA(3,0)-GARCH(2,2) 496.39 -7.0636 -6.8727
ARMA(1,5)-GARCH(1,1) 498.85 -7.0847 -6.8726
ARMA(1,4)-GARCH(1,2) 498.84 -7.0846 -6.8725
ARMA(1,4)-GARCH(2,1) 498.83 -7.0845 -6.8723
ARMA(2,3)-GARCH(1,2) 498.48 -7.0794 -6.8673
ARMA(2,3)-GARCH(2,1) 498.47 -7.0793 -6.8672
ARMA(1,3)-GARCH(2,2) 498.15 -7.0746 -6.8625
ARMA(3,1)-GARCH(2,2) 497.64 -7.0672 -6.8551
ARMA(2,2)-GARCH(2,2) 497.37 -7.0634 -6.8513
ARMA(2,4)-GARCH(2,1) 499.76 -7.0834 -6.8501
ARMA(2,4)-GARCH(1,2) 499.75 -7.0834 -6.8501
ARMA(3,2)-GARCH(2,2) 499.33 -7.0772 -6.8439
ARMA(1,5)-GARCH(1,2) 498.86 -7.0704 -6.8370
ARMA(1,5)-GARCH(2,1) 498.85 -7.0702 -6.8369
ARMA(1,4)-GARCH(2,2) 498.84 -7.0701 -6.8368
ARMA(2,5)-GARCH(1,1) 498.72 -7.0684 -6.8350
ARMA(2,3)-GARCH(2,2) 498.48 -7.0649 -6.8316
ARMA(1,5)-GARCH(2,2) 498.86 -7.0560 -6.8014
ARMA(2,5)-GARCH(2,1) 498.76 -7.0544 -6.7999
ARMA(0,5)-GARCH(1,1) 490.44 -6.9774 -6.7865
ARMA(2,5)-GARCH(2,2) 498.73 -7.0396 -6.7639
ARMA(0,5)-GARCH(1,2) 490.45 -6.9630 -6.7509
ARMA(0,5)-GARCH(2,1) 490.44 -6.9629 -6.7508
ARMA(0,4)-GARCH(1,1) 485.03 -6.9135 -6.7438
ARMA(0,3)-GARCH(1,1) 480.89 -6.8680 -6.7195
ARMA(0,5)-GARCH(2,2) 490.45 -6.9485 -6.7152
ARMA(0,4)-GARCH(1,2) 485.04 -6.8991 -6.7082
ARMA(0,4)-GARCH(2,1) 485.03 -6.8990 -6.7081
ARMA(0,3)-GARCH(1,2) 480.89 -6.8535 -6.6838
ARMA(0,3)-GARCH(2,1) 480.89 -6.8535 -6.6838
ARMA(0,4)-GARCH(2,2) 485.04 -6.8846 -6.6725
ARMA(0,3)-GARCH(2,2) 480.89 -6.8391 -6.6481
ARMA(0,2)-GARCH(1,1) 462.91 -6.6218 -6.4946
ARMA(0,2)-GARCH(1,2) 462.92 -6.6076 -6.4591
ARMA(0,2)-GARCH(2,1) 462.91 -6.6074 -6.4589
ARMA(0,2)-GARCH(2,2) 462.91 -6.5929 -6.4232
ARMA(0,1)-GARCH(1,1) 448.87 -6.4329 -6.3268
ARMA(0,1)-GARCH(1,2) 448.89 -6.4188 -6.2915
ARMA(0,1)-GARCH(2,1) 448.88 -6.4186 -6.2914
ARMA(0,1)-GARCH(2,2) 448.88 -6.4041 -6.2556
ARMA(0,0)-GARCH(1,1) 431.16 -6.1907 -6.1059
ARMA(0,0)-GARCH(2,1) 431.25 -6.1776 -6.0715
ARMA(0,0)-GARCH(1,2) 431.14 -6.1760 -6.0699
ARMA(0,0)-GARCH(2,2) 431.25 -6.1631 -6.0358

Modello BIC-ottimale con mu libero: ARMA(2,0)-GARCH(1,1) — BIC = -7.1327

Nota: Il modello BIC-ottimale per i dati italiani differisce dalla specifica ARMA(2,4)-GARCH(1,1) selezionata da Shao (2019) per i dati U.S. (BIC Shao: -6.8858). Questo riflette differenze nelle dinamiche dei mercati immobiliari.

7.2.2 Il problema: deriva implausibile con mu libero

Con mu stimato liberamente, il modello BIC-ottimale non è l’unico a mostrare una deriva economicamente implausibile: ogni modello entro poco più di 0.07 punti di BIC dal migliore implica una crescita annua ben oltre quella storica.

Deriva annualizzata implicita nei migliori modelli con mu libero, vs media campionaria annualizzata 1.88%
Modello BIC mu trimestrale mu annuo (%)
ARMA(2,0)-GARCH(1,1) -7.1327 0.016422 6.57
ARMA(3,3)-GARCH(1,2) -7.1146 0.018417 7.37
ARMA(1,1)-GARCH(1,1) -7.1115 0.015483 6.19
ARMA(3,3)-GARCH(1,1) -7.1068 0.018538 7.42
ARMA(3,4)-GARCH(1,1) -7.0838 0.018793 7.52
ARMA(1,0)-GARCH(1,1) -7.0754 0.010826 4.33
ARMA(3,5)-GARCH(1,1) -7.0668 0.018324 7.33
ARMA(3,4)-GARCH(2,1) -7.0641 0.018706 7.48

Tre elementi corroborano che si tratti di un’instabilità di stima e non di un segnale economico:

  1. Il test ADF sulla serie non rigetta la radice unitaria (si veda la sezione “Stazionarietà: test ADF” più sopra, stesso test sulla stessa serie y_prop: p-value = 0.475). Con AR vicino alla radice unitaria, la media incondizionata di un ARMA mean-adjusted è debolmente identificata.
  2. La verosimiglianza pesata per eteroschedasticità (QMLE GARCH) sotto-pesa i trimestri a varianza condizionale più alta. Nel campione italiano questi coincidono in larga parte con i trimestri della crisi 2008-2013, che sono anche i più negativi: sotto-pesarli nella stima della media la sposta verso l’alto rispetto a una media semplice.
  3. La media campionaria storica della stessa serie trimestrale è 0.004694 (annualizzata 1.88%) — un ordine di grandezza sotto ogni stima libera in tabella, e coerente sia con la nostra GBM (1.88% annuo) sia con la GBM di Apicella et al. (IME 2025, μ = 2.14% annuo).

7.2.3 Correzione: mu fissato alla media campionaria

Fissare mu alla media campionaria storica è il rimedio standard per questa instabilità: la media campionaria resta uno stimatore consistente della vera media incondizionata indipendentemente dalla dinamica ARMA/GARCH stimata attorno ad essa. Sotto questo vincolo, (p,q,m,n) viene riselezionato per BIC.

Griglia BIC — ARMA(p,q)-GARCH(m,n), mu fissato a 0.004694 (media campionaria)
Modello LogLik AIC BIC
ARMA(1,1)-GARCH(1,1) 503.00 -7.2174 -7.1114
ARMA(1,2)-GARCH(1,2) 506.99 -7.2463 -7.0978
ARMA(1,2)-GARCH(2,1) 506.99 -7.2463 -7.0978
ARMA(1,0)-GARCH(1,1) 499.22 -7.1771 -7.0922
ARMA(1,1)-GARCH(1,2) 503.63 -7.2120 -7.0848
ARMA(1,1)-GARCH(2,1) 503.53 -7.2106 -7.0833
ARMA(1,0)-GARCH(1,2) 500.26 -7.1777 -7.0716
ARMA(2,0)-GARCH(2,1) 502.53 -7.1961 -7.0688
ARMA(1,0)-GARCH(2,1) 499.89 -7.1723 -7.0662
ARMA(1,1)-GARCH(2,2) 503.63 -7.1975 -7.0491
ARMA(1,0)-GARCH(2,2) 500.26 -7.1632 -7.0359
ARMA(2,1)-GARCH(2,1) 502.56 -7.1820 -7.0335
ARMA(3,0)-GARCH(1,2) 501.61 -7.1682 -7.0197
ARMA(2,1)-GARCH(2,2) 502.56 -7.1675 -6.9978
ARMA(1,2)-GARCH(1,1) 495.86 -7.0995 -6.9722
ARMA(2,0)-GARCH(1,1) 492.47 -7.0648 -6.9587
ARMA(1,3)-GARCH(1,1) 496.99 -7.1013 -6.9528
ARMA(2,1)-GARCH(1,1) 492.81 -7.0553 -6.9280
ARMA(2,0)-GARCH(1,2) 492.59 -7.0521 -6.9248
ARMA(1,4)-GARCH(1,1) 497.11 -7.0886 -6.9189
ARMA(1,3)-GARCH(1,2) 497.00 -7.0869 -6.9172
ARMA(1,3)-GARCH(2,1) 496.99 -7.0868 -6.9171
ARMA(2,2)-GARCH(1,1) 494.30 -7.0624 -6.9139
ARMA(3,5)-GARCH(2,1) 506.48 -7.1663 -6.9118
ARMA(3,0)-GARCH(1,1) 491.69 -7.0390 -6.9117
ARMA(1,2)-GARCH(2,2) 495.87 -7.0706 -6.9009
ARMA(2,3)-GARCH(1,1) 495.29 -7.0622 -6.8925
ARMA(2,1)-GARCH(1,2) 492.66 -7.0385 -6.8900
ARMA(2,0)-GARCH(2,2) 492.59 -7.0375 -6.8890
ARMA(1,5)-GARCH(1,1) 497.51 -7.0798 -6.8889
ARMA(1,4)-GARCH(1,2) 497.38 -7.0779 -6.8870
ARMA(1,4)-GARCH(2,1) 497.37 -7.0778 -6.8869
ARMA(3,1)-GARCH(1,1) 492.24 -7.0325 -6.8840
ARMA(1,3)-GARCH(2,2) 497.00 -7.0725 -6.8816
ARMA(2,2)-GARCH(1,2) 494.31 -7.0480 -6.8783
ARMA(2,2)-GARCH(2,1) 494.30 -7.0479 -6.8782
ARMA(3,0)-GARCH(2,1) 491.76 -7.0255 -6.8771
ARMA(3,2)-GARCH(1,1) 493.24 -7.0325 -6.8628
ARMA(2,4)-GARCH(1,1) 495.39 -7.0491 -6.8582
ARMA(2,3)-GARCH(1,2) 495.30 -7.0478 -6.8569
ARMA(2,3)-GARCH(2,1) 495.09 -7.0448 -6.8539
ARMA(1,5)-GARCH(1,2) 497.52 -7.0655 -6.8533
ARMA(1,5)-GARCH(2,1) 497.51 -7.0653 -6.8532
ARMA(1,4)-GARCH(2,2) 497.38 -7.0634 -6.8513
ARMA(3,1)-GARCH(1,2) 492.25 -7.0181 -6.8484
ARMA(3,1)-GARCH(2,1) 492.18 -7.0171 -6.8474
ARMA(2,2)-GARCH(2,2) 494.31 -7.0335 -6.8426
ARMA(3,0)-GARCH(2,2) 491.77 -7.0111 -6.8414
ARMA(3,5)-GARCH(2,2) 503.77 -7.1127 -6.8369
ARMA(3,3)-GARCH(1,1) 493.63 -7.0237 -6.8328
ARMA(3,4)-GARCH(1,1) 495.73 -7.0396 -6.8275
ARMA(3,2)-GARCH(1,2) 493.25 -7.0181 -6.8272
ARMA(3,2)-GARCH(2,1) 492.97 -7.0141 -6.8232
ARMA(2,4)-GARCH(1,2) 495.41 -7.0349 -6.8228
ARMA(2,5)-GARCH(1,1) 495.40 -7.0347 -6.8226
ARMA(2,4)-GARCH(2,1) 495.39 -7.0346 -6.8224
ARMA(2,3)-GARCH(2,2) 495.30 -7.0333 -6.8212
ARMA(0,5)-GARCH(1,1) 490.21 -6.9885 -6.8188
ARMA(1,5)-GARCH(2,2) 497.52 -7.0510 -6.8176
ARMA(3,1)-GARCH(2,2) 492.25 -7.0036 -6.8127
ARMA(3,3)-GARCH(1,2) 493.64 -7.0093 -6.7972
ARMA(3,3)-GARCH(2,1) 493.61 -7.0088 -6.7967
ARMA(3,4)-GARCH(1,2) 495.73 -7.0251 -6.7918
ARMA(3,4)-GARCH(2,1) 495.73 -7.0251 -6.7918
ARMA(3,2)-GARCH(2,2) 493.25 -7.0036 -6.7915
ARMA(2,5)-GARCH(1,2) 495.41 -7.0204 -6.7870
ARMA(2,5)-GARCH(2,1) 495.40 -7.0202 -6.7869
ARMA(2,4)-GARCH(2,2) 495.39 -7.0202 -6.7868
ARMA(0,5)-GARCH(1,2) 490.21 -6.9741 -6.7832
ARMA(0,5)-GARCH(2,1) 490.21 -6.9740 -6.7831
ARMA(0,4)-GARCH(1,1) 484.87 -6.9256 -6.7772
ARMA(3,3)-GARCH(2,2) 493.64 -6.9947 -6.7614
ARMA(3,5)-GARCH(1,2) 495.75 -7.0109 -6.7563
ARMA(3,4)-GARCH(2,2) 495.73 -7.0106 -6.7561
ARMA(0,3)-GARCH(1,1) 480.79 -6.8811 -6.7538
ARMA(2,5)-GARCH(2,2) 495.41 -7.0059 -6.7513
ARMA(3,5)-GARCH(1,1) 492.68 -6.9809 -6.7476
ARMA(0,5)-GARCH(2,2) 490.21 -6.9596 -6.7475
ARMA(0,4)-GARCH(1,2) 484.87 -6.9112 -6.7415
ARMA(0,4)-GARCH(2,1) 484.87 -6.9111 -6.7414
ARMA(0,3)-GARCH(1,2) 480.80 -6.8666 -6.7181
ARMA(0,3)-GARCH(2,1) 480.79 -6.8666 -6.7181
ARMA(0,4)-GARCH(2,2) 484.87 -6.8967 -6.7058
ARMA(0,3)-GARCH(2,2) 480.80 -6.8521 -6.6824
ARMA(0,2)-GARCH(1,1) 462.88 -6.6360 -6.5299
ARMA(0,2)-GARCH(1,2) 462.88 -6.6215 -6.4942
ARMA(0,2)-GARCH(2,1) 462.88 -6.6215 -6.4942
ARMA(0,2)-GARCH(2,2) 462.88 -6.6070 -6.4585
ARMA(0,1)-GARCH(1,1) 448.88 -6.4475 -6.3627
ARMA(0,1)-GARCH(1,2) 448.88 -6.4331 -6.3270
ARMA(0,1)-GARCH(2,1) 448.88 -6.4330 -6.3270
ARMA(0,1)-GARCH(2,2) 448.88 -6.4185 -6.2913
ARMA(0,0)-GARCH(1,1) 431.15 -6.2051 -6.1415
ARMA(0,0)-GARCH(2,1) 431.25 -6.1920 -6.1071
ARMA(0,0)-GARCH(1,2) 431.13 -6.1904 -6.1055
ARMA(0,0)-GARCH(2,2) 431.25 -6.1775 -6.0714

Modello selezionato (finale): ARMA(1,1)-GARCH(1,1) — BIC = -7.1114, contro -7.1327 del modello a mu libero: differenza statisticamente trascurabile, ma con parametri ben identificati (nessun coefficiente al bordo del vincolo di stazionarietà/positività).

Questo è il modello usato per tutta la diagnostica e i parametri che seguono.

7.3 Parametri calibrati

Parametri calibrati — ARMA(1,1)-GARCH(1,1)
Parametro Stima Std. Error t-stat p-value
mu 0.0046935 NA NA NA
ar1 0.9271317 0.0303119 30.5864 0.0000
ma1 -0.2546437 0.0903851 -2.8173 0.0048
omega 0.0000217 0.0000075 2.8936 0.0038
alpha1 0.5832540 0.2413923 2.4162 0.0157
beta1 0.0440413 0.1802088 0.2444 0.8069

Modello: ARMA(1,1)-GARCH(1,1) | Log-likelihood: 503.0021 | BIC: -7.1114 | AIC: -7.2174 | RMSE residui: 0.006805

Interpretazione economica dei parametri:

  • \(\hat\psi_y =\) 0.004694 (annualizzato 1.88%): fissato alla media campionaria storica dei log-return trimestrali, non stimato in MLE (per questo la tabella sopra non riporta errore standard/p-value per mu) — si veda la sottosezione “Il problema: deriva implausibile con mu libero” più sopra per il perché.
  • I coefficienti AR/MA (\(\hat\phi_i\), \(\hat\theta_j\)) catturano la memoria nella media attorno a quel livello fissato — momentum immobiliare, coerente con l’ACF osservata in Sezione 5 — senza determinare il livello di lungo periodo del processo, che resta ancorato alla media storica.
  • La persistenza della volatilità è \(\sum\hat\alpha_i + \sum\hat\beta_j =\) 0.6273 (< 1 garantisce stazionarietà della varianza condizionale; ben interna al vincolo, non prossima al bordo).

7.4 Diagnostica residui

7.4.1 Volatilità condizionale nel tempo

dt_ag_plot <- dt_armagarch[!is.na(armagarch_sigma_t)]
ggplot(dt_ag_plot, aes(x = date_q, y = armagarch_sigma_t * 100)) +
  geom_line(color = "#9467bd", linewidth = 0.7) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = sprintf("Volatilità Condizionale ARMA(%d,%d)-GARCH(%d,%d)", par_armagarch$p, par_armagarch$q, par_armagarch$m, par_armagarch$n),
    subtitle = expression("Deviazione standard condizionale trimestrale" ~ hat(sigma)[t]),
    x = NULL, y = "Volatilità condizionale (%)"
  ) +
  theme_lcrm()

Il modello GARCH cattura le fasi di alta volatilità (anni ’90, crisi 2008) e la compressione della volatilità nel periodo di stagnazione 2013–2019 — esattamente il pattern che l’ACF dei quadrati aveva segnalato in Sezione 5.

7.4.2 Residui standardizzati

dt_ag_r <- dt_armagarch[!is.na(armagarch_resid_std)]
ggplot(dt_ag_r, aes(x = date_q, y = armagarch_resid_std)) +
  geom_hline(yintercept = c(-2, 0, 2),
             linetype = c("dashed", "solid", "dashed"),
             color = c("grey50", "grey30", "grey50"), alpha = 0.7) +
  geom_line(color = "#2ca02c", linewidth = 0.5) +
  geom_point(data = dt_ag_r[abs(armagarch_resid_std) > 2.5],
             color = "#d62728", size = 2) +
  scale_x_date(date_labels = "%Y", date_breaks = "5 years") +
  labs(
    title    = sprintf("Residui Standardizzati ARMA(%d,%d)-GARCH(%d,%d)", par_armagarch$p, par_armagarch$q, par_armagarch$m, par_armagarch$n),
    subtitle = "Valori |z| > 2.5 evidenziati in rosso",
    x = NULL, y = expression(z[t])
  ) +
  theme_lcrm()

7.4.3 QQ plot residui standardizzati

z_std <- sort(par_armagarch$residuals_std[!is.na(par_armagarch$residuals_std)])
qq_ag <- data.frame(
  theoretical = qnorm(ppoints(length(z_std))),
  sample      = z_std
)
ggplot(qq_ag, aes(x = theoretical, y = sample)) +
  geom_abline(slope = 1, intercept = 0,
              color = "#d62728", linewidth = 0.8, linetype = "dashed") +
  geom_point(size = 1.5, alpha = 0.6, color = "#2ca02c") +
  labs(
    title    = sprintf("QQ Plot Residui Standardizzati ARMA(%d,%d)-GARCH(%d,%d)", par_armagarch$p, par_armagarch$q, par_armagarch$m, par_armagarch$n),
    subtitle = "vs N(0,1) — i residui si distribuiscono molto più vicino alla gaussiana rispetto al GBM",
    x = "Quantili teorici N(0,1)", y = "Quantili osservati"
  ) +
  theme_lcrm()

7.4.4 ACF residui standardizzati

Il test chiave: dopo aver rimosso la struttura ARMA-GARCH, i residui standardizzati non devono più mostrare autocorrelazione.

z_vec <- par_armagarch$residuals_std[!is.na(par_armagarch$residuals_std)]
acf_r  <- acf(z_vec, plot = FALSE, lag.max = 16)
acf_r_dt <- data.frame(lag = as.numeric(acf_r$lag[-1]),
                         acf = as.numeric(acf_r$acf[-1]))
ci_ag <- 1.96 / sqrt(length(z_vec))

ggplot(acf_r_dt, aes(x = lag, y = acf)) +
  geom_hline(yintercept = c(-ci_ag, ci_ag),
             linetype = "dashed", color = "#d62728", alpha = 0.7) +
  geom_hline(yintercept = 0, color = "grey40") +
  geom_segment(aes(xend = lag, yend = 0), color = "#2ca02c", linewidth = 0.8) +
  geom_point(color = "#2ca02c", size = 2) +
  scale_x_continuous(breaks = acf_r_dt$lag) +
  labs(
    title    = sprintf("ACF Residui Standardizzati ARMA(%d,%d)-GARCH(%d,%d)", par_armagarch$p, par_armagarch$q, par_armagarch$m, par_armagarch$n),
    subtitle = "Nessun lag significativo: il modello ha catturato tutta la struttura seriale",
    x = "Lag (trimestri)", y = "Autocorrelazione"
  ) +
  theme_lcrm()

7.4.5 Controlli diagnostici

Controlli diagnostici residui ARMA-GARCH
check result detail
ARMA-GARCH: Ljung-Box residui std (lag 8) OK p-value = 0.2372
ARMA-GARCH: Ljung-Box z^2 (lag 8) — effetti ARCH residui OK p-value = 0.1659
ARMA-GARCH: Shapiro-Wilk normalità residui std WARNING W = 0.9671, p-value = 0.0021
ARMA-GARCH: Persistenza GARCH (sum(alpha)+sum(beta) < 1) [GARCH(1,1)] OK sum = 0.6273

8 Confronto tra modelli e raccomandazioni

8.1 Confronto empirico

Confronto empirico GBM vs ARMA-GARCH sui dati italiani
Metrica GBM ARMA-GARCH
Log-likelihood 410.51 503
BIC -811.1664 -7.1114
RMSE residui 0.012355 0.0068045
MAE residui 0.010351 0.0048438
Ljung-Box lag 8 (p-value) 0 0.2372
Parametri stimati 2 6

Il BIC penalizza per il numero di parametri: il fatto che l’ARMA-GARCH mostri un BIC più negativo nonostante i parametri aggiuntivi è evidenza che il miglioramento di adattamento è reale e non un artefatto di overfitting.

8.2 Caratteristiche a confronto

Caratteristica GBM ARMA-GARCH
Memoria nella media Nessuna (log-return i.i.d.) AR — cattura momentum immobiliare
Volatilità Costante \(\sigma_H\) Condizionale \(\sigma_t\) variabile
Dipendenza con \(r_t\) Non necessaria (indipendenza) Non necessaria (indipendenza)
Ljung-Box residui Rifiuto netto (p ≈ 0) Non rifiuto
Numero parametri 2 6
Forma chiusa NNEG Sì (Black-76) No (Monte Carlo)

8.3 Raccomandazioni

Modello raccomandato per la simulazione stocastica LCRM: ARMA-GARCH + CIR con indipendenza.

Il modello ARMA-GARCH per la property, calibrato indipendentemente dal CIR per il tasso, risponde alle due violazioni sistematiche documentate nei dati italiani (autocorrelazione e volatility clustering) senza richiedere alcuna struttura di copula. L’assunzione di indipendenza è sia empiricamente supportata (Sezione 6) sia teoricamente allineata con i framework MAF_Chapter e IME (2025).

Quando preferire il GBM: per applicazioni dove è richiesta la forma semi-chiusa del NNEG (Black-76) o dove la trattabilità analitica è vincolante. In questi casi la semplicità del GBM compensa il peggioramento di adattamento.

Report generato con R Markdown — 2026-07-24 16:14