Wprowadzenie

Celem pracy jest analiza kointegracji trzech par spółek notowanych na GPW oraz analiza strategii inwestycyjnej pair trading. Przyjęty został okres od 2020-01-01 do 2022-12-31.

Co to kointegracja?

Kointegracja odnosi się do statystycznego pojęcia, które opisuje długoterminowe powiązanie lub zależność między dwiema lub więcej zmiennymi. W kontekście analizy szeregów czasowych, kointegracja występuje, gdy dwie lub więcej szeregów czasowych są statystycznie zależne od siebie w długim okresie, pomimo możliwości występowania krótkookresowych fluktuacji.

W praktyce kointegracja jest szczególnie istotna w analizie finansowej i ekonometrycznej, zwłaszcza przy badaniu zależności między cenami akcji, kursami walut, stopami procentowymi i innymi zmiennymi finansowymi. Kointegracja sugeruje, że nawet jeśli te szeregi czasowe mogą się krótkoterminowo oddzielać, to długoterminowo istnieje stałe powiązanie między nimi.

Badane spółki

W badaniu wzięliśmy pod uwagę trzy pary spółek, należących do tego samego sektora:

  • sektor bankowy: mBank i Alior Bank
  • branża odzieżowa: CCC i LPP
  • sektor nieruchomości: ECHO i ATAL

Chcemy zbadać, czy występują kointegracje wewnątrz-sektorowe i jak są one silne.

# Pobieranie danych ze strony stooq.pl
rm(list=ls())

spolki=c("alr","mbk")

dane_spolek<-data.frame()


p1='https://stooq.pl/q/d/l/?s='
p3='&i=d'

for (spolka in spolki){
  
  # Konstrukcja adresu do pobrania danych ze stooq
  do_czytania=paste0(p1, spolka, p3)
  print(do_czytania)
  
  # Pobranie sciezki do zapisania danych
  do_zapisu=getwd()
  print(do_zapisu)
  
  # Konstrukcja sciezki do zapisu danych
  plik_do_zapisu=paste0(do_zapisu, "/", spolka, ".csv")
  print(plik_do_zapisu)
  
  # Odczyt danych (Tylko Data i Cena zamkniecia)
  dane = read.csv(do_czytania, sep=',', colClasses=c(NA, "NULL", "NULL", "NULL", NA, "NULL"))
  
  # Transformacja typu daty z Character na Date
  dane$Data <- as.Date(dane$Data, format = "%Y-%m-%d")
  
  # Ograniczenie zakresu danych do okresu od roku 2020 do 2022
  dane <- dane[dane$Data > "2020-01-01" & dane$Data < "2023-01-01",]
  
  # Dodanie nazwy spółki
  dane$Spolka <- spolka
  
  dane$Roznica_ceny <- c(NA, diff(dane$Zamkniecie))
  
  # Przypisanie danych do spolki
  dane_spolek <- rbind(dane_spolek, dane)
  
  # Usuniecie tymczasowej zmiennych
  rm(dane)
  
  # Pobranie pliku
  download.file(do_czytania, plik_do_zapisu)
}
## [1] "https://stooq.pl/q/d/l/?s=alr&i=d"
## [1] "C:/Users/sobcz/Downloads"
## [1] "C:/Users/sobcz/Downloads/alr.csv"
## [1] "https://stooq.pl/q/d/l/?s=mbk&i=d"
## [1] "C:/Users/sobcz/Downloads"
## [1] "C:/Users/sobcz/Downloads/mbk.csv"

Badanie kointegracji

dane_spolek %>%
  ggplot( aes(x=Data, y=Zamkniecie, group=Spolka, color=Spolka)) +
    geom_line() +
    scale_color_viridis(discrete = TRUE) +
    ggtitle("Indeksy cen zamknięcia spółek") +
    theme_ipsum() +
    ylab("Cena zamkniecia")
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): rodzina
## czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): rodzina
## czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): rodzina
## czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_stringMetric, as.graphicsAnnot(x$label)): rodzina
## czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

# Wybranie danych tylko MBanku
dane_mbank <- dane_spolek %>%
  filter(Spolka=="mbk") %>%
  filter(!is.na(Roznica_ceny))

# Narysowanie wykresu roznicy cen dla MBank
dane_mbank %>%
  ggplot( aes(x=Data, y=Roznica_ceny)) +
    geom_line() +
    ggtitle("Pierwsze różnice cen zamknięcia spółki MBank") +
    theme_ipsum() +
    ylab("Pierwsze różnice ceny zamknięcia")
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

# Wybranie danych tylko Aliora
dane_alior <- dane_spolek %>%
  filter(Spolka=="alr") %>%
  filter(!is.na(Roznica_ceny))

# Narysowanie wykresu roznicy cen dla Alior
dane_alior %>%
  ggplot( aes(x=Data, y=Roznica_ceny)) +
    geom_line() +
    ggtitle("Pierwsze różnice cen zamknięcia spółki Alior") +
    theme_ipsum() +
    ylab("Pierwsze różnice ceny zamknięcia")
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows

## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call.graphics(C_text, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows
## Warning in grid.Call(C_textBounds, as.graphicsAnnot(x$label), x$x, x$y, :
## rodzina czcionek nie została znaleziona w bazie czcionek systemu Windows