MFI Interest Rate Statistics

Data - ECB

Info

source dataset Title .html .rData
ecb MIR MFI Interest Rate Statistics 2026-05-28 2026-05-28

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-05-29

Last

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

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 437689
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 286201
L22 Deposits with agreed maturity 250750
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 108696
A20 Loans 101420
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 97154
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 78866
A22 Lending for house purchase 44087
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 43814
A25 Credit for consumption and other lending 43590
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 34670
L21 Overnight deposits 27501
L23 Deposits redeemable at notice 25905
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 24881
L24 Repurchase agreements 23606
A2Z1 Revolving loans and overdrafts 14292
A2Z3 Extended credit 13592
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)) 10287
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 5146

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 437073
F Up to 1 year 192222
K Over 1 year 151690
I Over 1 and up to 5 years 117002
J Over 5 years 97173
P Over 10 years 77616
O Over 5 and up to 10 years 77049
D Up to 3 months 73089
H Over 2 years 65562
Y Period of initial rate fixation below 1 year and original maturity over 1 year 60628
Q Over 3 months and up to 1 year 60531
S Over 3 and up to 5 years 58006
R Over 1 and up to 3 years 57594
L Up to two years 50648
G Over 1 and up to 2 years 31504
AM Total calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 10288
KF Original maturity over 1 year and remaining maturity up to 1 year 8940
HL Original maturity over 2 years and remaining maturity up to 2 years 8939
E Over 3 months 8844
HHL Original maturity over 2 years, remaining maturity over 2 years and interest rate reset within the next 24 months 8731
KKF Original maturity over 1 year, remaining maturity over 1 year and interest rate reset within the next 12 months 8731
KM Over 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5145
FM Up to 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5142

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) 1110754
B Business volume (outstanding amount / new business) 235679
I Interest rate component of euro area month-to-month level change (Bennet binary index on interest rates) 51566
J Weight component of euro area month-to-month level change (Bennet binary index on weights) 51566
M Index on interest rates (Bennet chain index) 51566
N Index on weights (Bennet chain index) 51566
O Accumulated changes on interest rates 51566
V Coefficient of variation 51566
C Annual percentage rate of charge (APRC) 16318

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 1119477
1 Over EUR 1 million 186370
2 Up to and including EUR 0.25 million 152274
3 Over EUR 0.25 million and up to EUR 1 million 150697
0 Up to and including EUR 1 million 63329

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) 910325
2250 Households and non-profit institutions serving households (S.14 and S.15) 614058
2230 Non-Financial corporations and Households (S.11 and S.14 and S.15) 107852
2253 Households of which sole proprietors and unincorporated partnerships (SP/UP) 39912

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 1365141
CZK Czech koruna 44230
HUF Hungarian forint 43558
RON Romanian leu 43019
SEK Swedish krona 42142
DKK Danish krone 38824
PLN Polish zloty 33002
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 1332829
O Outstanding amount 271940
R Renegotiation 36766
P Pure new loans 30612

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 1429522
S Summed through period 235679
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) 405664
HR2 Croatian National Bank 57166
SI2 Bank of Slovenia 53949
BG2 Bulgarian National Bank 53196
SK2 National Bank of Slovakia 53134
LV2 Bank of Latvia 52766
DE2 Deutsche Bundesbank (Germany) 51172
LT2 Bank of Lithuania 51070
IT2 Banca d` Italia (Italy) 50929
LU2 Banque centrale du Luxembourg 50911
ES2 Banco de Espana (Spain) 50830
AT2 Oesterreichische Nationalbank (Austria) 50772
GR2 Bank of Greece (Greece) 49945
FR2 Banque de France (France) 49828
MT2 Central Bank of Malta 48572
EE2 Bank of Estonia 48434
FI2 Bank of Finland (Finland) 48101
NL2 De Nederlandsche Bank (Netherlands) 45613
BE2 Banque Nationale de Belgique (Belgium) 44838
CZ2 Czech National Bank 44230
PT2 Banco de Portugal (Portugal) 43623
HU2 National Bank of Hungary 43558
RO2 National Bank of Romania 43250
SE2 Sveriges Riksbank (Sweden) 42142
DK2 Danmarks Nationalbank (Denmark) 38824
CY2 Central Bank of Cyprus 33697
PL2 Bank of Poland 33206
IE2 Central Bank of Ireland (Ireland) 32727

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 405664
HR Croatia 57166
SI Slovenia 53949
BG Bulgaria 53196
SK Slovakia 53134
LV Latvia 52766
DE Germany 51172
LT Lithuania 51070
IT Italy 50929
LU Luxembourg 50911
ES Spain 50830
AT Austria 50772
GR Greece 49945
FR France 49828
MT Malta 48572
EE Estonia 48434
FI Finland 48101
NL Netherlands 45613
BE Belgium 44838
CZ Czech Republic 44230
PT Portugal 43623
HU Hungary 43558
RO Romania 43250
SE Sweden 42142
DK Denmark 38824
CY Cyprus 33697
PL Poland 33206
IE Ireland 32727

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-05-28 2026-05-28
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-05-28 2024-04-19
ecb FM Financial market data 2026-05-25 2026-05-25
eurostat ei_mfir_m Interest rates - monthly data 2026-05-24 2026-04-26
eurostat irt_lt_mcby_d EMU convergence criterion series - daily data 2026-05-24 2025-07-24
eurostat irt_st_m Money market interest rates - monthly data 2026-05-24 2026-04-26
fred r Interest Rates 2026-05-24 2026-05-28
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-05-28
wdi FR.INR.LEND Lending interest rate (%) 2026-03-24 2026-05-28
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-05-28 2026-05-28
bdf FM NA NA NA
bdf MIR1 NA NA NA
bis CBPOL Policy Rates, Daily 2026-04-08 2026-05-28
ecb BSI Balance Sheet Items 2026-05-25 2026-05-22
ecb BSI_PUB NA NA NA
ecb FM Financial market data 2026-05-25 2026-05-25
ecb ILM Internal Liquidity Management 2026-05-28 2026-05-28
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-03-25 2025-06-06
eurostat ei_mfir_m Interest rates - monthly data 2026-05-24 2026-04-26
eurostat irt_st_m Money market interest rates - monthly data 2026-05-24 2026-04-26
fred r Interest Rates 2026-05-24 2026-05-28
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