Korunové úrokové sazby prošly v roce 2021 značným vývojem; do ledna vstupovaly na hodnotách blízkých nule, a prosinec končíme s vážnou diskuzí o pěti procentech.

Tento vývoj byl dobře vidět na mezibankovních sazbách PRIBOR, které administruje Czech Financial Benchmark Facility s.r.o. a na svých stránkách je se zpožděním poskytuje ČNB.

Hodnoty PRIBORových sazeb publikované ČNB jsou v prostředí statistického programovacího jazyka R přístupné s využitím rozšiřujícího balíčku {czechrates}.

Tento balíček je k dispozici na CRAN a zpřístupňuje svým uživatelům z datových extraktů na webu ČNB kromě PRIBORů také hodnoty dvoutýdenního repa a vyhlašované kurzy devizového trhu.

V okamžiku, kdy máme data o sazbách peněžního trhu k dispozici, je logickým dalším krokem jejich vizualizace s plným využitím technik statistického programovacího jazyka R.

Zde jako graf krátkého a dlouhého konce (1 den / 1 rok) křivky peněžního trhu.

Na grafu jsou zajímavé dvě věci:

  • v první řadě skokový nárůst krátkodobých sazeb k termínům změny repo sazby ČNB (duh…)
  • v druhé řadě stojí za pozornost nárůst spreadu mezi jednodenním a ročním PRIBORem; od 22 bodů v lednu ke 123 bodům dne 4.11.2021

Ekonomická teorie říká, že spread mezi krátkodobými a dlouhodobými sazbami by měl mít dvě složky: likviditní prémii, svou výší v čase spíše stabilní, a očekávání budoucího vývoje krátkodobých sazeb, které by mělo stát za většinou krátkodobých změn.

Pro likviditní prémii dává v českých luzích a hájích smysl něco kolem počátečních 20 bodů z ledna. Ze sazeb ročního PRIBORu kolem 4.45%, při jednodenních 3.75%, se tedy dá vykládat, že trh očekává během roku 2022 další dvě navýšení o 25 bodů – ale skok o celých 100 bodů byl spíše překvapením.

A to je ode mě jako pozorování vše – s tím, že pro zájemce přikládám podkladový zdroják pro načtení aktuálních sazeb ze stránek ČNB a vygenerování animace s využitím technik jazyka R (konkrétně rozšiřujících balíčků {czechrates} + {ggplot2} a {gganimate}).

library(dplyr)
library(ggplot2)
library(stringr)
library(czechrates)
library(gganimate)

# funkce pro konzistentně pěkné formátování procent
pretty_prc <- function(vstup) {
  
  (vstup * 100) %>% 
    round(2) %>% 
    format(scientific = F, nsmall = 2) %>%
    paste0("%")
  
}

# datumy za celý rok 2021 jako vstup 
rok_2021 <- seq(from = as.Date('2021-01-01'),
                to = as.Date('2021-12-31'),
                by = 1)

# stažení sazeb z webu ČNB za rok 2021 jako celek; kompletní set maturit
raw_rates <- pribor(date = rok_2021, 
                    maturity =  c("1D", "1W", "2W", "1M", "3M", "6M", "9M", "1Y")) 

# podklad grafu z formátu od ČNB do podoby "stravitelnější" pro ggplot
clean_rates <- raw_rates %>% 
  # začištění názvu proměnných pro hezčí graf
  tidyr::pivot_longer(!date_valid, # znormalizovat vše, kromě data / je klíčem
                      names_to = "tenor",
                      names_prefix = "PRIBOR_",
                      values_to = "rate") %>% 
  mutate(tenor = ordered(tenor,
                         levels = c("1D", "1W", "2W", "1M", "3M", "6M", "9M", "1Y"))) %>% 
  # vybrat dlouhý a krátký konec
  filter(tenor %in% c("1D", "1Y")) %>% 
  # popisek jako text + znak procenta na konci
  mutate(popisek = case_when(tenor == "1D" ~ paste("O/N: ", pretty_prc(rate)),
                             tenor == "1Y" ~ paste("1Y: ", pretty_prc(rate))))

# příprava animace
animak <- ggplot(data = clean_rates, 
                 aes(x = date_valid, 
                     y = rate,
                     group = tenor)) +
  # čára historie
  geom_line(aes(color = tenor),
            size = 1) +
  # spojnice současnosti s textem na okraji
  geom_segment(aes(xend = as.Date("2022-01-10", tz="CET"),
                   yend = rate), 
               linetype = 2, colour = 'grey') +
  # jeden bod současnosti / akutální hodnota jako bod v grafu
  geom_point(aes(color = tenor),
             size = 2) +
  # text na okraji / aktuální hodnota jako popisek na straně
  geom_text(aes(x = as.Date("2022-01-10", tz="CET"), 
                label = popisek),
            hjust = 0) +
  # vlastnosti osy Y - zejména procenta, a začátek na nule
  scale_y_continuous(labels = scales::percent_format(),
                     limits = c(0, NA)) +
  # vlastnosti osy X - zejména konec v březnu, abby bylo místo pro popisek
  scale_x_date(limits = as.Date(c("2021-01-01", "2022-03-15"))) +
  # paleta podle Wese Andersona: https://en.wikipedia.org/wiki/Bottle_Rocket
  scale_color_manual(values = wesanderson::wes_palette(2, name = "BottleRocket2")) +
  theme_minimal() +
  labs(title = "Czech Interbank Rates in 2021",
       subtitle = "PRIBOR as quoted on {frame_along}") +
  # začištění prvků grafu...
  theme(axis.title = element_blank(),
        axis.text = element_text(size = 12),
        legend.position = "none",
        panel.grid = element_blank(),
        plot.title = element_text(family = "Suez One",
                                  hjust = 1/2,
                                  size = 30,
                                  color = "grey30"),
        plot.subtitle = element_text(family = "Suez One",
                                     hjust = 1/2,
                                     size = 20,
                                     color = "grey30",
                                     margin = margin(b = 20, t = 10))) +
  # animuji podle času
  transition_reveal(date_valid) +
  # osa X fixní, ale Y překresluji podle aktuální škály dat
  view_follow(fixed_x = T)

# vlastní implementace animace
animate(animak, nframes = 2*nrow(raw_rates) + 75, 
        end_pause = 5*15, fps = 15, height = 600, width = 800)