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:
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.
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.
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.
Sezione 7 — ARMA-GARCH come modello finale per la property. Il modello ARMA\((p,q)\)-GARCH\((1,1)\) (Shao, 2019) corregge entrambe le limitazioni del GBM e produce residui ben specificati.
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 |
| 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.
| 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.
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à).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
| 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 |
| 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) |
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()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\).
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.
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.
| 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).
| 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.
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()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()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()\[\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()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.
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.
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\).
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\]
| 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 |
Il GBM richiede che i log-return siano i.i.d. normali. Verifichiamo questa ipotesi sistematicamente.
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()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()| 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.
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:
| 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.
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.
| 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.
| 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.
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.
Per confrontare le due serie su una scala comparabile, trasformiamo ciascuna nelle proprie probabilità integrali di trasformazione (PIT) rispetto al modello calibrato:
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).
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.
| 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.
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.
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.
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.
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]\]
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.
| 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 selezionato: 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.
| Parametro | Stima | Std. Error | t-stat | p-value |
|---|---|---|---|---|
| mu | 0.0164216 | 0.0040339 | 4.0709 | 0.0000 |
| ar1 | 0.6034115 | 0.0771884 | 7.8174 | 0.0000 |
| ar2 | 0.3292049 | 0.0768504 | 4.2837 | 0.0000 |
| omega | 0.0000190 | 0.0000055 | 3.4455 | 0.0006 |
| alpha1 | 0.7515551 | 0.2567277 | 2.9274 | 0.0034 |
| beta1 | 0.0297059 | 0.1248479 | 0.2379 | 0.8119 |
Modello: ARMA(2,0)-GARCH(1,1) | Log-likelihood: 506.9412 | BIC: -7.1327 | AIC: -7.2600 | RMSE residui: 0.006708
Interpretazione economica dei parametri:
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.
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()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()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()| check | result | detail |
|---|---|---|
| ARMA-GARCH: Ljung-Box residui std (lag 8) | OK | p-value = 0.3446 |
| ARMA-GARCH: Ljung-Box z^2 (lag 8) — effetti ARCH residui | OK | p-value = 0.1966 |
| ARMA-GARCH: Shapiro-Wilk normalità residui std | WARNING | W = 0.9651, p-value = 0.0013 |
| ARMA-GARCH: Persistenza GARCH (sum(alpha)+sum(beta) < 1) [GARCH(1,1)] | OK | sum = 0.7813 |
| Metrica | GBM | ARMA-GARCH |
|---|---|---|
| Log-likelihood | 410.51 | 506.94 |
| BIC | -811.1664 | -7.1327 |
| RMSE residui | 0.012355 | 0.0067084 |
| MAE residui | 0.010351 | 0.0047796 |
| Ljung-Box lag 8 (p-value) | 0 | 0.3446 |
| 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.
| 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) |
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-06-30 15:47