Remboursements de crédits à l’habitat et revenu vraiment disponible des ménages

Données - ACPR

Méthode

Les remboursements de capital se déduisent de l’identité de stock :

\[\text{Remboursements}_t = \text{Production}_t - \Delta\text{Encours}_t\]

  • Production : ACPR, credithab_statistiques_mensuelles (ligne 6, mensuelle depuis 2012).
    • (A) brute : y compris rachats de crédits externes, renégociations et regroupements de crédits.
    • (B) hors refinancements : on retire de la production la part des rachats (ligne 39), renégociations (ligne 40) et regroupements (ligne 41).
  • Variation d’encours : Banque de France, BSI1, crédits à l’habitat accordés aux ménages résidents (BSI1.M.FR.N.A.A22.A.4.U6.2251.Z01.E).
  • Revenu disponible brut (RDB) des ménages : INSEE, CNT-2020-CSI (B6, S14, CVS-CJO).
  • Revenu vraiment disponible = RDB − remboursements de capital. Le RDB étant déjà net des intérêts versés, on ne retranche que le capital (sinon double compte). Les rapports sont calculés en cumul sur 4 trimestres, pour éliminer la saisonnalité.

Limites : la variation d’encours est nette de titrisation et d’amortissements comptables, et le solde production − Δ encours contient donc aussi les remboursements anticipés. Rembourser du capital est de l’épargne, pas une perte de richesse : l’indicateur mesure le revenu arbitrable.

Part des remboursements de capital dans le revenu disponible

Code
remboursements_credit_habitat |>
  filter(!is.na(ratio_brut)) |>
  select(date, `(A) Production brute` = ratio_brut, `(B) Production hors refinancements` = ratio_hors_refi) |>
  pivot_longer(-date) |>
  ggplot(aes(x = date, y = value, color = name)) + geom_line() +
  theme_minimal() + xlab("") + ylab("Remboursements de capital / RDB (cumul 4 trimestres)") +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  theme(legend.title = element_blank(), legend.position = "bottom")

Revenu disponible brut et revenu vraiment disponible

Code
remboursements_credit_habitat |>
  filter(!is.na(rdb_4t)) |>
  transmute(date,
            `Revenu disponible brut` = rdb_4t,
            `RDB − remboursements (A, brute)` = rdb_4t - rembt_brut_4t,
            `RDB − remboursements (B, hors refinancements)` = rdb_4t - rembt_hors_refi_4t) |>
  pivot_longer(-date) |>
  ggplot(aes(x = date, y = value / 1000, color = name)) + geom_line() +
  theme_minimal() + xlab("") + ylab("Milliards d'euros (cumul 4 trimestres)") +
  scale_color_manual(values = viridis(4)[1:3]) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  scale_y_continuous(labels = label_number(big.mark = " ")) +
  theme(legend.title = element_blank(), legend.position = "bottom")

Croissance du revenu disponible brut et du revenu vraiment disponible

Code
remboursements_credit_habitat |>
  filter(!is.na(rdb_4t)) |>
  transmute(date,
            `Revenu disponible brut` = rdb_4t,
            `RDB − remboursements (B, hors refinancements)` = rdb_4t - rembt_hors_refi_4t) |>
  pivot_longer(-date) |>
  group_by(name) |>
  mutate(ga = value / lag(value, 4) - 1) |>
  filter(!is.na(ga)) |>
  ggplot(aes(x = date, y = ga, color = name)) + geom_line() +
  theme_minimal() + xlab("") + ylab("Glissement annuel (%)") +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  theme(legend.title = element_blank(), legend.position = "bottom")

Production, variation d’encours et remboursements

Code
remboursements_credit_habitat |>
  filter(!is.na(rdb_4t)) |>
  transmute(date,
            `Production brute` = prod_brute_4t,
            `Production hors refinancements` = prod_hors_refi_4t,
            `Variation d'encours` = variation_encours_4t,
            `Remboursements (A)` = rembt_brut_4t,
            `Remboursements (B)` = rembt_hors_refi_4t) |>
  pivot_longer(-date) |>
  ggplot(aes(x = date, y = value / 1000, color = name)) + geom_line() +
  theme_minimal() + xlab("") + ylab("Milliards d'euros (cumul 4 trimestres)") +
  scale_color_manual(values = viridis(6)[1:5]) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  theme(legend.title = element_blank(), legend.position = "bottom")

Taux d’amortissement de l’encours

Code
remboursements_credit_habitat |>
  filter(!is.na(taux_amortissement_brut)) |>
  select(date, `(A) Production brute` = taux_amortissement_brut,
         `(B) Production hors refinancements` = taux_amortissement_hors_refi) |>
  pivot_longer(-date) |>
  ggplot(aes(x = date, y = value, color = name)) + geom_line() +
  theme_minimal() + xlab("") + ylab("Remboursements 4T / encours il y a un an") +
  scale_color_manual(values = viridis(3)[1:2]) +
  scale_x_date(date_breaks = "1 year", date_labels = "%Y") +
  scale_y_continuous(labels = percent_format(accuracy = 1)) +
  theme(legend.title = element_blank(), legend.position = "bottom")

Données

Code
remboursements_credit_habitat |>
  arrange(desc(date)) |>
  select(date, rdb, prod_brute, prod_hors_refi, variation_encours, rembt_brut, rembt_hors_refi,
         ratio_brut, ratio_hors_refi) |>
  mutate(across(c(ratio_brut, ratio_hors_refi), ~ round(100 * .x, 1)),
         across(c(rdb, prod_brute, prod_hors_refi, variation_encours, rembt_brut, rembt_hors_refi), round)) |>
  print_table_conditional()