Real Estate in France

Data - Banque de France

🇫🇷 Version française

Info

source dataset Title .html .rData
bdf immobilier Immobilier en France 2026-08-12 2026-08-01

variable

Code
immobilier |>
  left_join(variable, by = "variable") |>
  group_by(variable, Variable) |>
  summarise(Nobs = n(),
            max_date = max(date),
            min_date = min(date)) |>
  arrange(desc(max_date)) |>
  print_table_conditional()
variable Variable Nobs max_date min_date
FM.D.U2.EUR.4F.KR.DFR.LEV BCE - Facilité de dépôt (données brutes) 10064 2026-07-21 1999-01-01
BSI1.M.FR.N.R.A220Z.A.1.U6.2254FR.Z01.E Crédits à l'habitat accordés aux particuliers résidents, encours 398 2026-05-31 1993-04-30
BSI1.M.FR.N.R.A26.A.1.U6.2254FR.Z01.E Crédits accordés aux particuliers résidents, encours 398 2026-05-31 1993-04-30
BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.E Crédits à l'habitat accordés aux particuliers résidents, flux mensuels, CVS 398 2026-05-31 1993-04-30
BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.V3F Crédits à l'habitat accordés aux particuliers résidents, variation d'encours (moyenne sur 3 mois glissants), CVS 398 2026-05-31 1993-04-30
MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, flux CVS 281 2026-05-31 2003-01-31
MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, taux d'intérêt annuel 330 2026-05-31 1998-12-31
MIR1.M.FR.B.A22HR.A.5.A.2254U6.EUR.N Crédits nouveaux à l'habitat (hors renégociations) aux particuliers résidents, flux, CVS 281 2026-05-31 2003-01-31
FM.M.U2.EUR.4F.KR.DF.LEV BCE - Facilité de dépôt - niveau fin de mois yc mois en cours 290 2023-02-28 1999-01-31
FM.M.U2.EUR.4F.KR.MLF.LEV BCE - Facilité de prêt marginal - niveau fin de mois yc mois en cours 290 2023-02-28 1999-01-31
FM.M.U2.EUR.4F.KR.MRR_FR.LEV BCE - Principales opérations de refinancement (taux fixe) 290 2023-02-28 1999-01-31

Compare mortgage rates and central bank rate

All

1 year

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.32, 0.1),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

2 years

All

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.32, 0.1),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 0.5),
                labels = percent_format(accuracy = .1))

2020-

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  filter(date >= as.Date("2020-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = "3 months",
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .25),
                labels = percent_format(accuracy = .01))

2021-

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  filter(date >= as.Date("2021-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  #scale_color_manual(values = viridis(3)[1:2]) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = "2 months",
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .25),
                labels = percent_format(accuracy = .01))

2022-

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  filter(date >= as.Date("2022-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  #scale_color_manual(values = viridis(3)[1:2]) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.35, 0.9),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .25),
                labels = percent_format(accuracy = .01))

All rates

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N" |
           variable == "FM.M.U2.EUR.4F.KR.MRR_FR.LEV" |
           variable == "FM.M.U2.EUR.4F.KR.MLF.LEV" |
           variable == "FM.D.U2.EUR.4F.KR.DFR.LEV") |>
  left_join(variable, by = "variable") |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable, linetype = Variable)) +
  scale_color_manual(values = c(viridis(3)[1], viridis(3)[1], viridis(3)[1], viridis(3)[2])) +
  scale_linetype_manual(values = c("dashed", "longdash", "solid", "solid")) +
  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  theme(legend.position = c(0.32, 0.13),
        legend.title = element_blank(),
        legend.spacing.x = unit(0.2, 'cm'),
        legend.spacing.y = unit(0.2, 'cm')) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1),
                limits = c(-0.02, 0.065))

Housing loans

Outstanding amounts

Linear

Code
plot_linear <- immobilier |>
  filter(variable == "BSI1.M.FR.N.R.A26.A.1.U6.2254FR.Z01.E" |
           variable == "BSI1.M.FR.N.R.A220Z.A.1.U6.2254FR.Z01.E") |>
  left_join(variable, by = "variable") |>
  ggplot() + theme_minimal() + xlab("") + ylab("") +
  geom_line(aes(x = date, y = value / 1000, color = Variable)) +

  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  scale_y_continuous(breaks = seq(-10000, 10000, 100),
                labels = dollar_format(suffix = " Mds€", prefix = "",  accuracy = 1))

plot_linear

Log

Code
plot_log <- plot_linear +
  scale_y_log10(breaks = seq(-10000, 10000, 100),
                     labels = dollar_format(suffix = " Mds€", prefix = "",  accuracy = 1))

plot_log

Both

Code
library("ggpubr")
ggarrange(plot_linear + ggtitle("Linear"), plot_log + ggtitle("Log"), common.legend = T, legend = "bottom")

Monthly amounts

All

Code
immobilier |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.E") |>
  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000))

2000-

Code
immobilier |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.E",
         date >= as.Date("1999-12-31")) |>
  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value)) +
  theme_minimal() + xlab("") + ylab("") +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000))

3 months

All

Code
immobilier |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.V3F") |>
  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value)) +
  theme_minimal() + xlab("") + ylab("Housing loans granted to resident households\n change in outstanding amounts (3-month rolling average)") +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000),
                     labels = dollar_format(acc = 1, pre = ""))

2000-

Code
immobilier |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.V3F") |>
  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value/1000)) +
  theme_minimal() + xlab("") + ylab("Housing loans granted to resident households\n change in outstanding amounts (3-month rolling average)") +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000)/1000,
                     labels = dollar_format(acc = 1, pre = "", su = " Mds€"))

Last year

Code
immobilier |>
  filter(date >= Sys.Date() - months(18)) |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.V3F") |>
  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value)) +
  theme_minimal() + xlab("") + ylab("") +
  theme(axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_x_date(breaks = "1 month",
               labels = date_format("%b %Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000),
                     labels = dollar_format(acc = 1, pre = ""))

1 month, 3 months

Code
immobilier |>
  filter(variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.V3F" |
           variable == "BSI1.M.FR.Y.R.A220Z.A.4.U6.2254FR.Z01.E") |>
  left_join(variable, by = "variable") |>
  ggplot() + geom_line(aes(x = date, y = value, color = Variable)) +
  theme_minimal() + xlab("") + ylab("") +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-10000, 10000, 1000))

New housing loans (excluding renegotiations)

All

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22HR.A.5.A.2254U6.EUR.N" |
           variable == "MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N") |>
  left_join(variable, by = "variable") |>
  ggplot() + geom_line(aes(x = date, y = value, color = Variable)) +
  theme_minimal() + xlab("") + ylab("") +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-100, 100, 5))

Complete series

Code
immobilier |>
  filter(variable == "MIR1.M.FR.B.A22HR.A.5.A.2254U6.EUR.N" |
           variable == "MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N") |>
  left_join(variable, by = "variable") |>
  group_by(date) |>
  filter(n() == 2) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Variable)) +
  theme_minimal() + xlab("") + ylab("") +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(-100, 100, 5))

For more information…

Data on real estate

source dataset Title .html .rData
acpr as151 Enquête annuelle du SGACPR sur le financement de l'habitat 2022 2026-08-12 2026-08-01
acpr as160 Enquête annuelle du SGACPR sur le financement de l'habitat 2023 2026-08-12 2026-08-01
acpr as174 Enquête annuelle du SGACPR sur le financement de l'habitat 2024 2026-08-12 2026-08-01
bdf BSI1 Agrégats monétaires - France 2026-08-12 2026-08-10
bdf CPP Prix immobilier commercial 2026-08-12 2026-08-10
bdf FM Marché financier, taux 2026-08-12 2026-08-10
bdf MIR Taux d'intérêt - Zone euro 2026-08-12 2026-08-10
bdf MIR1 Taux d'intérêt - France 2026-08-12 2026-08-10
bdf RPP Prix de l'immobilier 2026-08-12 2026-08-10
bdf immobilier Immobilier en France 2026-08-12 2026-08-01
cgedd nombre-vente-maison-appartement-ancien Nombre de ventes de logements anciens cumulé sur 12 mois 2026-08-12 2026-08-01
insee CONSTRUCTION-LOGEMENTS Construction de logements 2026-08-13 2026-08-12
insee ENQ-CONJ-ART-BAT Conjoncture dans l'artisanat du bâtiment 2026-08-13 2026-08-12
insee ENQ-CONJ-IND-BAT Conjoncture dans l'industrie du bâtiment - ENQ-CONJ-IND-BAT 2026-08-13 2026-08-13
insee ENQ-CONJ-PROMO-IMMO Conjoncture dans la promotion immobilière 2026-08-13 2026-08-13
insee ENQ-CONJ-TP Conjoncture dans les travaux publics 2026-08-13 2026-08-13
insee ILC-ILAT-ICC Indices pour la révision d’un bail commercial ou professionnel 2026-08-13 2026-08-13
insee INDICES_LOYERS Indices des loyers d'habitation (ILH) 2026-08-13 2026-08-13
insee IPLA-IPLNA-2015 Indices des prix des logements neufs et Indices Notaires-Insee des prix des logements anciens 2026-08-13 2026-08-13
insee IRL Indice pour la révision d’un loyer d’habitation 2026-08-13 2026-08-13
insee PARC-LOGEMENTS Estimations annuelles du parc de logements (EAPL) 2026-08-13 2026-07-23
insee SERIES_LOYERS Variation des loyers 2026-08-13 2026-08-13
insee t_dpe_val Dépenses de consommation des ménages pré-engagées 2026-08-13 2026-08-02
notaires arrdt Prix au m^2 par arrondissement - arrdt 2026-08-12 2026-08-12
notaires dep Prix au m^2 par département 2026-08-12 2026-08-12
olap loyers Loyers 2026-08-01 2026-08-01

Data on housing

source dataset Title .html .rData
bdf RPP Prix de l'immobilier 2026-08-12 2026-08-10
bis LONG_PP Residential property prices - detailed series 2026-08-12 2026-07-25
bis SELECTED_PP Property prices, selected series 2026-08-12 2026-08-12
ecb RPP Residential Property Price Index Statistics 2026-08-13 2026-08-13
eurostat ei_hppi_q House price index (2015 = 100) - quarterly data 2026-08-13 2026-08-12
eurostat hbs_str_t223 Mean consumption expenditure by income quintile 2026-08-07 2026-08-13
eurostat prc_hicp_midx HICP (2015 = 100) - monthly data (index) 2026-08-13 2026-08-13
eurostat prc_hpi_q House price index (2015 = 100) - quarterly data 2026-08-13 2026-08-12
fred housing House Prices 2026-08-12 2026-08-12
insee IPLA-IPLNA-2015 Indices des prix des logements neufs et Indices Notaires-Insee des prix des logements anciens 2026-08-13 2026-08-13
oecd SNA_TABLE5 Final consumption expenditure of households 2026-08-13 2026-08-02
oecd housing NA NA NA

LAST_COMPILE

LAST_COMPILE
2026-08-14

Last

Code
immobilier |>
  group_by(date) |>
  summarise(Nobs = n()) |>
  arrange(desc(date)) |>
  head(2) |>
  print_table_conditional()
date Nobs
2026-07-21 1
2026-07-20 1