library(tidyverse)
library(lubridate)
library(scales)
library(ggrepel)
library(tidyquant)
library(jsonlite)
theme_set(theme_minimal())
invisible(Sys.setlocale("LC_TIME", "en_US.UTF-8"))
fred_series <- "Country Series ID   Series Name
United States   IR3TIB01USM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for United States
Euro Area   IR3TIB01EZM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Euro Area
United Kingdom  IR3TIB01GBM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for United Kingdom
Japan   IR3TIB01JPM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Japan
Germany IR3TIB01DEM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Germany
Canada  IR3TIB01CAM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Canada
Norway  IR3TIB01NOM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Norway
Australia   IR3TIB01AUM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Australia
Sweden  IR3TIB01SEM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Sweden
Switzerland IR3TIB01CHM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Switzerland
Denmark IR3TIB01DKM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Denmark
New Zealand IR3TIB01NZM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for New Zealand
South Africa    IR3TIB01ZAM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for South Africa
China   IR3TIB01CNM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for China
Mexico  IR3TIB01MXM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Mexico
South Korea IR3TIB01KRM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for South Korea
India   IR3TIB01INM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for India
Indonesia   IR3TIB01IDM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Indonesia
Italy   IR3TIB01ITM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Italy
France  IR3TIB01FRM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for France
Spain   IR3TIB01ESM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Spain
Netherlands IR3TIB01NLM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Netherlands
Belgium IR3TIB01BEM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Belgium
Austria IR3TIB01ATM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Austria
Portugal    IR3TIB01PTM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Portugal
Greece  IR3TIB01GRM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Greece
Ireland IR3TIB01IEM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Ireland
Finland IR3TIB01FIM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Finland
Poland  IR3TIB01PLM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Poland
Czech Republic  IR3TIB01CZM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Czech Republic
Hungary IR3TIB01HUM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Hungary
Russia  IR3TIB01RUM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Russia
Turkey  IR3TIB01TRM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Turkey
Chile   IR3TIB01CLM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Chile
Colombia    IR3TIB01COM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Colombia
Costa Rica  CRIIR3TIB01STM  Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Costa Rica
Slovak Republic IR3TIB01SKM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Slovak Republic
Estonia IR3TIB01EEM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Estonia
Slovenia    IR3TIB01SIM156N Interest Rates: 3-Month or 90-Day Rates and Yields: Interbank Rates: Total for Slovenia"

fred_series <- read_tsv(fred_series)

fred_data <- fred_series |> 
  mutate(data = map(`Series ID`, ~tq_get(.x, get = "economic.data", from = "2000-01-01")))

fred_data |> 
  saveRDS("data/rates/fred_data.RDS")
fred_data <- readRDS("data/rates/fred_data.RDS")
df <- fred_data |> 
  unnest(data) |>
  mutate(rate = price/100)

p <- df |> 
  ggplot(aes(date, rate, color = Country)) +
  geom_line() +
  scale_y_continuous(labels = scales::percent) +
  scale_x_date(date_breaks = "2 year", date_labels = "%Y", limits = c(as.Date("2000-01-01"), as.Date("2026-07-01"))) +
  ggplot2::coord_cartesian(ylim = c(0, 0.2)) +
  labs(title = "Interest Rates",
       subtitle = "3-Month or 90-Day Rates and Yields: Interbank Rates",
       x = NULL,
       y = NULL,
       caption = "Source: Federal Reserve Economic Data (FRED)") +
  theme(legend.position = "none")

p +
  geom_text_repel(data = df |> group_by(Country) |> slice_max(date), aes(label = Country), 
                  nudge_x = 10, direction = "y", size = 3, hjust = 0, max.overlaps = Inf)

library(plotly)

ply <- p +
    scale_x_date(date_breaks = "2 year", date_labels = "%Y")


ply |> ggplotly()