MFI Interest Rate Statistics

Data - ECB

Warning in readChar(con, 5L, useBytes = TRUE): impossible d'ouvrir le fichier
compressé '/Users/geerolf/iCloud/website/data/ecb/OBS_VALUE.RData', cause
probable : 'No such file or directory'

Info

Last observation: Monthly: 2026-06 (N = 7,253)

First observation: Monthly: 1980-01 (N = 12)

Last data update: 13 aoû 2026, 05:12. Last compile: 13 aoû 2026, 08:30

Structure

Info

source dataset Title .html .rData
ecb MIR MFI Interest Rate Statistics 2026-08-12 2026-08-11

Info

Monetary financial institutions in the euro area are legally obliged to report data to their National Central Banks, which in turn report to the ECB.

  • Data Structure Definition (DSD). html / link

LAST_COMPILE

LAST_COMPILE
2026-08-13

Last

Code
MIR |>
  group_by(TIME_PERIOD) |>
  summarise(Nobs = n()) |>
  arrange(desc(TIME_PERIOD)) |>
  head(2) |>
  print_table_conditional()
TIME_PERIOD Nobs
2026-06 7253
2026-05 7235

BS_ITEM

Javascript

Code
MIR |>
  group_by(BS_ITEM, Bs_item) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional_10()

Flat

Code
MIR |>
  group_by(BS_ITEM, Bs_item) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()
BS_ITEM Bs_item Nobs
A2A Loans other than revolving loans and overdrafts, convenience and extended credit card debt 443615
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 290245
L22 Deposits with agreed maturity 253388
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 110194
A20 Loans 103058
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 98393
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 79874
A22 Lending for house purchase 44576
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 44452
A25 Credit for consumption and other lending 44064
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 35164
L21 Overnight deposits 27786
L23 Deposits redeemable at notice 26181
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 25127
L24 Repurchase agreements 23864
A2Z1 Revolving loans and overdrafts 14496
A2Z3 Extended credit 13784
A2J Loans to households for house purchase and to non-financial corporations (defined for cost of borrowing purposes, sum of A2C (households), A2A and A2Z (both related to non-financial corporations)) 10419
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 5212

BS_COUNT_SECTOR

Code
MIR |>
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) |>
  group_by(BS_COUNT_SECTOR, Bs_count_sector) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()
BS_COUNT_SECTOR Bs_count_sector Nobs
2240 Non-Financial corporations (S.11) 922406
2250 Households and non-profit institutions serving households (S.14 and S.15) 621950
2230 Non-Financial corporations and Households (S.11 and S.14 and S.15) 109063
2253 Households of which sole proprietors and unincorporated partnerships (SP/UP) 40473

TIME_PERIOD

Code
MIR |>
  group_by(TIME_PERIOD) |>
  summarise(Nobs = n()) |>
  arrange(desc(TIME_PERIOD)) |>
  print_table_conditional()

Structure

BS_ITEM, MATURITY_ORIG, AMOUNT_CAT

Code
MIR |>
  group_by(BS_ITEM, Bs_item, MATURITY_NOT_IRATE, Maturity_not_irate, AMOUNT_CAT, Amount_cat) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()

BS_ITEM, MATURITY_ORIG

Code
MIR |>
  group_by(BS_ITEM, Bs_item, MATURITY_NOT_IRATE, Maturity_not_irate) |>
  summarise(Nobs = n()) |>
  arrange(-Nobs) |>
  print_table_conditional()

Composite interest rates - corporations, households

Code
MIR |>
  filter(KEY %in% c("MIR.M.U2.B.A2I.AM.R.A.2240.EUR.N",
                    "MIR.M.U2.B.A2C.AM.R.A.2250.EUR.N")) |>
  month_to_date() |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.9),
        legend.title = element_blank())

France

Table - All

Code
MIR |>
  filter(REF_AREA == "FR",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         # A: Total
         TIME_PERIOD == "2021-04") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  select(-TITLE_COMPL, -TITLE, -KEY) |>
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) |>
  arrange(OBS_VALUE) |>
  select(OBS_VALUE, Bs_count_sector, Bs_item, Amount_cat, Ir_bus_cov, Maturity_not_irate, everything()) |>
  print_table_conditional()

Table - MATURITY_NOT_IRATE == “A”, DATA_TYPE_MIR == “R”

Code
MIR |>
  filter(REF_AREA == "FR",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         TIME_PERIOD == "2021-04") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  select(-TITLE_COMPL, -TITLE, -KEY) |>
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) |>
  print_table_conditional()

Loans oth. than revolving loans and overdrafts - A2A

Table

Code
MIR |>
  filter(REF_AREA == "FR",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         TIME_PERIOD == "2021-04") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  select(-TITLE_COMPL, -TITLE, -KEY) |>
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) |>
  print_table_conditional()
AMOUNT_CAT Amount_cat BS_COUNT_SECTOR Bs_count_sector IR_BUS_COV Ir_bus_cov OBS_VALUE
0 Up to and including EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.31
1 Over EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.39
2 Up to and including EUR 0.25 million 2240 Non-Financial corporations (S.11) N New business 1.44
3 Over EUR 0.25 million and up to EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.14
A Total 2240 Non-Financial corporations (S.11) N New business 1.36
A Total 2240 Non-Financial corporations (S.11) P Pure new loans 1.35
A Total 2240 Non-Financial corporations (S.11) R Renegotiation 1.42
A Total 2250 Households and non-profit institutions serving households (S.14 and S.15) P Pure new loans 1.63
A Total 2250 Households and non-profit institutions serving households (S.14 and S.15) R Renegotiation 1.65

Graph

All

Code
MIR |>
  filter(REF_AREA == "FR",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("France Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

IR_BUS_COV == “N”

Code
MIR |>
  filter(REF_AREA == "FR",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         IR_BUS_COV == "N",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("France Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1),
        limits = c(0.005, 0.08)) +
  theme(legend.position = c(0.5, 0.9),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

A2AC - Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees

A20 - Loans

Graph

Code
MIR |>
  filter(REF_AREA == "FR",
         # A20: Loans
         BS_ITEM == "A20",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Bs_count_sector)) + 
  theme_minimal() + xlab("") + ylab("France Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.6, 0.9),
        legend.title = element_blank())

Europe

Loans oth. than revolving loans and overdrafts

Table

Code
MIR |>
  filter(REF_AREA == "U2",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         TIME_PERIOD == "2021-04") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  select(-TITLE_COMPL) |>
  print_table_conditional()
KEY AMOUNT_CAT Amount_cat BS_COUNT_SECTOR Bs_count_sector IR_BUS_COV Ir_bus_cov OBS_VALUE OBS_STATUS Obs_status TITLE
MIR.M.U2.B.A2A.A.R.0.2240.EUR.N 0 Up to and including EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.79 A Normal value Bank interest rates - loans to corporations of up to EUR 1M (new business)
MIR.M.U2.B.A2A.A.R.1.2240.EUR.N 1 Over EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.33 A Normal value Bank interest rates - loans to corporations of over EUR 1M (new business)
MIR.M.U2.B.A2A.A.R.2.2240.EUR.N 2 Up to and including EUR 0.25 million 2240 Non-Financial corporations (S.11) N New business 2.00 A Normal value Bank interest rates - loans to corporations of up to EUR 0.25M (new business)
MIR.M.U2.B.A2A.A.R.3.2240.EUR.N 3 Over EUR 0.25 million and up to EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.48 A Normal value Bank interest rates - loans to corporations of over EUR .25M & up to EUR 1M (new business)
MIR.M.U2.B.A2A.A.R.A.2240.EUR.N A Total 2240 Non-Financial corporations (S.11) N New business 1.47 A Normal value Bank interest rates - loans to corporations (new business)
MIR.M.U2.B.A2A.A.R.A.2240.EUR.P A Total 2240 Non-Financial corporations (S.11) P Pure new loans 1.43 A Normal value Bank interest rates - loans to corporations (pure new loans)
MIR.M.U2.B.A2A.A.R.A.2240.EUR.R A Total 2240 Non-Financial corporations (S.11) R Renegotiation 1.64 E Estimated value Bank interest rates - loans to corporations (renegotiations)
MIR.M.U2.B.A2A.A.R.A.2250.EUR.P A Total 2250 Households and non-profit institutions serving households (S.14 and S.15) P Pure new loans 2.14 A Normal value Bank interest rates - loans to households (pure new loans)

Graph

All

Code
MIR |>
  filter(REF_AREA == "U2",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Euro Area Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

2010-

Code
MIR |>
  filter(REF_AREA == "U2",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  filter(date >= as.Date("2010-01-01")) |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Germany Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.72),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

2015-

Code
MIR |>
  filter(REF_AREA == "U2",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  filter(date >= as.Date("2015-01-01")) |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Germany Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

Germany

Loans oth. than revolving loans and overdrafts

Table

Code
MIR |>
  filter(REF_AREA == "DE",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         TIME_PERIOD == "2021-04") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  select(-TITLE_COMPL) |>
  print_table_conditional()
KEY AMOUNT_CAT Amount_cat BS_COUNT_SECTOR Bs_count_sector IR_BUS_COV Ir_bus_cov OBS_VALUE TITLE
MIR.M.DE.B.A2A.A.R.0.2240.EUR.N 0 Up to and including EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.90 Bank interest rates - loans to corporations of up to EUR 1M (new business)
MIR.M.DE.B.A2A.A.R.1.2240.EUR.N 1 Over EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.41 Bank interest rates - loans to corporations of over EUR 1M (new business)
MIR.M.DE.B.A2A.A.R.2.2240.EUR.N 2 Up to and including EUR 0.25 million 2240 Non-Financial corporations (S.11) N New business 2.05 Bank interest rates - loans to corporations of up to EUR 0.25M (new business)
MIR.M.DE.B.A2A.A.R.3.2240.EUR.N 3 Over EUR 0.25 million and up to EUR 1 million 2240 Non-Financial corporations (S.11) N New business 1.65 Bank interest rates - loans to corporations of over EUR .25M & up to EUR 1M (new business)
MIR.M.DE.B.A2A.A.R.A.2240.EUR.N A Total 2240 Non-Financial corporations (S.11) N New business 1.52 Bank interest rates - loans to corporations (new business)
MIR.M.DE.B.A2A.A.R.A.2240.EUR.P A Total 2240 Non-Financial corporations (S.11) P Pure new loans 1.50 Bank interest rates - loans to corporations (pure new loans)
MIR.M.DE.B.A2A.A.R.A.2240.EUR.R A Total 2240 Non-Financial corporations (S.11) R Renegotiation 1.55 Bank interest rates - loans to corporations (renegotiations)
MIR.M.DE.B.A2A.A.R.A.2250.EUR.P A Total 2250 Households and non-profit institutions serving households (S.14 and S.15) P Pure new loans 2.11 Bank interest rates - loans to households (pure new loans)
MIR.M.DE.B.A2A.A.R.A.2250.EUR.R A Total 2250 Households and non-profit institutions serving households (S.14 and S.15) R Renegotiation 2.44 Bank interest rates - loans to households (renegotiations)

Graph

All

Code
MIR |>
  filter(REF_AREA == "DE",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Germany Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

2010-

Code
MIR |>
  filter(REF_AREA == "DE",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  filter(date >= as.Date("2010-01-01")) |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Germany Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

2015-

Code
MIR |>
  filter(REF_AREA == "DE",
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2A",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(TITLE = gsub("Bank interest rates - loans to", "", TITLE),
         TITLE = gsub("- Germany", "", TITLE)) |>
  month_to_date() |>
  filter(date >= as.Date("2015-01-01")) |>
  ggplot() + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = TITLE)) + 
  theme_minimal() + xlab("") + ylab("Germany Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.65, 0.8),
        legend.title = element_blank(),
        legend.text = element_text(size = 8),
        legend.key.size = unit(0.9, 'lines'))

France

2015-

Code
MIR |>
  filter(REF_AREA %in% c("FR"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM %in% c("A2C", "A20"),
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250") |>
  month_to_date() |>
  filter(date >= as.Date("2015-01-01")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = paste0(BS_ITEM, " - ", Bs_item, "\n", Ir_bus_cov))) + 
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.5, 0.85),
        legend.title = element_blank())

France, Germany, Italy

A2C / A20

All

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM %in% c("A2C", "A20"),
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250") |>
  month_to_date() |>
  arrange(desc(date)) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = paste0(Bs_item, IR_BUS_COV))) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.8, 0.2),
        legend.title = element_blank())

2010

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM %in% c("A2C", "A20"),
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250") |>
  month_to_date() |>
  filter(date >= as.Date("2010-01-01")) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = paste0(BS_ITEM, " - ", Ir_bus_cov))) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.2, 0.2),
        legend.title = element_blank())

2015-

All

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM %in% c("A2C", "A20"),
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250") |>
  month_to_date() |>
  filter(date >= as.Date("2015-01-01")) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = paste0(BS_ITEM, " - ", Ir_bus_cov))) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.5, 0.85),
        legend.title = element_blank())

Pure new loans

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM %in% c("A2C", "A20"),
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250",
         IR_BUS_COV %in% c("N", "O")) |>
  month_to_date() |>
  filter(date >= as.Date("2015-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Loans to Households (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = paste0(BS_ITEM, " - ", Ir_bus_cov))) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.5, 0.85),
        legend.title = element_blank())

A20 - Loans

Loans to Corporations (2240 = Corporations)

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A20 - Loans 
         BS_ITEM == "A20",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2240") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Loans to corporations (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

Loans to Households (2250)

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM == "A20",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         BS_COUNT_SECTOR == "2250") |>
  month_to_date() %>%
  select_if(~n_distinct(.) > 1) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Loans to households (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

A2C - Lending for house purchase excluding revolving

All

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2C: Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt
         BS_ITEM == "A2C",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         # N: New business
         IR_BUS_COV == "N") |>
  month_to_date() |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

2010

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A2C",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R",
         # N: New business
         IR_BUS_COV == "N") |>
  month_to_date() |>
  filter(date >= as.Date("2010-01-01")) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase excluding revolving (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1))

A22 - Lending for house purchase

Estonia, Lithuania, Portugal, Latvia

Code
MIR |>
  filter(REF_AREA %in% c("EE", "LT", "LV", "PT"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  filter(date >= as.Date("2018-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100,
         color = ifelse(REF_AREA == "FR", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(4) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1))

France, Europe, Belgium, Germany, Netherlands

Code
MIR |>
  filter(REF_AREA %in% c("FR", "BE", "DE", "NL"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) |>
  month_to_date() |>
  filter(date >= as.Date("2018-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(4) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .2),
                     labels = percent_format(accuracy = .1))

France, Germany, Italy, Spain, Netherlands

All

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT", "ES", "NL"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100,
         color = ifelse(REF_AREA == "FR", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(5) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

2018-

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT", "ES", "NL"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  filter(date >= as.Date("2018-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100,
         color = ifelse(REF_AREA == "FR", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(5) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1))

Estonia, Lithuania, Portugal, Finland, Spain

Code
MIR |>
  filter(REF_AREA %in% c("EE", "LT", "LV", "PT", "FI", "ES"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  filter(date >= as.Date("2018-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100,
         color = ifelse(REF_AREA == "FR", color2, color)) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .5),
                     labels = percent_format(accuracy = .1))

France, Europe, Belgium, Germany, Netherlands

Code
MIR |>
  filter(REF_AREA %in% c("FR", "U2", "BE", "DE", "NL"),
         # A22: Lending for house purchase
         BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) |>
  month_to_date() |>
  filter(date >= as.Date("2018-01-01")) |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Lending for house purchase, Old loans (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(5) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, .2),
                     labels = percent_format(accuracy = .1))

Credit for consumption and other lending - A25

All

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A25",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Credit for consumption and other lending (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 2) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

2017-

Code
MIR |>
  filter(REF_AREA %in% c("FR", "DE", "IT"),
         # A2A: Loans oth. than revolving loans and overdrafts, convenience and ext. CC debt
         BS_ITEM == "A25",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") |>
  month_to_date() |>
  arrange(date) |>
  left_join(colors, by = c("Ref_area" = "country")) |>
  mutate(OBS_VALUE = OBS_VALUE/100) |>
  filter(date >= as.Date("2017-01-01")) |>
  ggplot() + theme_minimal() + xlab("") + ylab("Credit for consumption and other lending (%)") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2100, 1) |> paste0("-01-01") |> as.Date(),
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1))

More info…

Data on interest rates

source dataset Title .html .rData
bdf MIR Taux d'intérêt - Zone euro 2026-08-11 2026-08-10
ecb MIR MFI Interest Rate Statistics 2026-08-12 2026-08-11
bdf FM Marché financier, taux 2026-08-11 2026-08-10
bdf MIR1 Taux d'intérêt - France 2026-08-11 2026-08-10
bis CBPOL_D Policy Rates, Daily 2026-08-11 2026-08-01
bis CBPOL_M Policy Rates, Monthly 2026-08-11 2026-07-25
ecb FM Financial market data 2026-08-12 2026-08-11
eurostat ei_mfir_m Interest rates - monthly data 2026-08-11 2026-08-11
eurostat irt_lt_mcby_d EMU convergence criterion series - daily data 2026-08-11 2026-08-02
eurostat irt_st_m Money market interest rates - monthly data 2026-08-11 2026-08-11
fred r Interest Rates 2026-08-11 2026-08-11
oecd MEI Main Economic Indicators 2026-08-11 2026-08-02
oecd MEI_FIN Monthly Monetary and Financial Statistics (MEI) 2026-08-11 2026-08-02
wdi FR.INR.DPST Deposit interest rate (%) 2026-08-11 2026-08-11
wdi FR.INR.LEND Lending interest rate (%) 2026-08-11 2026-08-11
wdi FR.INR.RINR Real interest rate (%) 2026-08-11 2026-08-11

Data on monetary policy

source dataset Title .html .rData
bdf MIR Taux d'intérêt - Zone euro 2026-08-11 2026-08-10
ecb MIR MFI Interest Rate Statistics 2026-08-12 2026-08-11
bdf FM Marché financier, taux 2026-08-11 2026-08-10
bdf MIR1 Taux d'intérêt - France 2026-08-11 2026-08-10
bis CBPOL Policy Rates, Daily 2026-08-11 2026-07-25
ecb BSI Balance Sheet Items 2026-08-12 2026-08-11
ecb BSI_PUB Balance Sheet Items - Published series 2026-08-12 2026-08-11
ecb FM Financial market data 2026-08-12 2026-08-11
ecb ILM Internal Liquidity Management 2026-08-12 2026-08-11
ecb ILM_PUB Internal Liquidity Management - Published series 2026-08-12 2026-08-11
ecb RAI Risk Assessment Indicators 2026-08-12 2026-08-11
ecb SUP Supervisory Banking Statistics 2026-08-12 2026-08-12
ecb YC Financial market data - yield curve 2026-08-12 2026-08-12
ecb YC_PUB Financial market data - yield curve - Published series 2026-08-12 2026-08-12
ecb liq_daily Daily Liquidity 2026-08-12 2026-08-12
eurostat ei_mfir_m Interest rates - monthly data 2026-08-11 2026-08-11
eurostat irt_st_m Money market interest rates - monthly data 2026-08-11 2026-08-11
fred r Interest Rates 2026-08-11 2026-08-11
oecd MEI Main Economic Indicators 2026-08-11 2026-08-02
oecd MEI_FIN Monthly Monetary and Financial Statistics (MEI) 2026-08-11 2026-08-02