Daily Liquidity

Data - ECB

Info

source dataset .html .RData
ecb liq_daily 2025-06-06 2025-06-06

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

LAST_COMPILE

LAST_COMPILE
2025-06-06

variable

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  group_by(variable, Variable) %>%
  summarise(Nobs = n()) %>%
  arrange(variable) %>%
  print_table_conditional
variable Variable Nobs
ABSPP ABSPP - ABS purchase programme 557
CBPP1 CBPP1 - Covered bond purchase programme 2670
CBPP2 CBPP2 - Covered bond purchase programme 2 1940
CBPP3 CBPP3 - Covered bond purchase programme 3 557
CSPP CSPP - Corporate sector purchase programme 472
DF Deposit facility 8977
MLF Marginal lending facility 8977
OMO Open market operations excl. MonPol portfolios 8977
PEPP PEPP - Pandemic emergency purchase programme 271
PSPP PSPP - Public sector purchase programm 536
SMP SMP - Securities Markets programme 598
current_accounts Current accounts 9013
excess_liquidity Excess liquidity 1498
net_autonomous_monpol Net liquidity effect from Autonomous Factors and MonPol portfolios 9013
reserve_requirements Reserve requirements 9013

duplicates

Same + different values

Code
liq_daily %>%
  group_by(variable, date) %>%
  filter(n()>1) %>%
  arrange(date, variable) %>%
  print_table_conditional

Different values

Code
liq_daily %>%
  unique %>%
  group_by(variable, date) %>%
  filter(n()>1) %>%
  arrange(date, variable) %>%
  print_table_conditional
date variable value
2008-01-01 OMO 535514
2008-01-01 OMO 535503
2008-01-01 net_autonomous_monpol 256501
2008-01-01 net_autonomous_monpol 256490
2008-01-02 OMO 468454
2008-01-02 OMO 468443
2008-01-02 net_autonomous_monpol 262467
2008-01-02 net_autonomous_monpol 262456
2008-01-03 OMO 437094
2008-01-03 OMO 437083
2008-01-03 net_autonomous_monpol 269250
2008-01-03 net_autonomous_monpol 269239
2008-01-15 current_accounts 168183
2008-01-15 current_accounts 168187
2008-01-15 net_autonomous_monpol 232059
2008-01-15 net_autonomous_monpol 232055

Data on liquidity

Last date

Code
liq_daily %>%
  filter(date == max(date)) %>%
  print_table_conditional
date variable value
2025-06-05 OMO 21030
2025-06-05 MLF 0
2025-06-05 DF 2689682
2025-06-05 net_autonomous_monpol -2853929
2025-06-05 current_accounts 185276
2025-06-05 reserve_requirements 167149
2025-06-05 excess_liquidity 2707809

Last date by variable

Code
liq_daily %>%
  group_by(variable) %>%
  filter(date == max(date)) %>%
  print_table_conditional
date variable value
2025-06-05 OMO 21030
2025-06-05 MLF 0
2025-06-05 DF 2689682
2025-06-05 net_autonomous_monpol -2853929
2025-06-05 current_accounts 185276
2025-06-05 reserve_requirements 167149
2025-05-30 CBPP1 0
2025-05-30 CBPP2 0
2025-05-30 SMP 692
2025-05-30 CBPP3 228432
2025-05-30 ABSPP 4749
2025-05-30 PSPP 2002460
2025-05-30 CSPP 267240
2025-06-05 excess_liquidity 2707809
2025-05-30 PEPP 1516148

Asset purchase program

CBPP1, CBPP2, CBPP3, SMP, ABSPP, PSPP, CSPP, PEPP

All

Lines

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(variable %in% c("CBPP1", "CBPP2", "CBPP3", "SMP", "ABSPP", "PSPP", "CSPP", "PEPP")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.3, 0.7),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Stock

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(variable %in% c("CBPP1", "CBPP2", "CBPP3", "SMP", "ABSPP", "PSPP", "CSPP", "PEPP")) %>%
  ggplot + geom_area(aes(x = date, y = value/10^3, fill = Variable), alpha = 0.5) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2100, 1), "-01-01")),
               labels = date_format("%Y")) +
    # Add labels manually with matching colors
  annotate("text", x = as.Date("2023-01-01"), y = 3000, label = "PEPP", color = scales::hue_pal()(8)[6], size = 4) +
  annotate("text", x = as.Date("2021-01-01"), y = 1300, label = "PSPP", color = scales::hue_pal()(8)[7], size = 4) +
  theme(legend.position = c(0.3, 0.7),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2020-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2020-01-01")) %>%
  filter(variable %in% c("CBPP1", "CBPP2", "CBPP3", "SMP", "ABSPP", "PSPP", "CSPP", "PEPP")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2020-01-01"), Sys.Date(), by = "6 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.5, 0.5),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2022-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2022-01-01")) %>%
  filter(variable %in% c("CBPP1", "CBPP2", "CBPP3", "SMP", "ABSPP", "PSPP", "CSPP", "PEPP")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2022-01-01"), as.Date("2026-01-01"), by = "2 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.45, 0.5),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Excess Liquidity

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(Variable == "Excess liquidity") %>%
  ggplot + geom_line(aes(x = date, y = value/10^3)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 1), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Excess Liquidity & Deposit Facility

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Synthesis excess liquidity

All

Code
liq_daily %>%
  filter(variable %in% c("excess_liquidity", "reserve_requirements", "current_accounts", "DF", "MLF")) %>%
  group_by(date, variable) %>%
  filter(row_number(value) == 1) %>%
  spread(variable, value) %>%
  transmute(date, `Excess Liquidity (ECB)` = excess_liquidity,
            `Excess Liquidity (own)` = current_accounts-reserve_requirements+DF-MLF) %>%
  gather(Variable, value, -date) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable, linetype = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_color_manual(values = c("red", "black")) +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.3, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2022

Code
liq_daily %>%
  filter(variable %in% c("excess_liquidity", "reserve_requirements", "current_accounts", "DF", "MLF")) %>%
  group_by(date, variable) %>%
  filter(row_number(value) == 1) %>%
  spread(variable, value) %>%
  transmute(date, `Excess Liquidity (ECB)` = excess_liquidity,
            `Excess Liquidity (own)` = current_accounts-reserve_requirements+DF-MLF) %>%
  gather(Variable, value, -date) %>%
  filter(date >= as.Date("2022-01-01")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2022-01-01"), as.Date("2026-01-01"), by = "2 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.8, 0.9),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Excess Liquidity

Code
liq_daily %>%
  filter(variable %in% c("excess_liquidity", "reserve_requirements", "current_accounts", "DF", "MLF")) %>%
  group_by(date, variable) %>%
  filter(row_number(value) == 1) %>%
  spread(variable, value) %>%
  transmute(date, value = current_accounts-reserve_requirements+DF-MLF) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3)) +
  xlab("") + ylab("Excess liquidity") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Excess Liquidity & Deposit Facility & Current accounts

All

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.4, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2020-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2020-01-01")) %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2020-01-01"), Sys.Date(), by = "6 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.2, 0.9),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2022-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2022-01-01")) %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts")) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2022-01-01"), as.Date("2026-01-01"), by = "2 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.15, 0.5),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

Excess Liquidity & Deposit Facility & Current accounts

All

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts", "Marginal lending facility", "Reserve requirements")) %>%
  mutate(Variable = factor(Variable, levels = c("Current accounts", "Reserve requirements", "Deposit facility", "Marginal lending facility", "Excess liquidity"))) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = as.Date(paste0(seq(1940, 2030, 2), "-01-01")),
               labels = date_format("%Y")) +
  theme(legend.position = c(0.2, 0.8),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2020-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2020-01-01")) %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts", "Marginal lending facility", "Reserve requirements")) %>%
  mutate(Variable = factor(Variable, levels = c("Current accounts", "Reserve requirements", "Deposit facility", "Marginal lending facility", "Excess liquidity"))) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2020-01-01"), Sys.Date(), by = "6 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.5, 0.5),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

2022-

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2022-01-01")) %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts", "Marginal lending facility", "Reserve requirements")) %>%
  mutate(Variable = factor(Variable, levels = c("Current accounts", "Reserve requirements", "Deposit facility", "Marginal lending facility", "Excess liquidity"))) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2022-01-01"), as.Date("2026-01-01"), by = "2 months"),
               labels = date_format("%b %Y")) +
  theme(legend.position = c(0.15, 0.5),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))

July 2022- Novembre 2022

Code
liq_daily %>%
  left_join(variable, by = "variable") %>%
  filter(date >= as.Date("2022-09-05"),
         date <= as.Date("2022-09-20")) %>%
  filter(Variable %in% c("Excess liquidity", "Deposit facility", "Current accounts", "Marginal lending facility", "Reserve requirements")) %>%
  mutate(Variable = factor(Variable, levels = c("Current accounts", "Reserve requirements", "Deposit facility", "Marginal lending facility", "Excess liquidity"))) %>%
  ggplot + geom_line(aes(x = date, y = value/10^3, color = Variable)) +
  xlab("") + ylab("") + theme_minimal() +
  scale_x_date(breaks = seq(from = as.Date("2022-01-01"), as.Date("2026-01-01"), by = "1 day"),
               labels = date_format("%d %b %Y")) +
  theme(legend.position = c(0.15, 0.5),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  scale_y_continuous(breaks = 1000*seq(-100, 90, .5),
                     labels = scales::dollar_format(acc = 1, su = " Bn€", pre = ""))