MFI Interest Rate Statistics

Data - ECB

Info

source dataset Title .html .rData
ecb MIR MFI Interest Rate Statistics 2025-12-13 2025-08-29

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
2025-12-19

Last

Code
MIR %>%
  group_by(TIME_PERIOD) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(TIME_PERIOD)) %>%
  head(2) %>%
  print_table_conditional()
TIME_PERIOD Nobs
2025-06 7204
2025-05 7213

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 413075
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 272071
L22 Deposits with agreed maturity 237187
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 102125
A20 Loans 94512
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 91533
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 73946
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 41933
A22 Lending for house purchase 41723
A25 Credit for consumption and other lending 41350
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 33218
L21 Overnight deposits 26148
L23 Deposits redeemable at notice 24417
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 23675
L24 Repurchase agreements 22177
A2Z1 Revolving loans and overdrafts 13402
A2Z3 Extended credit 12738
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)) 9903
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 4954

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 409990
F Up to 1 year 182317
K Over 1 year 143416
I Over 1 and up to 5 years 110846
J Over 5 years 92024
P Over 10 years 73789
O Over 5 and up to 10 years 73142
D Up to 3 months 69252
H Over 2 years 61870
Y Period of initial rate fixation below 1 year and original maturity over 1 year 58087
Q Over 3 months and up to 1 year 57461
S Over 3 and up to 5 years 54987
R Over 1 and up to 3 years 54617
L Up to two years 47882
G Over 1 and up to 2 years 29847
AM Total calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 9904
E Over 3 months 8328
KF Original maturity over 1 year and remaining maturity up to 1 year 8202
HL Original maturity over 2 years and remaining maturity up to 2 years 8201
HHL Original maturity over 2 years, remaining maturity over 2 years and interest rate reset within the next 24 months 8011
KKF Original maturity over 1 year, remaining maturity over 1 year and interest rate reset within the next 12 months 8011
KM Over 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 4953
FM Up to 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 4950

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

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 1056199
1 Over EUR 1 million 176671
2 Up to and including EUR 0.25 million 144496
3 Over EUR 0.25 million and up to EUR 1 million 142979
0 Up to and including EUR 1 million 59742

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

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 1285556
CZK Czech koruna 42187
HUF Hungarian forint 41515
RON Romanian leu 40976
SEK Swedish krona 40279
DKK Danish krone 36970
PLN Polish zloty 31471
BGN Bulgarian lev 24049
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 1262673
O Outstanding amount 256359
R Renegotiation 33641
P Pure new loans 27414

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 1350100
S Summed through period 223041
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) 392083
HR2 Croatian National Bank 55123
SI2 Bank of Slovenia 51906
SK2 National Bank of Slovakia 51091
LV2 Bank of Latvia 50723
DE2 Deutsche Bundesbank (Germany) 49129
LT2 Bank of Lithuania 49027
IT2 Banca d` Italia (Italy) 48886
LU2 Banque centrale du Luxembourg 48868
ES2 Banco de Espana (Spain) 48787
AT2 Oesterreichische Nationalbank (Austria) 48729
GR2 Bank of Greece (Greece) 48018
FR2 Banque de France (France) 47839
EE2 Bank of Estonia 46604
MT2 Central Bank of Malta 46529
FI2 Bank of Finland (Finland) 46196
NL2 De Nederlandsche Bank (Netherlands) 43795
BE2 Banque Nationale de Belgique (Belgium) 42858
CZ2 Czech National Bank 42187
PT2 Banco de Portugal (Portugal) 41867
HU2 National Bank of Hungary 41515
RO2 National Bank of Romania 41198
SE2 Sveriges Riksbank (Sweden) 40279
DK2 Danmarks Nationalbank (Denmark) 36970
CY2 Central Bank of Cyprus 32452
PL2 Bank of Poland 31675
IE2 Central Bank of Ireland (Ireland) 31482
BG2 Bulgarian National Bank 24271

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 392083
HR Croatia 55123
SI Slovenia 51906
SK Slovakia 51091
LV Latvia 50723
DE Germany 49129
LT Lithuania 49027
IT Italy 48886
LU Luxembourg 48868
ES Spain 48787
AT Austria 48729
GR Greece 48018
FR France 47839
EE Estonia 46604
MT Malta 46529
FI Finland 46196
NL Netherlands 43795
BE Belgium 42858
CZ Czech Republic 42187
PT Portugal 41867
HU Hungary 41515
RO Romania 41198
SE Sweden 40279
DK Denmark 36970
CY Cyprus 32452
PL Poland 31675
IE Ireland 31482
BG Bulgaria 24271

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) - euro area
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) - euro area
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) - euro area
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) - euro area
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) - euro area
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) - euro area
MIR.M.U2.B.A2A.A.R.A.2240.EUR.R A 2240 R 1.64 E Bank interest rates - loans to corporations (renegotiations) - euro area
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) - euro area

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) - Germany
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) - Germany
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) - Germany
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) - Germany
MIR.M.DE.B.A2A.A.R.A.2240.EUR.N A 2240 N 1.52 Bank interest rates - loans to corporations (new business) - Germany
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) - Germany
MIR.M.DE.B.A2A.A.R.A.2240.EUR.R A 2240 R 1.55 Bank interest rates - loans to corporations (renegotiations) - Germany
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) - Germany
MIR.M.DE.B.A2A.A.R.A.2250.EUR.R A 2250 R 2.44 Bank interest rates - loans to households (renegotiations) - Germany

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

Table

Code
MIR %>%
  filter(BS_ITEM == "A22",
         # A: Total
         MATURITY_NOT_IRATE == "A",
         # R: Rate
         DATA_TYPE_MIR == "R") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  group_by(REF_AREA, Ref_area) %>%
  filter(TIME_PERIOD == max(TIME_PERIOD) | TIME_PERIOD == "2022-01") %>%
  select(REF_AREA, Ref_area, TIME_PERIOD, OBS_VALUE) %>%
  spread(TIME_PERIOD, OBS_VALUE) %>%
  ungroup %>%
  mutate(change = .[[4]] - .[[3]]) %>%
  arrange(-change) %>%
  print_table_conditional
REF_AREA Ref_area 2022-01 2025-06 change
PL Poland 3.74 7.38 3.64
PT Portugal 0.83 3.39 2.56
FI Finland 0.79 2.99 2.20
LT Lithuania 1.94 4.11 2.17
EE Estonia 2.01 4.17 2.16
LV Latvia 2.30 4.43 2.13
ES Spain 1.10 2.96 1.86
DK Denmark 1.64 3.48 1.84
CY Cyprus 2.03 3.75 1.72
SK Slovakia 1.30 3.00 1.70
SE Sweden 1.51 3.05 1.54
HU Hungary 4.63 6.12 1.49
AT Austria 1.37 2.80 1.43
IT Italy 1.59 2.71 1.12
SI Slovenia 2.02 3.12 1.10
LU Luxembourg 1.56 2.65 1.09
IE Ireland 2.47 3.46 0.99
U2 Euro area (Member States and Institutions of the Euro Area) changing composition 1.61 2.40 0.79
BE Belgium 1.73 2.34 0.61
FR France 1.43 1.89 0.46
DE Germany 1.73 2.15 0.42
NL Netherlands 2.32 2.69 0.37
HR Croatia 3.09 3.06 -0.03
BG Bulgaria 2.98 2.74 -0.24
MT Malta 2.80 2.54 -0.26
CZ Czech Republic NA 3.70 NA
GR Greece NA NA NA
RO Romania 4.66 NA NA

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

Data on monetary policy

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