Interest Rates - France - MIR1

Data - Banque de France

🇫🇷 Version française

Info

Last observation: Q: 2026-09-30 (N = 19) · M: 2026-08-31 (N = 5)

First observation: M: 1966-01-31 (N = 2) · Q: 1984-06-30 (N = 20)

Last data update: 28 août 2026, 19:08. Last compile: 30 août 2026, 10:27

Structure

Deposit Remuneration Rates

Nobs

Code
MIR1 |>

  filter(grepl("Taux moyen de rémunération annuel", Variable)) |>
  group_by(variable, Variable) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
variable Variable Nobs
MIR1.M.FR.B.L20.A.C.A.2300U6.EUR.O Taux moyen de rémunération annuel des dépôts bancaires 266
MIR1.M.FR.B.L20.A.R.A.2300U6.EUR.O Taux moyen de rémunération annuel des dépôts bancaires 266
MIR1.M.FR.B.L20.L.C.A.2300U6.EUR.O Taux moyen de rémunération annuel des dépôts, moins de 2 ans 266
MIR1.M.FR.B.L20.L.R.A.2300U6.EUR.O Taux moyen de rémunération annuel des dépôts, moins de 2 ans 266

Deposit remuneration rate + housing loans

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L20.A.C.A.2300U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L20.L.C.A.2300U6.EUR.O", variable)) |>
  na.omit() |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.55, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .1),
                labels = percent_format(accuracy = .1))

Rates

Nobs

Code
MIR1 |>

  filter(FREQ == "M",
         REF_AREA == "FR",
         BS_ITEM == "A22") |>
  group_by(variable, Variable) |>
  summarise(Nobs = n()) |>
  print_table_conditional()
variable Variable Nobs
MIR1.M.FR.B.A22.A.5.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages, flux CVS 282
MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, flux CVS 282
MIR1.M.FR.B.A22.A.NBBASE100.A.2254P.EUR.N Nombre de prêts à l'habitat aux primo-accédants (cumul annuel), base 100 décembre 2015 127
MIR1.M.FR.B.A22.A.R.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages, taux d'intérêt annuel 282
MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, taux d'intérêt annuel 331
MIR1.M.FR.B.A22.A.Y.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages résidents, flux mensuels cumulés sur un an 282
MIR1.M.FR.B.A22.F.R.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages, jusqu'à un an, taux d'intérêt annuel 282
MIR1.M.FR.B.A22.F.R.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, jusqu'à un an, taux d'intérêt annuel 282
MIR1.M.FR.B.A22.F.Y.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages résidents, jusqu'à un an, flux mensuels cumulés sur un an 282
MIR1.M.FR.B.A22.K.R.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages, à plus d'un an, taux d'intérêt annuel 282
MIR1.M.FR.B.A22.K.R.A.2254U6.EUR.N Crédits nouveaux à l'habitat des particuliers, à plus d'un an, taux d'intérêt annuel 282
MIR1.M.FR.B.A22.K.Y.A.2250U6.EUR.N Crédits nouveaux à l'habitat des ménages résidents, à plus d'un an, flux mensuels cumulés sur un an 282

Regulated savings accounts

-Info. html

NFC rates

NFC table

Code
MIR1 |>

  filter(BS_COUNT_SECTOR == "2240U6") |>
  group_by(Variable) |>
  summarise(Nobs = n(),
            date = last(date),
            value = last(value)) |>
  print_table_conditional()

Amount categories

All

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A20.A.R.0.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.1.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.A.2240U6.EUR.N", variable)) |>


  arrange(desc(date)) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Amount_cat)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.8, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

2010-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A20.A.R.0.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.1.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.A.2240U6.EUR.N", variable)) |>


  arrange(desc(date)) |>
  filter(date >= as.Date("2010-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Amount_cat)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.7, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 0.5),
                labels = percent_format(accuracy = .1))

Amount categories

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A20.A.R.0.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.1.2240U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A20.A.R.A.2240U6.EUR.N", variable)) |>


  arrange(desc(date)) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Amount_cat)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.7, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

Regulated savings accounts (including LDDS)

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23RJ.A.R.A.2300.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLJ.A.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLP.H.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L22FRSP.H.R.A.2250U6.EUR.N", variable)) |>

  arrange(desc(date)) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.17),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Annual remuneration rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

Regulated savings accounts

All

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23RJ.A.R.A.2300.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLJ.A.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLP.H.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L22FRSP.H.R.A.2250U6.EUR.N", variable)) |>

  arrange(desc(date)) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 5), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.17),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Annual remuneration rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

2000-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23RJ.A.R.A.2300.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLJ.A.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLP.H.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L22FRSP.H.R.A.2250U6.EUR.N", variable)) |>

  arrange(desc(date)) |>
  filter(date >= as.Date("2000-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Annual remuneration rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

2010-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23RJ.A.R.A.2300.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLJ.A.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLP.H.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L22FRSP.H.R.A.2250U6.EUR.N", variable)) |>

  arrange(desc(date)) |>
  filter(date >= as.Date("2010-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Annual remuneration rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 0.5),
                labels = percent_format(accuracy = .1))

2018-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.L23FRLA.D.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23RJ.A.R.A.2300.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLJ.A.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L23FRLP.H.R.A.2250U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.L22FRSP.H.R.A.2250U6.EUR.N", variable)) |>

  arrange(desc(date)) |>
  filter(date >= as.Date("2018-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.8),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Annual remuneration rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 0.5),
                labels = percent_format(accuracy = .1))

Housing loan rates

All

Code
# MIR1.M.FR.B.A22FRF.A.R.A.2254U6.EUR.N - New fixed-rate housing loans to households, interest rate, in %
# MIR1.M.FR.B.A22FRV.A.R.A.2254U6.EUR.N - New variable-rate housing loans to households, interest rate, in %
# MIR1.M.FR.B.A22HR.A.R.A.2254U6.EUR.N - Rate on new housing loans (excluding renegotiations) to households
MIR1 |>

  filter(FREQ == "M",
         REF_AREA == "FR",
         BS_REP_SECTOR == "B",
         BS_ITEM == "A2C",
         DATA_TYPE_MIR == "R",
         AMOUNT_CAT == "A",
         BS_COUNT_SECTOR == "2250U6",
         CURRENCY_TRANS == "EUR",
         IR_BUS_COV == "N") |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Maturity_orig)) +

  theme_minimal() + xlab("") + ylab("Interest rate (%)") +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.15),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

All

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22.K.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.F.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N", variable)) |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.15),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1))

2016-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22.K.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.F.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N", variable)) |>

  filter(date >= as.Date("2016-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .1),
                labels = percent_format(accuracy = .1))

2018-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22.K.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.F.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N", variable)) |>

  filter(date >= as.Date("2018-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.85),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, .1),
                labels = percent_format(accuracy = .1))

Deposit remuneration rate + housing loans

All

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.A.N30.A.R.A.2230U6.EUR.O", variable) |
           grepl("MIR1.M.FR.B.A22.A.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.L21.A.R.A.2230U6.EUR.O", variable)) |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.55, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1),
                limits = c(0, 0.07))

Share of renegotiations

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22PR.A.W.A.2254FR.EUR.N", variable)) |>

  na.omit() |>
  ggplot() + geom_line(aes(x = date, y = value/100)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.35, 0.15),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Share of renegotiations in total housing loans (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 5),
                labels = percent_format(accuracy = 1))

Credit volumes

Consumer credit

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A2Z.A.R.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A2B.A.R.A.2254U6.EUR.N", variable)) |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 1),
                labels = percent_format(accuracy = 1),
                limits = c(0.03, 0.15))

New housing loans

All

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22HR.A.5.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N", variable)) |>

  ggplot() + geom_line(aes(x = date, y = value, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("") +
  scale_y_continuous(breaks = seq(0, 100, 2))

2015-

Code
MIR1 |>
  filter(grepl("MIR1.M.FR.B.A22HR.A.5.A.2254U6.EUR.N", variable) |
           grepl("MIR1.M.FR.B.A22.A.5.A.2254U6.EUR.N", variable)) |>

  filter(date >= as.Date("2015-01-01")) |>
  ggplot() + geom_line(aes(x = date, y = value, color = Variable)) +

  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("") +
  scale_y_continuous(breaks = seq(0, 100, 2))

Usury rate

2017-

Code
MIR1 |>
  filter(grepl("MIR1.Q.FR.R.A22FRF.Q.U.A.2254FR.EUR.N", variable) |
           grepl("MIR1.Q.FR.R.A22FRF.R.U.A.2254FR.EUR.N", variable) |
           grepl("MIR1.Q.FR.R.A22FRF.S.U.A.2254FR.EUR.N", variable)) |>

  ggplot() + geom_line(aes(x = date, y = value/100, color = Variable)) +
  theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1960, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank(),
        legend.direction = "vertical") +
  xlab("") + ylab("Interest rate (%)") +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 0.1),
                labels = percent_format(accuracy = .1))