MFI Interest Rate Statistics

Data - ECB

Info

source dataset Title .html .rData
ecb MIR MFI Interest Rate Statistics 2026-06-03 2026-06-04

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-06-21

Last

Code
MIR %>%
  group_by(TIME_PERIOD) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(TIME_PERIOD)) %>%
  head(2) %>%
  print_table_conditional()
TIME_PERIOD Nobs
2026-04 7240
2026-03 7248

BS_ITEM

Javascript

Code
MIR %>%
  left_join(BS_ITEM ,  by = "BS_ITEM") %>%
  group_by(BS_ITEM, Bs_item) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional_10()

Flat

Code
MIR %>%
  left_join(BS_ITEM ,  by = "BS_ITEM") %>%
  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 439669
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 287548
L22 Deposits with agreed maturity 251628
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 109195
A20 Loans 101966
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 97567
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 79202
A22 Lending for house purchase 44250
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 44026
A25 Credit for consumption and other lending 43748
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 34835
L21 Overnight deposits 27596
L23 Deposits redeemable at notice 25997
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 24963
L24 Repurchase agreements 23696
A2Z1 Revolving loans and overdrafts 14360
A2Z3 Extended credit 13656
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)) 10331
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 5168

MATURITY_NOT_IRATE

Code
MIR %>%
  left_join(MATURITY_NOT_IRATE, by = "MATURITY_NOT_IRATE") %>%
  group_by(MATURITY_NOT_IRATE, Maturity_not_irate) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
MATURITY_NOT_IRATE Maturity_not_irate Nobs
A Total 439097
F Up to 1 year 192965
K Over 1 year 152300
I Over 1 and up to 5 years 117448
J Over 5 years 97533
P Over 10 years 77956
O Over 5 and up to 10 years 77399
D Up to 3 months 73426
H Over 2 years 65824
Y Period of initial rate fixation below 1 year and original maturity over 1 year 60918
Q Over 3 months and up to 1 year 60809
S Over 3 and up to 5 years 58283
R Over 1 and up to 3 years 57867
L Up to two years 50826
G Over 1 and up to 2 years 31610
AM Total calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 10332
KF Original maturity over 1 year and remaining maturity up to 1 year 9006
HL Original maturity over 2 years and remaining maturity up to 2 years 9005
E Over 3 months 8876
HHL Original maturity over 2 years, remaining maturity over 2 years and interest rate reset within the next 24 months 8795
KKF Original maturity over 1 year, remaining maturity over 1 year and interest rate reset within the next 12 months 8795
KM Over 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5167
FM Up to 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5164

DATA_TYPE_MIR

Code
MIR %>%
  left_join(DATA_TYPE_MIR,  by = "DATA_TYPE_MIR") %>%
  group_by(DATA_TYPE_MIR, Data_type_mir) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
DATA_TYPE_MIR Data_type_mir Nobs
R Annualised agreed rate (AAR) / Narrowly defined effective rate (NDER) 1115728
B Business volume (outstanding amount / new business) 236751
I Interest rate component of euro area month-to-month level change (Bennet binary index on interest rates) 51758
J Weight component of euro area month-to-month level change (Bennet binary index on weights) 51758
M Index on interest rates (Bennet chain index) 51758
N Index on weights (Bennet chain index) 51758
O Accumulated changes on interest rates 51758
V Coefficient of variation 51758
C Annual percentage rate of charge (APRC) 16374

AMOUNT_CAT

Code
MIR %>%
  left_join(AMOUNT_CAT,  by = "AMOUNT_CAT") %>%
  group_by(AMOUNT_CAT, Amount_cat) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
AMOUNT_CAT Amount_cat Nobs
A Total 1124247
1 Over EUR 1 million 187188
2 Up to and including EUR 0.25 million 152996
3 Over EUR 0.25 million and up to EUR 1 million 151406
0 Up to and including EUR 1 million 63564

BS_COUNT_SECTOR

Code
MIR %>%
  mutate(BS_COUNT_SECTOR = paste0(BS_COUNT_SECTOR)) %>%
  left_join(BS_COUNT_SECTOR ,  by = "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) 914357
2250 Households and non-profit institutions serving households (S.14 and S.15) 616685
2230 Non-Financial corporations and Households (S.11 and S.14 and S.15) 108259
2253 Households of which sole proprietors and unincorporated partnerships (SP/UP) 40100

CURRENCY_TRANS

Code
MIR %>%
  left_join(CURRENCY_TRANS ,  by = "CURRENCY_TRANS") %>%
  group_by(CURRENCY_TRANS, Currency_trans) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
CURRENCY_TRANS Currency_trans Nobs
EUR Euro 1371128
CZK Czech koruna 44457
HUF Hungarian forint 43785
RON Romanian leu 43246
SEK Swedish krona 42349
DKK Danish krone 39030
PLN Polish zloty 33175
BGN Bulgarian lev 25147
HRK Croatian kuna 19618
LVL Latvian lats 5400
LTL Lithuanian litas 4581
EEK Estonian kroon 3131
SKK Slovak koruna 2700
SIT Slovenian tolar 1404
MTL Maltese lira 250

IR_BUS_COV

Code
MIR %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  group_by(IR_BUS_COV, Ir_bus_cov) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
IR_BUS_COV Ir_bus_cov Nobs
N New business 1338374
O Outstanding amount 273112
R Renegotiation 37034
P Pure new loans 30881

COLLECTION

Code
MIR %>%
  left_join(COLLECTION ,  by = "COLLECTION") %>%
  group_by(COLLECTION, Collection) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
COLLECTION Collection Nobs
A Average of observations through period 1435704
S Summed through period 236751
E End of period 6946

SOURCE_AGENCY

Code
MIR %>%
  left_join(SOURCE_AGENCY, by = "SOURCE_AGENCY") %>%
  group_by(SOURCE_AGENCY, Source_agency) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
SOURCE_AGENCY Source_agency Nobs
4F0 European Central Bank (ECB) 407173
HR2 Croatian National Bank 57393
SI2 Bank of Slovenia 54176
BG2 Bulgarian National Bank 53423
SK2 National Bank of Slovakia 53361
LV2 Bank of Latvia 52993
DE2 Deutsche Bundesbank (Germany) 51399
LT2 Bank of Lithuania 51297
IT2 Banca d` Italia (Italy) 51156
LU2 Banque centrale du Luxembourg 51138
ES2 Banco de Espana (Spain) 51057
AT2 Oesterreichische Nationalbank (Austria) 50999
GR2 Bank of Greece (Greece) 50156
FR2 Banque de France (France) 50049
MT2 Central Bank of Malta 48799
EE2 Bank of Estonia 48636
FI2 Bank of Finland (Finland) 48322
NL2 De Nederlandsche Bank (Netherlands) 45815
BE2 Banque Nationale de Belgique (Belgium) 45062
CZ2 Czech National Bank 44457
PT2 Banco de Portugal (Portugal) 43818
HU2 National Bank of Hungary 43785
RO2 National Bank of Romania 43478
SE2 Sveriges Riksbank (Sweden) 42349
DK2 Danmarks Nationalbank (Denmark) 39030
CY2 Central Bank of Cyprus 33836
PL2 Bank of Poland 33379
IE2 Central Bank of Ireland (Ireland) 32865

REF_AREA

Code
MIR %>%
  left_join(REF_AREA ,  by = "REF_AREA") %>%
  group_by(REF_AREA, Ref_area) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
REF_AREA Ref_area Nobs
U2 Euro area (Member States and Institutions of the Euro Area) changing composition 407173
HR Croatia 57393
SI Slovenia 54176
BG Bulgaria 53423
SK Slovakia 53361
LV Latvia 52993
DE Germany 51399
LT Lithuania 51297
IT Italy 51156
LU Luxembourg 51138
ES Spain 51057
AT Austria 50999
GR Greece 50156
FR France 50049
MT Malta 48799
EE Estonia 48636
FI Finland 48322
NL Netherlands 45815
BE Belgium 45062
CZ Czech Republic 44457
PT Portugal 43818
HU Hungary 43785
RO Romania 43478
SE Sweden 42349
DK Denmark 39030
CY Cyprus 33836
PL Poland 33379
IE Ireland 32865

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 %>%
  left_join(BS_ITEM,  by = "BS_ITEM") %>%
  left_join(MATURITY_NOT_IRATE,  by = "MATURITY_NOT_IRATE") %>%
  left_join(AMOUNT_CAT,  by = "AMOUNT_CAT") %>%
  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 %>%
  left_join(BS_ITEM,  by = "BS_ITEM") %>%
  left_join(MATURITY_NOT_IRATE,  by = "MATURITY_NOT_IRATE") %>%
  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)) %>%
  left_join(BS_COUNT_SECTOR, by = "BS_COUNT_SECTOR") %>%
  left_join(AMOUNT_CAT, by = "AMOUNT_CAT") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  left_join(MATURITY_NOT_IRATE, by = "MATURITY_NOT_IRATE") %>%
  left_join(BS_ITEM ,  by = "BS_ITEM") %>%
  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)) %>%
  left_join(BS_COUNT_SECTOR, by = "BS_COUNT_SECTOR") %>%
  left_join(AMOUNT_CAT, by = "AMOUNT_CAT") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  left_join(BS_ITEM ,  by = "BS_ITEM") %>%
  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)) %>%
  left_join(BS_COUNT_SECTOR, by = "BS_COUNT_SECTOR") %>%
  left_join(AMOUNT_CAT, by = "AMOUNT_CAT") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  print_table_conditional()
AMOUNT_CAT BS_COUNT_SECTOR IR_BUS_COV OBS_VALUE Bs_count_sector Amount_cat Ir_bus_cov
0 2240 N 1.31 Non-Financial corporations (S.11) Up to and including EUR 1 million New business
1 2240 N 1.39 Non-Financial corporations (S.11) Over EUR 1 million New business
2 2240 N 1.44 Non-Financial corporations (S.11) Up to and including EUR 0.25 million New business
3 2240 N 1.14 Non-Financial corporations (S.11) Over EUR 0.25 million and up to EUR 1 million New business
A 2240 N 1.36 Non-Financial corporations (S.11) Total New business
A 2240 P 1.35 Non-Financial corporations (S.11) Total Pure new loans
A 2240 R 1.42 Non-Financial corporations (S.11) Total Renegotiation
A 2250 P 1.63 Households and non-profit institutions serving households (S.14 and S.15) Total Pure new loans
A 2250 R 1.65 Households and non-profit institutions serving households (S.14 and S.15) Total Renegotiation

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") %>%
  left_join(AMOUNT_CAT, by = "AMOUNT_CAT") %>%
  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 %>%
  left_join(AMOUNT_CAT, by = "AMOUNT_CAT") %>%
  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)) %>%
  left_join(BS_COUNT_SECTOR, by = "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 BS_COUNT_SECTOR IR_BUS_COV OBS_VALUE OBS_STATUS TITLE
MIR.M.U2.B.A2A.A.R.0.2240.EUR.N 0 2240 N 1.79 A 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 2240 N 1.33 A Bank interest rates - loans to corporations of over EUR 1M (new business)
MIR.M.U2.B.A2A.A.R.2.2240.EUR.N 2 2240 N 2.00 A 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 2240 N 1.48 A 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 2240 N 1.47 A Bank interest rates - loans to corporations (new business)
MIR.M.U2.B.A2A.A.R.A.2240.EUR.P A 2240 P 1.43 A Bank interest rates - loans to corporations (pure new loans)
MIR.M.U2.B.A2A.A.R.A.2240.EUR.R A 2240 R 1.64 E Bank interest rates - loans to corporations (renegotiations)
MIR.M.U2.B.A2A.A.R.A.2250.EUR.P A 2250 P 2.14 A 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, 2026, 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 BS_COUNT_SECTOR IR_BUS_COV OBS_VALUE TITLE
MIR.M.DE.B.A2A.A.R.0.2240.EUR.N 0 2240 N 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 2240 N 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 2240 N 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 2240 N 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 2240 N 1.52 Bank interest rates - loans to corporations (new business)
MIR.M.DE.B.A2A.A.R.A.2240.EUR.P A 2240 P 1.50 Bank interest rates - loans to corporations (pure new loans)
MIR.M.DE.B.A2A.A.R.A.2240.EUR.R A 2240 R 1.55 Bank interest rates - loans to corporations (renegotiations)
MIR.M.DE.B.A2A.A.R.A.2250.EUR.P A 2250 P 2.11 Bank interest rates - loans to households (pure new loans)
MIR.M.DE.B.A2A.A.R.A.2250.EUR.R A 2250 R 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, 2026, 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") %>%
  left_join(BS_ITEM, by = "BS_ITEM") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(BS_ITEM, by = "BS_ITEM") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(BS_ITEM, by = "BS_ITEM") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(BS_ITEM, by = "BS_ITEM") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  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")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(BS_ITEM, by = "BS_ITEM") %>%
  left_join(IR_BUS_COV, by = "IR_BUS_COV") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "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,
         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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "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,
         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") %>%
  left_join(REF_AREA, by = "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,
         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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  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 NA NA NA
ecb MIR MFI Interest Rate Statistics 2026-06-03 2026-06-04
bdf FM NA NA NA
bdf MIR1 NA NA NA
bis CBPOL_D Policy Rates, Daily 2026-04-07 2025-08-20
bis CBPOL_M Policy Rates, Monthly 2026-06-04 2024-04-19
ecb FM Financial market data 2026-06-03 2026-06-04
eurostat ei_mfir_m Interest rates - monthly data 2026-06-03 2026-04-26
eurostat irt_lt_mcby_d EMU convergence criterion series - daily data 2026-06-03 2025-07-24
eurostat irt_st_m Money market interest rates - monthly data 2026-06-03 2026-04-26
fred r Interest Rates 2026-06-04 2026-05-29
oecd MEI Main Economic Indicators 2024-04-16 2025-07-24
oecd MEI_FIN Monthly Monetary and Financial Statistics (MEI) 2024-09-15 2025-07-24
wdi FR.INR.DPST Deposit interest rate (%) 2022-09-27 2026-06-04
wdi FR.INR.LEND Lending interest rate (%) 2026-03-24 2026-06-04
wdi FR.INR.RINR NA NA NA

Data on monetary policy

source dataset Title .html .rData
bdf MIR NA NA NA
ecb MIR MFI Interest Rate Statistics 2026-06-03 2026-06-04
bdf FM NA NA NA
bdf MIR1 NA NA NA
bis CBPOL Policy Rates, Daily 2026-04-08 2026-06-04
ecb BSI Balance Sheet Items 2026-06-03 2026-05-22
ecb BSI_PUB NA NA NA
ecb FM Financial market data 2026-06-03 2026-06-04
ecb ILM Internal Liquidity Management 2026-06-03 2026-06-04
ecb ILM_PUB NA NA NA
ecb RAI NA NA NA
ecb SUP NA NA NA
ecb YC NA NA NA
ecb YC_PUB NA NA NA
ecb liq_daily Daily Liquidity 2026-06-03 2025-06-06
eurostat ei_mfir_m Interest rates - monthly data 2026-06-03 2026-04-26
eurostat irt_st_m Money market interest rates - monthly data 2026-06-03 2026-04-26
fred r Interest Rates 2026-06-04 2026-05-29
oecd MEI Main Economic Indicators 2024-04-16 2025-07-24
oecd MEI_FIN Monthly Monetary and Financial Statistics (MEI) 2024-09-15 2025-07-24