Nazaj finance R

Uvod

Krivulja donosnosti obveznic (angl. yield curve) se pogosto uporablja kot indikator prihajajoče recesije. V tem prispevku se bomo osredotočili na krivuljo donosnosti ameriških obveznic in hipotezo preverili na zgodovinskih podatkih.

Kaj je krivulja donosnosti obveznic?

Krivulja donosnosti obvezni je črta, ki povezuje donose različnih zapadlosti obveznic. Krivulja je ponavadi obrnjena navzgor in pogosto ni ravna črta, kar je odvisno od tveganja, segmentacije, likvidnosti in ostalih bolj kompleksnih elementov. Ko se krivulja obrne, so donosi kratkoročnih obveznic večji od donosov dolgoročnih obveznic. Razlogov za obrat je več, vendar se pogosto obrat interpretira kot znak prihajajoče recesije.

Zakaj naj bi obrnjena krivulja donosnosti obveznic napovedovala recesijo? To sicer ni nobena zakonitost, a vlagatelji in finančni svetovalci pogosto verjamejo, da omenjeno drži, ker:

Trenutni ni splošnega soglasja o tem, kateri del krivulje donosnosti obveznic naj uporabimo za za napovedovanje recesije. Pogosto se sicer uporabljajo donosi kratkoročnih in dolgoročnih obveznic, kjer se osredotočimo na medsebojne razlike.

Pri analizi podatkov bomo potrebovali knjižnico xlsx, s katero bomo prebrali podatke iz Excel datoteke (Federal Reserve Bank of New York 2021) in knjižnico tidyverse za manipulacijo s podatki in njihovo vizualizacijo.

library(xlsx)
library(tidyverse)

Podatki Federal Reserve Bank of New York (2021) so na voljo v obliki Excel datoteke (glej tabelo 1). Vsaka vrstica predstavlja povzetek tekočega meseca od leta \(1959\) naprej, kjer je na voljo donosnost \(10\) letne in \(3\) mesečne obveznice, medsebojna razlika v donosu, napovedana verjetnost recesije in dejanski indikator ali je recesija prisotna.

podatki <-
  read.xlsx2(
    file = "data/allmonth.xls", sheetIndex = 1, check.names = FALSE, 
    colClasses = c("integer", rep("numeric", 6))
  ) %>%
  mutate_at(2:7, function(x) { ifelse(is.nan(x), NA, x) }) %>%
  mutate(Date = as.Date(Date, origin = "1899-12-30"))
Tabela 1: Podatki iz Federal Reserve Bank of New York (2021)

Iz podatkov izluščimo začetke in konce vseh gospodarskih recesij v ZDA ter dodajmo kratke opise (glej tabelo 2), ki jih bomo prikazali na grafu 1.

recesije <-
  podatki %>%
  select(Date, NBER_Rec) %>%
  filter(!is.na(NBER_Rec)) %>%
  mutate(
    NBER_Rec_prev = lag(NBER_Rec),
    NBER_Rec_next = lead(NBER_Rec),
    akcija = ifelse((NBER_Rec_prev == 0 | is.na(NBER_Rec_prev)) & NBER_Rec == 1, "zacetek", NA),
    akcija = ifelse((NBER_Rec_next == 0 | is.na(NBER_Rec_next)) & NBER_Rec == 1, "konec", akcija)
  ) %>%
  filter(!is.na(akcija)) %>%
  select(Date, akcija) %>%
  rownames_to_column(var = "id") %>%
  mutate(id = ceiling(as.numeric(id)/2)) %>%
  pivot_wider(names_from = akcija, values_from = Date) %>%
  select(-id) %>%
  cbind("Opis" = c(
    "Recesija 1960-61", "Recesija 1970", "Recesija 1973-75", "Recesija 1980", "Recesija 1981-82", 
    "Recesija 1990-91", "Recesija 2001", "Velika recesija 2008-09", "COVID-19 recesija"
  ))
Tabela 2: Gospodarske recesije od leta \(1959\) naprej
Začetek Konec Opis
1960-05-31 1961-02-28 Recesija 1960-61
1970-01-31 1970-11-30 Recesija 1970
1973-12-31 1975-03-31 Recesija 1973-75
1980-02-29 1980-07-31 Recesija 1980
1981-08-31 1982-11-30 Recesija 1981-82
1990-08-31 1991-03-31 Recesija 1990-91
2001-04-30 2001-11-30 Recesija 2001
2008-01-31 2009-06-30 Velika recesija 2008-09
2020-03-31 2020-11-30 COVID-19 recesija

Graf na sliki 1 prikazuje razliko v donosu dolgoročnih (10 letnih) in kratkoročnih (3 mesečnih) ameriških obveznic, kjer so zasenčeno s sivo barvo označena obdobja gospodarskih recesij.

yMin <- min(podatki[, "Spread"], na.rm = TRUE)
yMax <- max(podatki[, "Spread"], na.rm = TRUE)

podatki %>%
  filter(!is.na(Spread)) %>%
  ggplot(aes(x = Date, y = Spread)) +
  geom_hline(yintercept = 0, linetype = "dotted", color = "gray", size = .3) +
  geom_rect(
    data = recesije %>% mutate(Date = zacetek, Spread = 0), alpha = .1, 
    mapping = aes(xmin = zacetek, xmax = konec, ymin = yMin, ymax = yMax)
  ) +
  geom_line(color = "blue") +
  geom_label_repel(
    data = recesije %>% 
      mutate(
        Date = recesije$zacetek + difftime(recesije$konec, recesije$zacetek)/2, 
        Spread = yMax
      ),
    mapping = aes(label = Opis),
    force = 10,
    direction = "both",
    nudge_y = 1, 
    color = "gray", size = 4
  ) +
  ylim(c(yMin, yMax * 1.3)) +
  xlab("") + ylab("Razlika v donosu (%)") +
  theme_classic() + 
  theme(
    axis.text = element_text(size = 12),
    axis.title = element_text(size = 12)
  )