MFI Interest Rate Statistics

Data - ECB

Info

source dataset .html .RData
ecb MIR 2025-06-06 2025-06-05

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

Last

Code
MIR %>%
  group_by(TIME_PERIOD) %>%
  summarise(Nobs = n()) %>%
  arrange(desc(TIME_PERIOD)) %>%
  head(2) %>%
  print_table_conditional()
TIME_PERIOD Nobs
2025-04 7210
2025-03 7203

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 409101
A2AC Loans other than revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 269413
L22 Deposits with agreed maturity 235445
A2D Other lending excluding revolving loans and overdrafts, convenience and extended credit card debt 101137
A20 Loans 93424
A2C Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt 90701
A2B Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt 73270
A2CC Lending for house purchase excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 41517
A22 Lending for house purchase 41398
A25 Credit for consumption and other lending 41038
A2BC Loans for consumption excluding revolving loans and overdrafts, convenience and extended credit card debt with collateral and/or guarantees 32900
L21 Overnight deposits 25960
L23 Deposits redeemable at notice 24235
A2Z Revolving loans and overdrafts, convenience and extended credit card debt 23507
L24 Repurchase agreements 22009
A2Z1 Revolving loans and overdrafts 13266
A2Z3 Extended credit 12610
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)) 9819
A2I Loans (defined for cost of borrowing purposes, sum of A2A and A2Z (both related to non-financial corporations)) 4912

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 406009
F Up to 1 year 180834
K Over 1 year 142239
I Over 1 and up to 5 years 109945
J Over 5 years 91300
P Over 10 years 73094
O Over 5 and up to 10 years 72437
D Up to 3 months 68577
H Over 2 years 61345
Y Period of initial rate fixation below 1 year and original maturity over 1 year 57532
Q Over 3 months and up to 1 year 56895
S Over 3 and up to 5 years 54424
R Over 1 and up to 3 years 54060
L Up to two years 47534
G Over 1 and up to 2 years 29629
AM Total calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 9820
E Over 3 months 8264
KF Original maturity over 1 year and remaining maturity up to 1 year 8070
HL Original maturity over 2 years and remaining maturity up to 2 years 8069
HHL Original maturity over 2 years, remaining maturity over 2 years and interest rate reset within the next 24 months 7883
KKF Original maturity over 1 year, remaining maturity over 1 year and interest rate reset within the next 12 months 7883
KM Over 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 4911
FM Up to 1 year calculated by weighting the volumes with a moving average (defined for cost of borrowing purposes) 4908

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

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 1046767
1 Over EUR 1 million 175026
2 Up to and including EUR 0.25 million 143058
3 Over EUR 0.25 million and up to EUR 1 million 141552
0 Up to and including EUR 1 million 59259

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

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 1274018
CZK Czech koruna 41733
HUF Hungarian forint 41061
RON Romanian leu 40522
SEK Swedish krona 39865
DKK Danish krone 36558
PLN Polish zloty 31138
BGN Bulgarian lev 23683
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 1251631
O Outstanding amount 254039
R Renegotiation 33113
P Pure new loans 26879

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 1337887
S Summed through period 220829
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) 389065
HR2 Croatian National Bank 54669
SI2 Bank of Slovenia 51452
SK2 National Bank of Slovakia 50637
LV2 Bank of Latvia 50269
DE2 Deutsche Bundesbank (Germany) 48675
LT2 Bank of Lithuania 48573
IT2 Banca d` Italia (Italy) 48432
LU2 Banque centrale du Luxembourg 48414
ES2 Banco de Espana (Spain) 48333
AT2 Oesterreichische Nationalbank (Austria) 48275
GR2 Bank of Greece (Greece) 47587
FR2 Banque de France (France) 47397
EE2 Bank of Estonia 46188
MT2 Central Bank of Malta 46075
FI2 Bank of Finland (Finland) 45749
NL2 De Nederlandsche Bank (Netherlands) 43391
BE2 Banque Nationale de Belgique (Belgium) 42422
CZ2 Czech National Bank 41733
PT2 Banco de Portugal (Portugal) 41477
HU2 National Bank of Hungary 41061
RO2 National Bank of Romania 40742
SE2 Sveriges Riksbank (Sweden) 39865
DK2 Danmarks Nationalbank (Denmark) 36558
CY2 Central Bank of Cyprus 32175
PL2 Bank of Poland 31342
IE2 Central Bank of Ireland (Ireland) 31203
BG2 Bulgarian National Bank 23903

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 389065
HR Croatia 54669
SI Slovenia 51452
SK Slovakia 50637
LV Latvia 50269
DE Germany 48675
LT Lithuania 48573
IT Italy 48432
LU Luxembourg 48414
ES Spain 48333
AT Austria 48275
GR Greece 47587
FR France 47397
EE Estonia 46188
MT Malta 46075
FI Finland 45749
NL Netherlands 43391
BE Belgium 42422
CZ Czech Republic 41733
PT Portugal 41477
HU Hungary 41061
RO Romania 40742
SE Sweden 39865
DK Denmark 36558
CY Cyprus 32175
PL Poland 31342
IE Ireland 31203
BG Bulgaria 23903

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-03 2025-04 change
PL Poland 3.74 7.55 NA 3.81
AT Austria 1.37 NA 2.81 NA
BE Belgium 1.73 NA 2.32 NA
BG Bulgaria 2.98 NA 2.75 NA
CY Cyprus 2.03 NA 3.93 NA
CZ Czech Republic NA NA NA NA
DE Germany 1.73 NA 2.13 NA
DK Denmark 1.64 NA 3.46 NA
EE Estonia 2.01 NA 4.41 NA
ES Spain 1.10 NA 3.07 NA
FI Finland 0.79 NA 3.21 NA
FR France 1.43 NA 1.86 NA
GR Greece NA NA NA NA
HR Croatia 3.09 NA 3.10 NA
HU Hungary 4.63 NA 5.91 NA
IE Ireland 2.47 NA 3.48 NA
IT Italy 1.59 NA 2.75 NA
LT Lithuania 1.94 NA 4.42 NA
LU Luxembourg 1.56 NA 2.66 NA
LV Latvia 2.30 NA 4.67 NA
MT Malta 2.80 NA 2.46 NA
NL Netherlands 2.32 NA 2.68 NA
PT Portugal 0.83 NA 3.58 NA
RO Romania 4.66 NA NA NA
SE Sweden 1.51 NA 3.09 NA
SI Slovenia 2.02 NA 3.16 NA
SK Slovakia 1.30 NA 2.95 NA
U2 Euro area (Member States and Institutions of the Euro Area) changing composition 1.61 NA 2.41 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 .html .RData
bdf FM 2025-05-24 2025-05-24
bdf MIR 2025-03-09 2025-01-22
bdf MIR1 2025-03-09 2025-01-22
bis CBPOL_D 2025-05-24 2024-05-10
bis CBPOL_M 2025-05-24 2024-04-19
ecb FM 2025-06-06 2025-06-06
ecb MIR 2025-06-06 2025-06-05
eurostat ei_mfir_m 2025-05-24 2025-05-24
eurostat irt_lt_mcby_d 2025-05-24 2025-05-24
eurostat irt_st_m 2025-05-24 2025-05-24
fred r 2025-05-30 2025-05-30
oecd MEI 2024-04-16 2025-02-25
oecd MEI_FIN 2024-09-15 2025-02-25
wdi FR.INR.RINR 2025-05-24 2025-05-24

Data on monetary policy

source dataset .html .RData
bdf FM 2025-05-24 2025-05-24
bdf MIR 2025-03-09 2025-01-22
bdf MIR1 2025-03-09 2025-01-22
bis CBPOL 2024-12-29 2024-12-29
ecb BSI 2025-05-21 2025-05-28
ecb BSI_PUB 2025-05-18 2025-05-30
ecb FM 2025-06-06 2025-06-06
ecb ILM 2025-06-05 2025-06-05
ecb ILM_PUB 2025-05-18 2024-09-10
ecb liq_daily 2025-06-06 2025-06-06
ecb MIR 2025-06-06 2025-06-05
ecb RAI 2025-05-18 2025-05-30
ecb SUP 2025-05-18 2025-05-18
ecb YC 2025-05-18 2025-05-21
ecb YC_PUB 2025-05-18 2025-05-18
eurostat ei_mfir_m 2025-05-24 2025-05-24
eurostat irt_st_m 2025-05-24 2025-05-24
fred r 2025-05-30 2025-05-30
oecd MEI 2024-04-16 2025-02-25
oecd MEI_FIN 2024-09-15 2025-02-25