MFI Interest Rate Statistics - MIR

Data - ECB

Info

Last observation: M: 2026-06 (N = 6626)

First observation: M: 1994-03 (N = 2)

Last data update: 28 août 2026, 16:09. Last compile: 28 août 2026, 17:24

Structure

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

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))