Financial market data

Data - ECB

Error in readChar(con, 5L, useBytes = TRUE) : cannot open the connection

Info

source dataset .html .RData
ecb FM 2025-08-29 2025-08-28

LAST_COMPILE

LAST_COMPILE
2025-08-29

Last

TIME_PERIOD FREQ Nobs
2025-Q2 Q 23
2025-08-29 D 6
2025-07 M 36
2025-06-11 B 6
2024 A 25

Last Day

TITLE TIME_PERIOD OBS_VALUE
Deposit facility - date of changes (raw data) - Change in percentage points compared to previous rate 2025-08-29 -0.25
Deposit facility - date of changes (raw data) - Level 2025-08-29 2.00
Marginal lending facility - date of changes (raw data) - Change in percentage points compared to previous rate 2025-08-29 -0.25
Marginal lending facility - date of changes (raw data) - Level 2025-08-29 2.40
Main refinancing operations - fixed rate tenders (fixed rate) (date of changes) - Level 2025-08-29 2.15
Main refinancing operations - Minimum bid rate/fixed rate (date of changes) - Level 2025-08-29 2.15

PROVIDER_FM_ID

Code
FM %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  group_by(PROVIDER_FM_ID, PROVIDER_FM_ID_desc) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F) else .}

FREQ

Code
FM %>%
  left_join(FREQ,  by = "FREQ") %>%
  group_by(FREQ, Freq) %>%
  summarise(Nobs = n()) %>%
  {if (is_html_output()) print_table(.) else .}
FREQ Freq Nobs
A Annual 865
B Daily - businessweek 386
D Daily 58424
M Monthly 20841
Q Quarterly 3531

REF_AREA

Code
FM %>%
  left_join(REF_AREA,  by = "REF_AREA") %>%
  group_by(REF_AREA, Ref_area) %>%
  summarise(Nobs = n()) %>%
  mutate(Flag = gsub(" ", "-", str_to_lower(gsub(" ", "-", Ref_area))),
         Flag = paste0('<img src="../../icon/flag/vsmall/', Flag, '.png" alt="Flag">')) %>%
  select(Flag, everything()) %>%
  {if (is_html_output()) datatable(., filter = 'top', rownames = F, escape = F) else .}

CURRENCY

Code
FM %>%
  left_join(CURRENCY,  by = "CURRENCY") %>%
  group_by(CURRENCY, Currency) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
CURRENCY Currency Nobs
EUR Euro 73262
USD US dollar 5547
JPY Japanese yen 3573
GBP UK pound sterling 810
DKK Danish krone 443
SEK Swedish krona 412

PROVIDER_FM

Code
FM %>%
  left_join(PROVIDER_FM,  by = "PROVIDER_FM") %>%
  group_by(PROVIDER_FM, Provider_fm) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
PROVIDER_FM Provider_fm Nobs
4F ECB 69045
DS DataStream 9648
RT Reuters 5354

INSTRUMENT_FM

Code
FM %>%
  left_join(INSTRUMENT_FM,  by = "INSTRUMENT_FM") %>%
  group_by(INSTRUMENT_FM, Instrument_fm) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
INSTRUMENT_FM Instrument_fm Nobs
KR Key interest rate 58994
EI Equity/index 8793
BB Benchmark bond 7869
MM Money Market 6150
BZ Zero-coupon yield bond 845
SP Spread 807
CY Commodity 589

DATA_TYPE_FM

Code
FM %>%
  left_join(DATA_TYPE_FM,  by = "DATA_TYPE_FM") %>%
  group_by(DATA_TYPE_FM, Data_type_fm) %>%
  summarise(Nobs = n()) %>%
  arrange(-Nobs) %>%
  {if (is_html_output()) print_table(.) else .}
DATA_TYPE_FM Data_type_fm Nobs
LEV Level 39153
CHG Change in percentage points compared to previous rate 19657
HSTA Historical close, average of observations through period 14861
YLDA Yield, average of observations through period 4534
YLD Yield 3335
ASKA Ask price or primary activity, average of observations through period 855
YLDE Yield, end of period 845
SPRE Spread, end of period 807

COLLECTION

Code
FM %>%
  left_join(COLLECTION,  by = "COLLECTION") %>%
  group_by(COLLECTION, Collection) %>%
  summarise(Nobs = n()) %>%
  {if (is_html_output()) print_table(.) else .}
COLLECTION Collection Nobs
A Average of observations through period 20271
E End of period 63776

UNIT

Code
FM %>%
  left_join(UNIT,  by = "UNIT") %>%
  group_by(UNIT, Unit) %>%
  summarise(Nobs = n()) %>%
  {if (is_html_output()) print_table(.) else .}
UNIT Unit Nobs
EUR Euro 160
PC Percent 19657
PCPA Percent per annum 55437
POINTS Points 8793

TITLE

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

Real Rates

USA, Euro Area

1999

Code
plot <- FM %>%
  filter(PROVIDER_FM_ID %in% c("R_US10YT_RR", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Zone euro", "États-Unis")) %>%
  filter(date >= as.Date("1999-01-01")) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Taux d'intérêt réels à 10 ans") +
  geom_line(aes(x = date, y = OBS_VALUE, color = Ref_area)) + 
  scale_color_manual(values = c("#B22234", "#003399")) +
  geom_rect(data = nber_recessions %>%
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin =-Inf, ymax = +Inf), 
            fill = '#B22234', alpha = 0.1)  +
  geom_rect(data = cepr_recessions %>%
              filter(Peak > as.Date("1999-01-01")), 
            aes(xmin = Peak, xmax = Trough, ymin = -Inf, ymax = +Inf), 
            fill = '#003399', alpha = 0.1)  +
  scale_x_date(breaks = c(seq(1999, 2100, 5), seq(1997, 2100, 5)) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  theme(legend.position = c(0.26, 0.2),
        legend.title = element_blank()) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  labs(caption = "Source: BCE, Données sur les marchés financiers")
save(plot, file = "FM_files/figure-html/real-rates-USA-EUR-1999-1.RData")
plot

USA, Japan, Euro Area

All

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("R_US10YT_RR", "R_JP10YT_RR", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "U2", color2, color)) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Real rates, 10-year") +
  geom_line(aes(x = date, y = OBS_VALUE, color = color)) + 
  add_flags(3) + scale_color_identity() +
  scale_x_date(breaks = seq(1900, 2100, 10) %>% 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
FM %>%
  filter(PROVIDER_FM_ID %in% c("R_US10YT_RR", "R_JP10YT_RR", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) %>%
  filter(date >= as.Date("2010-01-01")) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "U2", color2, color)) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Real rates, 10-year") +
  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))

2015-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("R_US10YT_RR", "R_JP10YT_RR", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) %>%
  filter(date >= as.Date("2015-01-01")) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "U2", color2, color)) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Real rates, 10-year") +
  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))

2017-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("R_US10YT_RR", "R_JP10YT_RR", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(REF_AREA, by = "REF_AREA") %>%
  mutate(Ref_area = ifelse(REF_AREA == "U2", "Europe", Ref_area)) %>%
  filter(date >= as.Date("2017-01-01")) %>%
  left_join(colors, by = c("Ref_area" = "country")) %>%
  mutate(color = ifelse(REF_AREA == "U2", color2, color)) %>%
  mutate(OBS_VALUE = OBS_VALUE/100) %>%
  ggplot(.) + theme_minimal() + xlab("") + ylab("Real rates, 10-year") +
  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))

ECB Key Interest rates

EONIA

All

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT", "EONIA"),
         FREQ == "M") %>%
  month_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2025, 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.45, 0.92),
        legend.title = element_blank())

Deposit Facility, Marginal Lending Facility

All

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT", "MRR_FR", "MRR_MBR", "MRR"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2025, 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.45, 0.92),
        legend.title = element_blank())

Deposit Facility, Marginal Lending Facility

All

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  mutate(Provider_fm_id = factor(PROVIDER_FM_ID,
                                 levels = c("MLFR", "MRR_RT", "DFR"),
                                 labels = c("ECB Marginal lending facility",
                                            "ECB Main refinancing operations",
                                            "ECB Deposit facility"))) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Provider_fm_id)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2025, 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.92),
        legend.title = element_blank()) +
  geom_hline(yintercept = 3.75/100, linetype = "dashed")

2010

Code
dates_ecb <- FM %>%
  filter(PROVIDER_FM_ID == "DFR") %>%
  day_to_date %>%
  mutate(OBS_VALUE = OBS_VALUE-lag(OBS_VALUE)) %>%
  filter(OBS_VALUE != 0) %>%
  pull(date)
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  mutate(Provider_fm_id = factor(PROVIDER_FM_ID,
                                 levels = c("MLFR", "MRR_RT", "DFR"),
                                 labels = c("ECB Marginal lending facility",
                                            "ECB Main refinancing operations - Minimum bid rate/fixed rate",
                                            "ECB Deposit facility"))) %>%
  filter(date >= as.Date("2010-01-01"))%>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Provider_fm_id)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = dates_ecb,
               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.45, 0.92),
        legend.title = element_blank())

2016-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  filter(date >= as.Date("2016-01-01"))%>%
  mutate(Provider_fm_id = factor(PROVIDER_FM_ID,
                                 levels = c("MLFR", "MRR_RT", "DFR"),
                                 labels = c("ECB Marginal lending facility",
                                            "ECB Main refinancing operations - Minimum bid rate/fixed rate",
                                            "ECB Deposit facility"))) %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Provider_fm_id)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2025, 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.45, 0.92),
        legend.title = element_blank())

2022-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  filter(date >= as.Date("2022-01-01")) %>%
  add_row(date = as.Date("2025-06-11"), PROVIDER_FM_ID = "DFR", OBS_VALUE = 2) %>%
  add_row(date = as.Date("2025-06-11"), PROVIDER_FM_ID = "MRR_RT", OBS_VALUE = 2.15) %>%
  add_row(date = as.Date("2025-06-11"), PROVIDER_FM_ID = "MLFR", OBS_VALUE = 2.4) %>%
  add_row(date = as.Date("2025-06-10"), PROVIDER_FM_ID = "DFR", OBS_VALUE = 2.25) %>%
  add_row(date = as.Date("2025-06-10"), PROVIDER_FM_ID = "MRR_RT", OBS_VALUE = 2.4) %>%
  add_row(date = as.Date("2025-06-10"), PROVIDER_FM_ID = "MLFR", OBS_VALUE = 2.65) %>%
  arrange(desc(date)) %>%
  #add_row(date = as.Date("2024-09-17"), PROVIDER_FM_ID = "DFR", OBS_VALUE = 3.5) %>%
  #add_row(date = as.Date("2024-09-17"), PROVIDER_FM_ID = "MRR_RT", OBS_VALUE = 3.65) %>%
  #add_row(date = as.Date("2024-09-17"), PROVIDER_FM_ID = "MLFR", OBS_VALUE = 3.9) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  mutate(Provider_fm_id = factor(PROVIDER_FM_ID,
                                 levels = c("MLFR", "MRR_RT", "DFR"),
                                 labels = c("ECB Marginal lending facility",
                                            "ECB Main refinancing operations - Minimum bid rate/fixed rate",
                                            "ECB Deposit facility"))) %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Provider_fm_id)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = c(dates_ecb),
               labels = date_format("%d %B %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.65, 0.2),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1)) +
  geom_label_repel(data = . %>% filter(date == max(date)),
                   aes(x = date, y = OBS_VALUE / 100, label = percent(OBS_VALUE / 100, acc = 0.01), color = Provider_fm_id))

2022 - Dates of change

  • Schedules for the meetings of the Governing Council. html

  • Key ECB interest rates: Dates of change. html

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  mutate(Provider_fm_id = factor(PROVIDER_FM_ID,
                                 levels = c("MLFR", "MRR_RT", "DFR"),
                                 labels = c("ECB Marginal lending facility",
                                            "ECB Main refinancing operations",
                                            "ECB Deposit facility"))) %>%
  filter(date >= as.Date("2022-07-01")) %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = Provider_fm_id)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = c(dates_ecb, Sys.Date()),
               labels = date_format("%d %B %Y")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.5),
                     labels = percent_format(accuracy = .1)) +
  theme(legend.position = c(0.7, 0.2),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Around September 2022

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("DFR", "MLFR", "MRR_RT"),
         DATA_TYPE_FM == "LEV",
         FREQ == "D") %>%
  day_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  filter(date >= as.Date("2022-09-05"),
         date <= as.Date("2022-09-20")) %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  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")) +
  scale_y_continuous(breaks = 0.01*seq(-10, 50, 0.25),
                     labels = percent_format(accuracy = .01)) +
  theme(legend.position = c(0.4, 0.92),
        legend.title = element_blank(),
        axis.text.x = element_text(angle = 45, vjust = 1, hjust = 1))

Japan

1970-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("JP10YT_RR", "R_JP10YT_RR")) %>%
  month_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1960, 2100, 5) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-50, 50, 2),
                     labels = percent_format(accuracy = 1)) +
  theme(legend.position = c(0.75, 0.9),
        legend.title = element_blank())

2000-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("JP10YT_RR", "R_JP10YT_RR")) %>%
  month_to_date %>%
  filter(date >= as.Date("2000-01-01")) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  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(-50, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.75, 0.9),
        legend.title = element_blank())

United States

1970-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("US10YT_RR", "R_US10YT_RR")) %>%
  month_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1900, 2100, 10) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-50, 50, 2),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.75, 0.9),
        legend.title = element_blank())

2000-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("US10YT_RR", "R_US10YT_RR")) %>%
  month_to_date %>%
  filter(date >= as.Date("2000-01-01")) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  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(-50, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.75, 0.9),
        legend.title = element_blank())

Euro area

1970-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("U2_10Y", "R_U2_10Y")) %>%
  month_to_date %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("Interest Rates (%)") +
  scale_x_date(breaks = seq(1900, 2100, 10) %>% paste0("-01-01") %>% as.Date,
               labels = date_format("%Y")) +
  scale_y_continuous(breaks = 0.01*seq(-50, 50, 2),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.75, 0.9),
        legend.title = element_blank())

2000-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("U2_10Y", "R_U2_10Y")) %>%
  month_to_date %>%
  filter(date >= as.Date("2000-01-01")) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  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(-50, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.35, 0.2),
        legend.title = element_blank())

2015-

Code
FM %>%
  filter(PROVIDER_FM_ID %in% c("U2_10Y", "R_U2_10Y")) %>%
  month_to_date %>%
  filter(date >= as.Date("2015-01-01")) %>%
  left_join(PROVIDER_FM_ID,  by = "PROVIDER_FM_ID") %>%
  ggplot(.) + 
  geom_line(aes(x = date, y = OBS_VALUE / 100, color = PROVIDER_FM_ID_desc)) + 
  theme_minimal() + xlab("") + ylab("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(-50, 50, 1),
                     labels = percent_format(accuracy = 1)) +
  
  theme(legend.position = c(0.35, 0.2),
        legend.title = element_blank())

More…

Data on monetary policy

source dataset .html .RData
bdf FM 2025-08-28 2025-08-28
bdf MIR 2025-08-28 2025-08-04
bdf MIR1 2025-08-28 2025-08-04
bis CBPOL 2025-08-28 2025-08-28
ecb BSI 2025-08-29 NA
ecb BSI_PUB 2025-08-29 NA
ecb FM 2025-08-29 NA
ecb ILM 2025-08-29 NA
ecb ILM_PUB 2025-08-29 2024-09-10
ecb liq_daily 2025-08-29 2025-06-06
ecb MIR 2025-08-29 2025-08-28
ecb RAI 2025-08-29 2025-08-28
ecb SUP 2025-08-29 2025-08-28
ecb YC 2025-08-29 NA
ecb YC_PUB 2025-08-29 NA
eurostat ei_mfir_m 2025-08-28 2025-08-28
eurostat irt_st_m 2025-08-28 2025-08-28
fred r 2025-08-28 2025-08-28
oecd MEI 2024-04-16 2025-07-24
oecd MEI_FIN 2024-09-15 2025-07-24

Data on interest rates

source dataset .html .RData
bdf FM 2025-08-28 2025-08-28
bdf MIR 2025-08-28 2025-08-04
bdf MIR1 2025-08-28 2025-08-04
bis CBPOL_D 2025-08-28 2025-08-20
bis CBPOL_M 2025-08-28 2024-04-19
ecb FM 2025-08-29 NA
ecb MIR 2025-08-29 2025-08-28
eurostat ei_mfir_m 2025-08-28 2025-08-28
eurostat irt_lt_mcby_d 2025-08-28 2025-07-24
eurostat irt_st_m 2025-08-28 2025-08-28
fred r 2025-08-28 2025-08-28
oecd MEI 2024-04-16 2025-07-24
oecd MEI_FIN 2024-09-15 2025-07-24
wdi FR.INR.RINR 2025-05-24 2025-08-24