Supervisory Banking Statistics

Data - ECB

Error in readChar(con, 5L, useBytes = TRUE) : 
  impossible d'ouvrir la connexion

Info

source dataset .html .RData

ecb

SUP

2024-09-19 2024-10-08

Data on monetary policy

source dataset Title Download Compile
ecb SUP Supervisory Banking Statistics 2024-10-08 [2024-09-19]
bdf FM Marché financier, taux 2024-06-18 [2024-07-26]
bdf MIR Taux d'intérêt - Zone euro 2024-07-01 [2024-07-26]
bdf MIR1 Taux d'intérêt - France 2024-07-01 [2024-07-26]
bis CBPOL Policy Rates, Daily 2024-09-15 [2024-08-09]
ecb BSI Balance Sheet Items 2024-09-16 [2024-10-08]
ecb BSI_PUB Balance Sheet Items - Published series 2024-10-08 [2024-10-08]
ecb FM Financial market data 2024-10-08 [2024-10-08]
ecb ILM Internal Liquidity Management 2024-10-08 [2024-10-08]
ecb ILM_PUB Internal Liquidity Management - Published series 2024-09-10 [2024-10-08]
ecb MIR MFI Interest Rate Statistics 2024-10-08 [2024-06-19]
ecb RAI Risk Assessment Indicators 2024-10-08 [2024-10-08]
ecb YC Financial market data - yield curve 2024-09-16 [2024-09-19]
ecb YC_PUB Financial market data - yield curve - Published series 2024-10-08 [2024-09-19]
ecb liq_daily Daily Liquidity 2024-09-11 [2024-10-08]
eurostat ei_mfir_m Interest rates - monthly data 2024-09-15 [2024-09-30]
eurostat irt_st_m Money market interest rates - monthly data 2024-10-08 [2024-09-30]
fred r Interest Rates 2024-09-18 [2024-09-18]
oecd MEI Main Economic Indicators 2024-06-30 [2024-04-16]
oecd MEI_FIN Monthly Monetary and Financial Statistics (MEI) 2024-05-21 [2024-09-15]

LAST_COMPILE

LAST_COMPILE
2024-10-09

Last

Code
SUP %>%
  group_by(TIME_PERIOD, FREQ) %>%
  summarise(Nobs = n()) %>%
  ungroup %>%
  group_by(FREQ) %>%
  arrange(desc(TIME_PERIOD)) %>%
  filter(row_number() == 1) %>%
  print_table_conditional()
TIME_PERIOD FREQ Nobs
2024-S1 H 962
2024-Q2 Q 11949

Info

  • Data Structure Definition (DSD). html

TITLE

Code
SUP %>%
  group_by(TITLE) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

BS_SUFFIX

Code
SUP %>%
  left_join(BS_SUFFIX,  by = "BS_SUFFIX") %>%
  group_by(BS_SUFFIX, Bs_suffix) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
BS_SUFFIX Bs_suffix Nobs
E Euro 289145
PCT Percentage 95796
LAF NA 27105
Z Not applicable 13498

CB_EXP_TYPE

Code
SUP %>%
  left_join(CB_EXP_TYPE,  by = "CB_EXP_TYPE") %>%
  group_by(CB_EXP_TYPE, Cb_exp_type) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
CB_EXP_TYPE Cb_exp_type Nobs
ALL All exposures 289526
_Z Not applicable 98783
N_ Non-performing exposures 13610
ST2 Assets with significant increase in credit risk since initial recognition but not credit-impaired (Stage 2) 8120
P_ Performing exposures 4108
NFM Non-performing exposures with forbearance measures 3736
PFM Performing exposures with forbearance measures 3729
ST1 Assets without significant increase in credit risk since initial recognition (Stage 1) 1420
ST3 Credit-impaired assets (Stage 3) 1420
PCI Purchased or originated credit-impaired financial assets 1092

CB_ITEM

Code
SUP %>%
  left_join(CB_ITEM,  by = "CB_ITEM") %>%
  group_by(CB_ITEM, Cb_item) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()

SBS_DI_1

Code
SUP %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  group_by(SBS_DI_1, Sbs_di_1) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
SBS_DI_1 Sbs_di_1 Nobs
SII Significant institutions 334548
LSI Less significant institutions 90996

SBS_BREAKDOWN

Code
SUP %>%
  left_join(SBS_BREAKDOWN,  by = "SBS_BREAKDOWN") %>%
  group_by(SBS_BREAKDOWN, Sbs_breakdown) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
SBS_BREAKDOWN Sbs_breakdown Nobs
_T Total 245402
AMC Classification by business model - asset manager & custodian 10515
CWH Classification by business model - corporate/wholesale lenders 10515
DEV Classification by business model - development/promotional lenders 10515
DIV Classification by business model - diversified lenders 10515
NC Classification by business model - others/ not classified 10515
RCCL Classification by business model - retail lenders and consumer credit lenders 10515
UNI Classification by business model - universal and investment banks 10515
GSIB Classification by size/business model - G-SIBs 7950
SL30 Classification by size - banks with total assets less than 30 billion of EUR 7950
SM20 Classification by size - banks with total assets more than 200 billion of EUR 7950
ST10 Classification by size - banks with total assets between 30 billion and 100 billion of EUR 7950
ST20 Classification by size - banks with total assets between 100 billion and 200 billion of EUR 7950
LORI Classification by risk - banks with low risk 7647
MHRI Classification by risk - banks with medium, high risk and non-rated 7647
SML Classification by business model - small market lenders 7647
DOM Classification by geographical diversification - banks with significant domestic exposures 7622
EEA Classification by geographical diversification - banks with largest non-domestic exposures in non-SSM EEA 7622
NEEA Classification by geographical diversification - banks with largest non-domestic exposures in non-EEA Europe 7622
ROW Classification by geographical diversification - banks with largest non-domestic exposures in RoW 7622
SSM Classification by geographical diversification - banks with largest non-domestic exposures in the SSM 7622
CSCB Classification by business model-central savings and cooperative banks 2868
EML Classification by business model-emerging markets lenders 2868

COUNT_AREA

Code
SUP %>%
  left_join(COUNT_AREA,  by = "COUNT_AREA") %>%
  group_by(COUNT_AREA, Count_area) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()

FREQ

Code
SUP %>%
  left_join(FREQ,  by = "FREQ") %>%
  group_by(FREQ, Freq) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
FREQ Freq Nobs
Q Quarterly 407310
H Half-yearly 18234

REF_AREA

Code
SUP %>%
  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
B01 EU countries participating in the Single Supervisory Mechanism (SSM) (changing composition) 204410
AT Austria 10914
BE Belgium 10914
CY Cyprus 10914
DE Germany 10914
EE Estonia 10914
ES Spain 10914
FI Finland 10914
FR France 10914
GR Greece 10914
IE Ireland 10914
IT Italy 10914
LT Lithuania 10914
LU Luxembourg 10914
LV Latvia 10914
MT Malta 10914
NL Netherlands 10914
PT Portugal 10914
SI Slovenia 10914
SK Slovakia 10914
BG Bulgaria 6884
HR Croatia 6884

COUNTERPART_SECTOR

Code
SUP %>%
  left_join(COUNTERPART_SECTOR,  by = "COUNTERPART_SECTOR") %>%
  group_by(COUNTERPART_SECTOR, Counterpart_sector) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
COUNTERPART_SECTOR Counterpart_sector Nobs
_Z Not applicable 338778
S13 General government 24786
S11 Non financial corporations 17065
S14 Households 15725
S12R Other financial corporations 10125
S122Z Deposit-taking corporations except the central bank and excluding electronic money institutions principally engaged in financial intermediation 6545
S121 Central bank 6514
S1V Non-financial corporations, households and NPISH 6006

TIME_FORMAT

Code
SUP %>%
  group_by(TIME_FORMAT) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  print_table_conditional()
TIME_FORMAT Nobs
P3M 407310
P6M 18234

Performance Indicators

https://www.bankingsupervision.europa.eu/banking/statistics/html/index.en.html

Return on equity

Graph

significant institutions (SIs) and less significant institutions (LSIs):

Code
SUP %>%
  filter(grepl("Return on equity", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE"),
         BS_SUFFIX == "PCT") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_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("Return on equity") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(7) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-100, 100, 2),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

Cost-to-income ratio

Code
SUP %>%
  filter(grepl("Cost-to-income ratio", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE"),
         BS_SUFFIX == "PCT") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_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("Cost-to-income Ratio") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(7) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 10),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

Net interest income

FR, IT, DE

Code
SUP %>%
  filter(grepl("Net interest income", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE"),
         BS_SUFFIX == "PCT") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_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("Net Interest Income/Total operating income") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(7) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 100, 10),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

FR, IT, DE, ES, NL, SI

Net interest margin

FR, IT, DE

Code
SUP %>%
  filter(grepl("Net interest margin", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_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("Net Interest Margin") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.1),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

FR, IT, DE, ES, NL, SI

Code
SUP %>%
  filter(grepl("Net interest margin", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE", "ES", "NL", "SI"),
         SBS_DI_1 == "SII") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  quarter_to_date %>%
  arrange(desc(date)) %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  select_if(~ n_distinct(.) > 1) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Net Interest Margin") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.1),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

FR, IT, DE, ES, NL, BE, AT, PT

2015-

Code
SUP %>%
  filter(grepl("Net interest margin", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE", "ES", "NL", "BE", "AT", "PT"),
         SBS_DI_1 == "SII") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  quarter_to_date %>%
  arrange(desc(date)) %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  select_if(~ n_distinct(.) > 1) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  mutate(color = ifelse(REF_AREA == "FR", color2, color)) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Net Interest Margin") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(8) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.1),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

2018-

Code
SUP %>%
  filter(grepl("Net interest margin", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE", "ES", "NL", "BE", "AT", "PT"),
         SBS_DI_1 == "SII") %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  quarter_to_date %>%
  filter(date >= as.Date("2018-01-01")) %>%
  arrange(desc(date)) %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  select_if(~ n_distinct(.) > 1) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  mutate(color = ifelse(REF_AREA == "FR", color2, color)) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Net Interest Margin") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(8) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.1),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.25, 0.90),
        legend.title = element_blank())

Liquidity

Liquidity coverage ratios (LCR)

The LCR is the percentage resulting from dividing the bank’s stock of high-quality assets by the estimated total net cash outflows over a 30 calendar day stress scenario.

Code
SUP %>%
  filter(CB_ITEM == "I3017",
         REF_AREA %in% c("U2", "FR", "IT", "DE"),
         !(SBS_DI_1 == "_Z")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_to_date %>%
  select_if(~ n_distinct(.) > 1) %>%
  arrange(desc(date)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Liquidity coverage ratio") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(0, 500, 50),
                     labels = percent_format(accuracy = 1),
                     limits = c(0, 3.5)) +
  theme(legend.position = c(0.2, 0.90),
        legend.title = element_blank())

Liquidity buffer

Code
SUP %>%
  filter(CB_ITEM == "A6310",
         REF_AREA %in% c("U2", "FR", "IT", "DE")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_to_date %>%
  select_if(~ n_distinct(.) > 1) %>%
  arrange(desc(date)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Liquidity buffer") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 1000, 2)) +
  theme(legend.position = c(0.2, 0.90),
        legend.title = element_blank())

Net liquidity outflow

Code
SUP %>%
  filter(CB_ITEM == "A6320",
         REF_AREA %in% c("U2", "FR", "IT", "DE")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_to_date %>%
  select_if(~ n_distinct(.) > 1) %>%
  arrange(desc(date)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Net liquidity outflow") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = seq(0, 1000, 2)) +
  theme(legend.position = c(0.2, 0.90),
        legend.title = element_blank())

Net liquidity outflow

Code
SUP %>%
  filter(grepl("Net liquidity outflow", TITLE),
         REF_AREA %in% c("B01", "FR", "IT", "DE")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_to_date %>%
  mutate(OBS_VALUE = OBS_VALUE/100,
         Ref_area = ifelse(REF_AREA == "B01", "Europe", Ref_area)) %>%
  select_if(~ n_distinct(.) > 1) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  na.omit %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Net liquidity outflow") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = paste0(SBS_DI_1, SBS_BREAKDOWN))) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 1) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(0, 500, 50),
                     labels = percent_format(accuracy = 1),
                     limits = c(0, 3.5)) +
  theme(legend.position = c(0.55, 0.50),
        legend.title = element_blank())

Net Liquidity outflow - EU

B01 - EU countries participating in the Single Supervisory Mechanism (SSM)

Capital adequacy

  • Common equity Tier 1 ratio

  • Tier 1 ratio

https://www.bankingsupervision.europa.eu/press/pr/date/2023/html/ssm.pr2301114cb4953fd6.en.html#::text=The%20aggregate%20capital%20ratios%20of,capital%20ratio%20stood%20at%2018.68%25.

Code
SUP %>%
  filter(grepl("Common equity Tier 1 ratio", TITLE),
         REF_AREA %in% c("U2", "FR", "IT", "DE")) %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  left_join(SBS_DI_1,  by = "SBS_DI_1") %>%
  quarter_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("Net Interest Margin") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color, linetype = Sbs_di_1)) + 
  add_flags(6) + scale_color_identity() +
  scale_x_date(breaks = seq(1960, 2030, 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.25, 0.90),
        legend.title = element_blank())