Cel analizy

Celem poniższych rozważań jest zaprezentowanie podstawowych zagadnień z zakresu analizy finansowych szeregów czasowych oraz analizy zmienności na przykładzie dziennych notowań indeksu WIG20 na tle innych indeksów w okresie od 01-01-2012 do 01-12-2022.W tym celu wykorzystane zostaną narzędzia analityczne dostępne w programie R - proste modele, statystyki oraz wykresy. Dane wykorzystane w dalszej części pracy pochodzą ze strony www.stooq.com. Już na wstępie trzeba zaznaczyć, że w analizowanym okresie inwestycja w główny polski indeks giełdowy nie należała do najbardziej rentownych, co pokazuje wykres poniżej.

#stworzenie wykresu wartości WIG 20
plot(wig20$Zamkniecie, type = "l", ylab = "WIG 20 Close", xlab = "data",
     axes=FALSE, main="Poziom indeksu WIG 20 w latach 2012-2022")
axis(1, at = (0:5)*(2726/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)

summary(wig20$Zamkniecie)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    1306    1972    2250    2169    2373    2630
#obliczenie logarytmicznych stóp zwrotu z WIG 20
log_wig20<-diff(log(wig20$Zamkniecie))
#stworzenie wykresu logarytmicznych stóp zwrotu
plot(log_wig20, type = "l", ylim = c(-0.15,0.15),
     ylab = "stopy zwrotu", xlab = "data",axes=FALSE, 
     main="Logarytmiczne dzienne stopy zwrotu z indeksu WIG 20")
axis(1, at = (0:5)*(2725/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)

summary(log_wig20)
##        Min.     1st Qu.      Median        Mean     3rd Qu.        Max. 
## -0.14245579 -0.00693044  0.00005441 -0.00007958  0.00689388  0.08099498
#zdefiniowanie zmiennych 
dd<-density(log_wig20)
mean_log_wig20<-mean(log_wig20)
sd_log_wig20<-sd(log_wig20)
skew_log_wig20<-sum((log_wig20-mean_log_wig20)^3)/(length(log_wig20)-1)/sd_log_wig20^3
curt_log_wig20<-sum((log_wig20-mean_log_wig20)^4)/(length(log_wig20)-1)/sd_log_wig20^4
#stworzenie histogramu stóp zwrotu z rozkładem normalnym w tle
hist(log_wig20, main="histogram logarytmicznych dziennych stop zwrotu",
     xlim = c(-0.10,0.10),  xlab="stopy zwrotu (%)", breaks=("FD"), freq=FALSE)
lines(dd$x,dnorm(dd$x,mean_log_wig20,sd_log_wig20),col="blue",lwd=2)

qqPlot(log_wig20, main="QQ-plot logarytmicznych stop zwrotu")

## [1] 2041 2532
shapiro.test(log_wig20)
## 
##  Shapiro-Wilk normality test
## 
## data:  log_wig20
## W = 0.94052, p-value < 0.00000000000000022

Analiza rozkładu dziennych logarytmicznych stóp zwrotu

Porównanie empirycznego rozkładu dziennych logarytmicznych stóp zwrotu z teoretycznym rozkładem normalnym wskazuje, iż są one do siebie wizualnie zbliżone. Jednak analiza wykresu kwantyl-kwantyl ujawnia występowanie w próbie obserwacji skrajnych (tzw. grubych ogonów), które są jedną z charakterystycznych cech finansowych szeregów czasowych. Następnie wartość współczynnika skośności na poziomie -0,79 oznacza silną ujemną (lewostronną) asymetrię, z kolei wartość kurtozy na poziomie 12,63 potwierdza leptokurtyczność rozkładu. Ostatecznie przeprowadzenie testu Shapiro-Wilk’a pozwala w sformalizowany spozób pozwala odrzucić hipotezę zerową o normalności badanego rozkładu. Ponadto na podstawie testu ADF możemy stwierdzić, że badany szereg logarytmicznych stóp procentowych jest stacjonarny.

adf.test(log_wig20)
## Warning in adf.test(log_wig20): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  log_wig20
## Dickey-Fuller = -13.405, Lag order = 13, p-value = 0.01
## alternative hypothesis: stationary

Analiza zmienności i ryzyka

Celem nniejszej sekcji jest obliczenie i przedstawienie na wykresach jednodniowych Value at Risk (VaR) i Expected Shortfaall (ES). Wskaźnik wartości narażonej na ryzyko (VaR) informuje, jaka jest najwyższa strata przy założonym poziomie zaufania (dalej przyjęto poziom zaufania 0.99), natomiast wskaźnik ES - jaka jest średnia strata w przypadku wyjścia poza przyjęty poziom zaufania. Wskaźniki te zostaną oszacowane na podstawie danych historycznych i na podstawie rozkłądu normalnego o parametrach rozkładu empirycznego.

#obliczenie VaR i ES na podstawie danych historycznych oraz stworzenie wykresu
log_wig20_sorted<-sort(log_wig20)
log_wig20_0.01<-floor(length(sort(log_wig20))*0.01)
VaR_v1<-log_wig20_sorted[log_wig20_0.01]
ES_v1<-mean(log_wig20_sorted[1:log_wig20_0.01])
hist(log_wig20, main="VaR i ES (dane historyczne) przy prawdopodobienstwie strat 1%",
     xlim = c(-0.10,0.10),  xlab="stopy zwrotu (%)", breaks=("FD"), freq=FALSE)
abline(v=VaR_v1, col="blue", lty=2)
abline(v=ES_v1, col="red", lty=2)
legend(0.05,40,col = c("blue","red"), lty=c(2,2), c("VaR","ES"))

#obliczenie VaR i ES na podstawie rozkładu normalnego oraz stworzenie wykresu
VaR_v2<-qnorm(0.01)*sd_log_wig20+mean_log_wig20
ES_v2<-mean_log_wig20-sd_log_wig20*dnorm(qnorm(0.01))/0.01
plot(dd$x,dnorm(dd$x,mean_log_wig20,sd_log_wig20), ty="l", xlim = c(-0.10,0.10), 
     main="VaR i ES (rozklad normalny) przy prawdopodobienstwie strat 1%",
     xlab="stopy zwrotu (%)",ylab="density")
abline(v=VaR_v2, col="blue", lty=2)
abline(v=ES_v2, col="red", lty=2)
legend(0.05,30,col = c("blue","red"), lty=c(2,2), c("VaR","ES"))

Przy poziomie zaufania równym 0,99 zastosowanie danych historycznych dało oszacowanie wskaźników na poziomie VaR=3,35% oraz ES=5,17%, z kolei wykorzystanie rozkładu normalnego - VaR=3,04% oraz ES=3,48%. Można zauważyć, że wskaźniki uzyskane na podstawie rozkłądu normalnego przyjmują niższe wartości (w szczególności dotyczy to wskaźnika ES). Wiąże się to z faktem, iż rozkład normalny nie uwzględnia tzw. “grubych ogonów”, o których już była mowa, a których występowanie jest szczególnie istotne przy oblicznaiu VaR i ES, bowiem oba wskaźniki skupiają się na obserwacjach skrajnych. Z tego względu lepsze wyniki oszacowania wskaźników dostarczyć może rozkład t-Studenta, który przy niższych wartościach stopni swoboby cechuje się właśnie owymi “grubymi ogonami”

Analiza stóp zwrotu z WIG 20

Inwestycja oszczędności w WIG20 w analizowanym okresie zdecydowanie nie należała do kategorii inwestycji bezpiecznych i o długoterminowym, stabilnym trendzie wzrostowym. Czynniki ryzyka oddziałująca na poziom WIG20 miały różnorodny charakter: lokalny - przesilenia polityczne w 2015 roku związane z wyborami prezydenckimi i parlamentarnymi, kryzysem wokół Trybunału Konstytucyjnego oraz zapowiedziami dalszych reform legislacyjnych, regionalny - wybuch wojny w Ukrainie w lutym 2022 roku oraz globalny - pandemia wirusa SARS-CoV-2 ogłoszona przez WHO w marcu 2020 roku. W związku z powyższymi wydarzeniami w 2015 roku WIG20 spadł o prawie 19,5%, 12 marca - dzień po ogłoszeniu stanu globalnej pandemii przez WHO - WIG20 osiągnął swój najniższy poziom w analizowanym okresie (1305,73), natomiast w od początku roku 2022 do końca analizowanego okresu - w związku z pogarszającą się koniunkturą oraz wybuchem wojny - WIG20 spadł o 22,75%. Podobnie w całym analizowanym okresie - od 01-01-2012 do 01-12-2022 - inwestycja w WIG 20 przyyniosła straty w wysokości 19,5%, jednak należy podkreślić, że w analizowanym horyzoncie czasowym występowały okresy hossy giełdowej pozwalające na zamknięcie długiej pozycji w WIG20 z zyskiem.

#r wig20 w 2015
wig20[wig20$Data=="2015-12-30",5]/wig20[wig20$Data=="2015-01-02",5]-1
#minimum dla wig20 
wig20[wig20$Zamkniecie==min(wig20$Zamkniecie),1]
min(wig20$Zamkniecie)
#r wig 20 w 2022
wig20[wig20$Data=="2022-12-01",5]/wig20[wig20$Data=="2022-01-03",5]-1
#r wig 20 w całym analizowanym okresie
wig20[2726,5]/wig20[1,5]-1
#załadowanie danych i stworzenie plot frame
snp500<-read.csv("^spx_d.csv")
ftse250<-read.csv("^ftm_d.csv")
dax30<-read.csv("^dax_d.csv")
cac40<-read.csv("^cac_d.csv")
par(mfrow=c(2,2))
#SNP 500
plot(snp500$Zamkniecie, type = "l", ylab = "S&P 500 Close", xlab = "data",
     axes=FALSE, main="S&P 500")
axis(1, at = (0:5)*(2748/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)
#FTSE250
plot(ftse250$Zamkniecie, type = "l", ylab = "FTSE 250 Close", xlab = "data",
     axes=FALSE, main="FTSE 250")
axis(1, at = (0:5)*(2760/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)
#CAC40
plot(cac40$Zamkniecie, type = "l", ylab = "CAC 40 Close", xlab = "data",
     axes=FALSE, main="CAC 40")
axis(1, at = (0:5)*(2796/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)
#DAX30
plot(snp500$Zamkniecie, type = "l", ylab = "DAX 30 Close", xlab = "data",
     axes=FALSE, main="DAX 30")
axis(1, at = (0:5)*(2767/5), labels = c("2012","2014","2016","2018","2020","2022"))
axis(2)

WIG 20 na tle innych indeksów

W analizowanym okresie stopa zwrotu z WIG 20 wynosiła -19,5%, podczas gdy stopa zwrotu z S&P500 wynosiła 219,22%, z FTSE 250 wynosiła 87,31%, z CAC 40 wynosiła 109,6%, a z DAX 30 wynosiła 138,5%. Oznacza to, że zagraniczne indeksy były zdecydowanie lepszymi lokatami dla oszczędności niż polskki WIG 20. Na tle wszystkich indeksów wyróżnia się S&P 500. Inwestycja w S&P 500 wiązałą się bowiem z ponad dwukrotnym zwrotem zainwestowanego kapitału. Podobnie S&P 500 i DAX 30 okazały się odporne na zagrożenie pandemiczne i szybko osiągnęły poziomy wyższe niż przed pandemią, mniej dynamicznie przebiegał ten proces w przypadku CAC 40 i TFSE 250. W przypadku tego ostatniego notującego najgorsze wyniki z całej czwórki pojawia się pytanie o wpływ brexitu - decyzji o wystąpieniu Wielkiej Brytanii z Unii Europejskiej - na notowania brytyjskich indeksów oraz perspektywy wzrostu gospodarczego kraju. W każdym przypadku jednak zagraniczne indeksy są dużo bezpieczniejszymi i o wiele bardziej rentownymi inwestycjami niż polski WIG 20.

#obliczenie stóp zwrotu z indeksów
snp500[2748,5]/snp500[1,5]-1
ftse250[2760,5]/ftse250[1,5]-1
cac40[2796,5]/cac40[1,5]-1
dax30[2767,5]/dax30[1,5]-1

Prophet Model

library("lubridate")
library("prophet")
data<- wig20[c(1,5)]
colnames(data)<- c("ds","y")
Model1<-prophet(data)
Future1<- make_future_dataframe(Model1,periods=365)
Forecast1<-predict(Model1,Future1)
dyplot.prophet(Model1,Forecast1)
prophet_plot_components(Model1,Forecast1)