Daily Liquidity - liq_daily

Data - ECB

Info

Last observation: 2026-08-13 (N = 7)

First observation: 1999-01-01 (N = 6)

Last data update: 17 aoû 2026, 04:01. Last compile: 18 aoû 2026, 01: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.

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 619
CBPP1 CBPP1 - Covered bond purchase programme 2732
CBPP2 CBPP2 - Covered bond purchase programme 2 2002
CBPP3 CBPP3 - Covered bond purchase programme 3 619
CSPP CSPP - Corporate sector purchase programme 534
DF Deposit facility 9286
MLF Marginal lending facility 9286
OMO Open market operations excl. MonPol portfolios 9286
PEPP PEPP - Pandemic emergency purchase programme 333
PSPP PSPP - Public sector purchase programm 598
SMP SMP - Securities Markets programme 660
current_accounts Current accounts 9322
excess_liquidity Excess liquidity 1807
net_autonomous_monpol Net liquidity effect from Autonomous Factors and MonPol portfolios 9322
reserve_requirements Reserve requirements 9322

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
2026-08-13 OMO 30724
2026-08-13 MLF 32
2026-08-13 DF 2010074
2026-08-13 net_autonomous_monpol -2303529
2026-08-13 current_accounts 324210
2026-08-13 reserve_requirements 174661
2026-08-13 excess_liquidity 2159592

Last date by variable

Code
liq_daily |>
  group_by(variable) |>
  filter(date == max(date)) |>
  print_table_conditional()
date variable value
2026-08-13 OMO 30724
2026-08-13 MLF 32
2026-08-13 DF 2010074
2026-08-13 net_autonomous_monpol -2303529
2026-08-13 current_accounts 324210
2026-08-13 reserve_requirements 174661
2026-08-07 CBPP1 0
2026-08-07 CBPP2 0
2026-08-07 SMP 14
2026-08-07 CBPP3 190915
2026-08-07 ABSPP 2019
2026-08-07 PSPP 1678824
2026-08-07 CSPP 218180
2026-08-13 excess_liquidity 2159592
2026-08-07 PEPP 1291480

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 = ""))