MFI Interest Rate Statistics

Data - ECB

Info

source dataset Title .html .rData
ecb MIR MFI Interest Rate Statistics 2026-07-23 2026-07-22

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-07-24

Last

Code
MIR %>%
  group_by(TIME_PERIOD) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(TIME_PERIOD)) %>%
  head(2) %>%
  print_table_conditional()
TIME_PERIOD Nobs
2026-05 7235
2026-04 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 441639
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 288897
L22 Deposits with agreed maturity 252505
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 109695
A20 Loans 102512
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 97980
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 79538
A22 Lending for house purchase 44413
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 44238
A25 Credit for consumption and other lending 43906
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 34998
L21 Overnight deposits 27691
L23 Deposits redeemable at notice 26089
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 25045
L24 Repurchase agreements 23780
A2Z1 Revolving loans and overdrafts 14428
A2Z3 Extended credit 13720
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)) 10375
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 5190

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 441115
F Up to 1 year 193707
K Over 1 year 152908
I Over 1 and up to 5 years 117888
J Over 5 years 97891
P Over 10 years 78298
O Over 5 and up to 10 years 77748
D Up to 3 months 73763
H Over 2 years 66085
Y Period of initial rate fixation below 1 year and original maturity over 1 year 61208
Q Over 3 months and up to 1 year 61085
S Over 3 and up to 5 years 58562
R Over 1 and up to 3 years 58139
L Up to two years 51004
G Over 1 and up to 2 years 31718
AM Total calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 10376
KF Original maturity over 1 year and remaining maturity up to 1 year 9072
HL Original maturity over 2 years and remaining maturity up to 2 years 9071
E Over 3 months 8908
HHL Original maturity over 2 years, remaining maturity over 2 years and interest rate reset within the next 24 months 8859
KKF Original maturity over 1 year, remaining maturity over 1 year and interest rate reset within the next 12 months 8859
KM Over 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5189
FM Up to 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 5186

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

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 1129004
1 Over EUR 1 million 187997
2 Up to and including EUR 0.25 million 153719
3 Over EUR 0.25 million and up to EUR 1 million 152119
0 Up to and including EUR 1 million 63800

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

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 1377109
CZK Czech koruna 44684
HUF Hungarian forint 44012
RON Romanian leu 43473
SEK Swedish krona 42556
DKK Danish krone 39236
PLN Polish zloty 33338
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 1343905
O Outstanding amount 274282
R Renegotiation 37302
P Pure new loans 31150

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 1441876
S Summed through period 237817
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) 408682
HR2 Croatian National Bank 57620
SI2 Bank of Slovenia 54403
BG2 Bulgarian National Bank 53650
SK2 National Bank of Slovakia 53588
LV2 Bank of Latvia 53220
DE2 Deutsche Bundesbank (Germany) 51626
LT2 Bank of Lithuania 51524
IT2 Banca d` Italia (Italy) 51383
LU2 Banque centrale du Luxembourg 51365
ES2 Banco de Espana (Spain) 51284
AT2 Oesterreichische Nationalbank (Austria) 51226
GR2 Bank of Greece (Greece) 50374
FR2 Banque de France (France) 50270
MT2 Central Bank of Malta 49026
EE2 Bank of Estonia 48835
FI2 Bank of Finland (Finland) 48540
NL2 De Nederlandsche Bank (Netherlands) 46017
BE2 Banque Nationale de Belgique (Belgium) 45280
CZ2 Czech National Bank 44684
PT2 Banco de Portugal (Portugal) 44013
HU2 National Bank of Hungary 44012
RO2 National Bank of Romania 43706
SE2 Sveriges Riksbank (Sweden) 42556
DK2 Danmarks Nationalbank (Denmark) 39236
CY2 Central Bank of Cyprus 33975
PL2 Bank of Poland 33542
IE2 Central Bank of Ireland (Ireland) 33002

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 408682
HR Croatia 57620
SI Slovenia 54403
BG Bulgaria 53650
SK Slovakia 53588
LV Latvia 53220
DE Germany 51626
LT Lithuania 51524
IT Italy 51383
LU Luxembourg 51365
ES Spain 51284
AT Austria 51226
GR Greece 50374
FR France 50270
MT Malta 49026
EE Estonia 48835
FI Finland 48540
NL Netherlands 46017
BE Belgium 45280
CZ Czech Republic 44684
PT Portugal 44013
HU Hungary 44012
RO Romania 43706
SE Sweden 42556
DK Denmark 39236
CY Cyprus 33975
PL Poland 33542
IE Ireland 33002

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, 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 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, 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") %>%
  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 Taux d'intérêt - Zone euro 2026-07-22 2026-07-22
ecb MIR MFI Interest Rate Statistics 2026-07-23 2026-07-22
bdf FM Marché financier, taux 2026-07-22 2026-07-22
bdf MIR1 Taux d'intérêt - France 2026-07-23 2026-07-23
bis CBPOL_D Policy Rates, Daily 2026-07-18 2025-08-20
bis CBPOL_M Policy Rates, Monthly 2026-07-22 2024-04-19
ecb FM Financial market data 2026-07-23 2026-07-22
eurostat ei_mfir_m Interest rates - monthly data 2026-07-23 2026-07-23
eurostat irt_lt_mcby_d EMU convergence criterion series - daily data 2026-07-23 2025-07-24
eurostat irt_st_m Money market interest rates - monthly data 2026-07-23 2026-07-23
fred r Interest Rates 2026-07-22 2026-07-22
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-07-22
wdi FR.INR.LEND Lending interest rate (%) 2026-07-22 2026-07-22
wdi FR.INR.RINR Real interest rate (%) 2026-01-11 2026-07-22

Data on monetary policy

source dataset Title .html .rData
bdf MIR Taux d'intérêt - Zone euro 2026-07-22 2026-07-22
ecb MIR MFI Interest Rate Statistics 2026-07-23 2026-07-22
bdf FM Marché financier, taux 2026-07-22 2026-07-22
bdf MIR1 Taux d'intérêt - France 2026-07-23 2026-07-23
bis CBPOL Policy Rates, Daily 2026-07-18 2026-07-22
ecb BSI Balance Sheet Items 2026-07-23 2026-07-22
ecb BSI_PUB Balance Sheet Items - Published series 2026-07-23 2026-07-22
ecb FM Financial market data 2026-07-23 2026-07-22
ecb ILM Internal Liquidity Management 2026-07-23 2026-07-22
ecb ILM_PUB Internal Liquidity Management - Published series 2026-07-23 2026-07-22
ecb RAI Risk Assessment Indicators 2026-07-23 2026-07-23
ecb SUP Supervisory Banking Statistics 2026-07-23 2026-07-23
ecb YC Financial market data - yield curve 2026-07-23 2026-07-23
ecb YC_PUB Financial market data - yield curve - Published series 2026-07-23 2026-07-23
ecb liq_daily Daily Liquidity 2026-07-23 2026-07-23
eurostat ei_mfir_m Interest rates - monthly data 2026-07-23 2026-07-23
eurostat irt_st_m Money market interest rates - monthly data 2026-07-23 2026-07-23
fred r Interest Rates 2026-07-22 2026-07-22
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