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)