Streszczenie

Celem niniejszej pracy jest przeprowadzenie analizy rentowności trzech lokat strukturyzowanych: opartych na kursie EUR/PLN - Range accural EUR/PLN - GETIN Noble Bank, Call Spread EUR/PLN - GETIN Noble Bank, ILT Suma procentów 26 - ING Bank Śląski. Badanie zostało podzielone na 3 etapy stanowiące odrębne podejścia do zagadnienia modelowania kursu EUR/PLN. W pierwszym ałożeniu niezależności kierunku zwrotu od poprzednich kierunków zwrotu. W drugim ouchylono to założenie i dokonano modelowania kursu za pomocą łańcucha Markowa. Natomiast w trzecim wykorzystano modelowanie warunkowej wariancji w oparciu o model eGARCH.

Wprowadzenie

Lokaty strukturyzowane oparte na kursach walutowych stały się w ostatnim czasie bardzo popularnym sposobem oszczędzania. Zasadniczo lokaty strukturyzowane składają się z dwóch składowych - części bazowej, czyli części środków lokowanych w bezpiecznych instrumentach oraz części inwestowanej w produkty finansowe o wyższym ryzyku (i potencjalnie wyższym zysku). Lokaty strukturyzowane cechują się pełną lub częściową ochroną kapitału, która to ochrona zapewniana jest przez część bazową. Część ryzykowna ma zapewnić klientowi możliwość osiągnięcia zysku wyższego niż ze standardowych lokat bankowych. W ostatnim czasie na rynku bankowym można zaobserwować znaczną liczbę lokat strukturyzowanych, w których część ryzykowna oparta jest na kursie walutowym. Zakładają one, że w czasie trwania lokaty kurs jednej waluty do drugiej będzie cechował się pewnymi prawidłowościami (np. wzrośnie do pewnego poziomu, spadnie do pewnego poziomu, pozostanie w określonych widełkach). Obecnie praktycznie każdy bank w Polsce ma w swojej ofercie pewien wariant takiej strukturyzowanej lokaty opartej na kursie walutowym (najczęściej EUR/PLN lub USD/PLN). Lokaty te często kuszą zyskiem wielokrotnie wyższym niż ten “bezpieczny” oferowany na standardowych lokatach. Czy jednak rzeczywiście lokaty strukturyzowane mogą zapewnić klientom większy zysk? Celem tej pracy jest odpowiedź na to pytanie. Stworzono pewien hipotetyczny scenariusz i hipotetycznego inwestora, który ma do wyboru cztery lokaty - jedną “standardową”, całkowicie bezpieczną oraz trzy strukturyzowane oparte na kursie EUR/PLN. Na podstawie symulacji tego kursu określono średnią rentowność dla wszystkich lokat oraz prawdopodobieństwo osiągnięcia zysku większego niż na lokacie “bezpiecznej”. Konstrukcja pracy jest następująca. W pierwszej kolejności zaprezentowano rozważany hipotetyczny scenariusz, wybrane, porównywane lokaty oraz założenia co do czasu trwania inwestycji. Następnie przeprowadzono dwa podejścia do modelowania kursu. Pierwsze podejście polegało na dopasowaniu historycznego rozkładu zwrotów do któregoś z rozkładów teoretycznych i symulacji na podstawie zwrotów generowanych z tego rozkładu. Drugie podejście było podobne, jednak kierunek (spadek/wzrost) modelowano na podstawie realizacji procesu Markowa.

Scenariusz symulacji

Załóżmy, że pewien hipotetyczny inwestor (dalej: inwestor) dnia 31 maja 2016 roku decyduje się na włożenie części oszczędności na lokatę bankową na czas jednego roku. Inwestor chce albo zainwestować w bezpieczną lokatę, albo w którąś z lokat strukturyzowanych opartych na kursie Euro. Oczywiście inwestor chciałby osiągnąć jak najwyższy zysk, a więc chciałby sprawdzić, która z lokat mu to zapewni. Poniżej zaprezentowano wybrane lokaty:

  1. LOKATA BEZPIECZNA (LB) - EKOlokata z Bonusem - BOŚ Bank

Inwestor, jako lokatę bezpieczną wybrał tę 12 miesięczną lokatę, która zapewniała najwyższy zysk, miała stałe oprocentowanie i nie była obarczona dodatkowymi warunkami (np. koniecznością zakładania konta). Taką lokatą była EKOlokata z Bonusem oferowana przez BOŚ Bank (http://www.bankier.pl/wiadomosc/Ranking-lokat-Bankier-pl-12M-maj-2016-7396442,2.html).

  1. LOKATA STRUKTURYZOWANA I (LSI) - Range accural EUR/PLN - GETIN Noble Bank

https://www.analizy.pl/fundusze/produkty-strukturyzowane/produkt/PSNOB298/Range-accrual-EURPLN-maj-2016.html Czas trwania inwestycji w tym przypadku to 6 czerwca 2016 - 6 czerwca 2017. Odsetki wyliczane są wg wzoru:

\(4\%*n/N\)

, gdzie \(n\) to liczba obserwacji, w których kurs EUR-PLN będzie miał wartość w przedziale [KS-GD, KS+GG]. Liczone średnim kursem publikowanym przez NBP w tabeli A, gdzie KS to kurs z 6 czerwca 2016, GD \(\in [0, 0.13]\), GG \(\in [0, 0.13]\) oraz GD+GG \(\geq 0.16\). Jako, że inwestor nie zna granicy górnej i dolnej w momencie inwestowania założono trzy scenariusze dla LSI:

           a. Scenariusz optymistyczny (LSI-O), w którym granica dolna i górna ustalane są na 0.13.

           b. Scenariusz średni (LSI-S), w którym granica dolna i górna ustalane są na 0.105

           c. Scenariusz pesymistyczny (LSI-P), w którym granica gorna i dolna ustalane są na 0.08.

  1. LOKATA STRUKTURYZOWANA II (LSII) - Call Spread EUR/PLN - GETIN Noble Bank

https://www.analizy.pl/fundusze/produkty-strukturyzowane/produkt/PSNOB299/Call-spread-EURPLN-maj-2016.html Czas trwania inwestycji w tym przypadku to 6 czerwca 2016 - 5 czerwca 2017. Odsetki wyliczane są wg wzoru:

\(max[min[(KK-KS)*100\%*WU;5\%];0\%]\)

, gdzie KK to kurs z dnia 5 czerwca 2017, a KS to kurs z dnia 6 czerwca 2016. WU to współczynnik udziału i \(WU \in [0.1,0.2]\). Jako, że inwestor nie zna wartości WU w momencie inwestowania założono trzy scenariusze dla LSII:

           a. Scenariusz optymistyczny (LSII-O), w którym WU zostało ustalone na 0.2.

           b. Scenariusz średni (LSII-S), w którym WU zostało ustalone na 0.15

           c. Scenariusz pesymistyczny (LSII-P), w którym WU zostało ustalone na 0.1.

  1. LOKATA STRUKTURYZOWANA III (LSIII) - ILT Suma procentów 26 - ING Bank Śląski

https://www.analizy.pl/fundusze/produkty-strukturyzowane/produkt/PSING187/ILT--Suma-Procentow-26.html Czas trwania inwestycji w tym przypadku to 7 czerwca 2016 - 6 czerwca 2017. Odsetki wyliczane są wg wzoru:

\(12*n*0.28\%\)

, gdzie n to liczba dni spośród: 5.07.2016, 5.08.2016, 2.09.2016, 5.10.2016, 4.11.2016, 2.12.2016, 5.01.2017, 2.02.2017, 2.03.2017, 5.04.2017, 5.05.2017, 2.06.2017, w których kurs będzie wynosił: w pierwszych trzech miesiącach [KS-PB, KS], a w kolejnych dziewięciu [4.2, 4.3]. KS to kurs 6 czerwca 2016, a PB wynosi od 0.08 do 0.12. Jako, że inwestor nie zna wartości PB w momencie inwestowania założono trzy scenariusze dla LSIII:

           a. Scenariusz optymistyczny (LSIII-O), w którym PB ustalono na 0.12

           b. Scenariusz średni (LSIII-S), w którym PB ustalono na 0.10

           c. Scenariusz pesymistyczny (LSIII-P), w którym PB ustalono na 0.08.

Mamy zatem trzy sposoby wyliczania odsetek na podstawie kursu EUR/PLN. W pierwszej odsetki zależą od kursu w każdym dniu lokaty. W drugim zależą od kursu w wybranych datach, a w trzecim wyłącznie od kursów otwarcia i zamknięcia.

Dane

Dane dot. historycznych kursów Euro w stosunku do Złotego pobrano ze strony stooq.pl. Niech tabela X zawiera niezbędne dane. Naszą analizę przeprowadzamy na 31 maja 2016 (tego dnia inwestor zastanawia się, którą lokatę wybrać). Mamy zamiar modelować zwroty i kursy. Aby uniknąć cechujących się dużą zmiennością kursów z lat 2007-2009 patrzymy na kursy od 1 stycznia 2010 do 31 maja 2016. Interesuje nas kurs dla danego dnia. Przyjmijmy, że kursem tym (kursem średnim) będzie średnią arytmetyczną z kursu otwarcia i kursu zamknięcia danego dnia. Przyda się również kilka obserwacji z końca roku 2009 - oznaczmy X_poprz.

X$kurs<-(X$Otwarcie+X$Zamkniecie)/2
X<-X[X$Data>"2010-01-01" & X$Data<="2016-05-31",]
X<-X[,c(1,6)]

X_poprz$kurs<-(X_poprz$Otwarcie+X_poprz$Zamkniecie)/2
X_poprz<-X_poprz[X_poprz$Data>"2009-12-01" & X_poprz$Data<="2009-12-31",]
X_poprz<-X_poprz[,c(1,6)]

Kurs EUR/PLN wygląda następująco:

wyk_k<-ggplot(X, aes(Data)) + 
  geom_line(aes(y = kurs), color="navy")+theme_bw()+xlab("EUR/PLN")+ylab("Data")
wyk_k

Stworzymy także bazową tablicę do symulacji, która będzie uwzględniać dni świąteczne i robocze:

Dates_b<-data.frame(seq(from=as.Date("2016-06-01"), to=as.Date("2017-06-07"), by="day"))
colnames(Dates_b)<-"Data"
Dates_b$dtyg<-c(rep(c("Wed", "Thu", "Fri", "Sat", "Sun", "Mon", "Tue"), 53), "Wed")
dni_ust_wolne<-as.Date(c("2017-01-01", "2017-01-06", "2017-04-16", "2017-04-17", "2017-05-01", "2017-05-03", "2017-06-04", "2016-08-15", "2016-11-01", "2016-11-11", "2016-12-25", "2016-12-26"))
dni_L3_1<-as.Date(c("2016-07-05", "2016-08-05", "2016-09-02"))
dni_L3_2<-as.Date(c("2016-10-05", "2016-11-04", "2016-12-02", "2017-01-05", "2017-02-02", "2017-03-02", "2017-04-05", "2017-05-05", "2017-06-02"))
Dates_b$Lok1<-ifelse(!Dates_b$dtyg%in%c("Sat", "Sun") & !Dates_b$Data%in%dni_ust_wolne, 1, 0)
Dates_b$Lok1[372]<-0
Dates_b$Lok1[1:6]<-0
Dates_b$Lok3<-ifelse(Dates_b$Data%in%dni_L3_1, 1, 
                     ifelse(Dates_b$Data%in%dni_L3_2, 2, 0))

W kolejnym kroku policzono dzienne zwroty tj. dzienne zmiany kursów średnich. Obliczono także zmienną Y określającą, czy konkretnego dnia obserwowaliśmy dodatni, czy ujemny zwrot. Y_1 oznacza czy poprzedniego dnia był wzrost lub spadek:

X_poprz$ret=0;
for(i in 2:length(X_poprz$Data)){
  X_poprz$ret[i]<-(X_poprz$kurs[i]-X_poprz$kurs[i-1])/X_poprz$kurs[i-1]
}

X$ret=0;
for(i in 2:length(X$Data)){
  X$ret[i]<-(X$kurs[i]-X$kurs[i-1])/X$kurs[i-1]
}

X$Y<-ifelse(X$ret>0, 1, 0)
X$Y_1<-lag.xts(X$Y, 1)
X$Y_1[1]<-0 # Co wiemy z X_poprz
X_poprz$Y<-ifelse(X_poprz$ret>0, 1, 0)

Modelowanie kursu - Podejście I - realizacja zmiennej losowej

W tym podejściu zakładamy, że dzienny zwrot jest realizacją pewnej zmiennej losowej i kolejne realizacje ciągu są od siebie niezależne. Zatem przeszłe wartości, ani przeszła zmienność nie będą wpływały na osiągnięty danego dnia zwrot, a co za tym idzie kurs. Spójrzmy na histogram zwrotów oraz wykres zwrotów:

## Histogram zwrotów
hist(X$ret[-1], breaks=seq(from=-0.035, to=0.03, by=0.002))

#Wykres zwrotów
wyk_z<-ggplot(X, aes(Data)) + 
  geom_line(aes(y = ret), color="navy")+theme_bw()+xlab("EUR/PLN - dzienny zwrot")+ylab("Data")
wyk_z

Spróbujemy teraz znaleźć teoretyczny rozkład zwrotów. W pierwszej kolejności przyjrzyjmy się wykresowi Cullena-Freya porównującego kurtozę i skośność do kwadratu z wartościami tych statystyk dla rozkładów teoretycznych:

descdist(X$ret, discrete = FALSE)

## summary statistics
## ------
## min:  -0.03208942   max:  0.02318027 
## median:  -7.393733e-05 
## mean:  5.044661e-05 
## estimated sd:  0.003885301 
## estimated skewness:  0.2016477 
## estimated kurtosis:  8.256435

Na podstawie powyższego wykresu widać, że rozkład zwrotów EUR/PLN ma skośność bliską zera tj. jest rozkładem zbliżonym do symetrycznego. Cechuje się on leptokurtycznością (co widać także na histogramie zwrotów) - kurtoza jest > 8. Ciężko uzasadnić zatem modelowanie zwrotów którymkolwiek z zaproponowanych rozkładów teoretycznych. Spróbujmy zatem dokonać przekształcenia, które pozwoliłoby poradzić sobie z leptokurtycznością i dopasować przekształconą zmienną do któregoś z rozkładów teoretycznych. Najprostszym sposobem jest logarytmowanie. Jednak wtedy problemem są ujemne zwroty. Problem ten możnaby pominąć, gdyby dodatnie i ujemne zwroty pochodziły z tego samego rozkładu (z dokładnością co do znaku). Wtedy możnaby logarytmować i modelować tylko dodatnie bądź ujemne zwroty. Sprawdźmy, czy zwroty dodatnie i ujemne pochodzą z tego samego rozkładu:

par(mfrow=c(1,2))
hist(X$ret[X$ret>0], breaks=seq(from=0, to=0.035, by=0.001))
hist(-1*X$ret[X$ret<0], breaks=seq(from=0, to=0.035, by=0.001))

ks.test(X$ret[X$ret>0], -X$ret[X$ret<0])
## 
##  Two-sample Kolmogorov-Smirnov test
## 
## data:  X$ret[X$ret > 0] and -X$ret[X$ret < 0]
## D = 0.041064, p-value = 0.4894
## alternative hypothesis: two-sided

Czyli test Kołmogorowa-Smirnova wskzauje, że z dokładnością co do znaku zwroty dodatnie i zwroty ujemne pochodzą z tego samego rozkładu. Można zatem przyjąć, że wartość zwrotu co do modułu jest realizacją pewnej zmiennej losowej, a kierunek zwrotu jest realizacją innej zmiennej losowej. Przyjmując, że Y jest zmienną losową przyjmującą 1 z prawdopodobieństwem p oraz -1 w przeciwnym przypadku oraz przyjmując, że Z jest nieujemną zmienną losową o znanym, ciągłym rozkładzie zmienną X, czyli zwrot danego dnia można przedstawić jako:

\(X=YZ\)

Gdyby dodatnie i ujemne zwroty nie pochodziły z tego samego rozkładu możnaby próbować osobno dopasowywać zwroty dodatnie oraz zwroty ujemne. Jako, że celem jest dobranie teoretycznego rozkładu jak najlepiej oddającego rozkład empiryczny przeprowadzona zostanie również taka analiza. Czyli w drugiej wersji rozważona zostanie zmienna:

\(X=X_{+}^{Z}*X_{-}^{Z}\)

, gdzie \(X_{+}\) jest zmienną losową o znanej gęstości określającą zwrot dodatni, \(X_{-}\) jest zmienną losową o znanej gęstości opisującą zwrot ujemny, a Z jest zmienną binarną przyjmującą 1 z prawdopodobieństwem p i 0 z prawdopodobieństwem 1-p. Wpierw zajmijmy się pierwszą wersją:

Podejście I - Wersja I - modelowanie łączne zwrotów dodatnich i ujemnych

Dokonajmy niezbędnych przekształceń oraz narysujmy wykres Cullena-Freya dla modułu zwrotu oraz dla logarytmu modułu zwrotu:

X_all<-X
X_all$ret<-abs(X_all$ret)
descdist(X_all$ret, discrete = FALSE)

## summary statistics
## ------
## min:  0   max:  0.03208942 
## median:  0.002036067 
## mean:  0.00278763 
## estimated sd:  0.002706019 
## estimated skewness:  2.605645 
## estimated kurtosis:  16.87103
# a co w przyp logarytmu (pominiemy zerowe zwroty):
X_all_ln<-X_all[X_all$ret!=0,]
X_all_ln$ln<-log(X_all_ln$ret, exp(1))
descdist(X_all_ln$ln, discrete = FALSE)

## summary statistics
## ------
## min:  -11.33358   max:  -3.439229 
## median:  -6.192808 
## mean:  -6.374715 
## estimated sd:  1.159933 
## estimated skewness:  -1.046741 
## estimated kurtosis:  4.719915

W obydwu przypadkach zdaje się pasować rozkład Gamma. W dalszej kolejności sprawdzamy różne rozkłady, które na wykresie są “blisko” punktu obserwacji tj. gamma, normalny, weibull, log-normalny i logistyczny. Aby umożliwić dopasowanie wszystkich powyższych rozkładów do danych wartość modułu zwrotu najpierw przemnożono przez współczynnik a (tak, by wszystkie logarytmy były dodatnie), a następnie zlogarytmowano. Taką operację wykonano ze względu na fakt, że parametry niektórych rozkładów nie mogły być policzone dla rzeczywistych zwrotów, a logarytmy musiały być dodatnie, również by zapewnić możliwość estymacji parametrów. Wykonane operacje mają jednak oczywiste funkcje odwrotne, a zatem powrót do rzeczywistych zwrotów w momencie symulacji będzie stosunkowo łatwy. Pominiemy także zerowe zwroty, co nie powinno być problemem, jako, że występują one zaledwie trzykrotnie. Obejrzyjmy wykresy dopasowań dla ww. rozkładów:

X_all<-X_all[X_all$ret!=0,]
1/min(abs(X$ret[X$ret!=0]))
## [1] 83582
a<-100000

## Poszukiwanie rozkładu dla dodatnich zwrotów
X_all$ret2<-X_all$ret*a
min(X_all$ret2)
## [1] 1.19643
X_all$ln<-log(X_all$ret2, exp(1))
fa.gamma<-fitdist(X_all$ln, "gamma")
fa.normal<-fitdist(X_all$ln, "norm")
fa.weibull<-fitdist(X_all$ln, "weibull")
fa.lnorm<-fitdist(X_all$ln, "lnorm")
fa.logis<-fitdist(X_all$ln, "logis")
plot(fa.gamma) # Rozkład Gamma

plot(fa.normal) # Rozkład Normalny

plot(fa.weibull) # Rozkład Weibulla

plot(fa.lnorm) # Rozkład logarytmiczny normalny

plot(fa.logis) # Rozkład logistyczny

Powyższe wykresy skłaniają ku rozkładowi Wiebulla. Najlepsze dopasowanie gęstości do danych wydają się mieć rozkłady Weibulla i logistyczny. Obydwa te rozłady mają również dobrze dopasowane dystrybuanty empiryczne i teoretyczne, jak i prawdopodobieństwa empiryczne i teoretyczne. Rozkład Weibulla wydaje się jednak mieć bardziej zbliżone do siebie kwantyle teoretyczne i empiryczne. Policzmy jeszcze AIC dla wszystkich rozkładów:

AIC<-c(fa.gamma$aic,fa.normal$aic,fa.weibull$aic,fa.lnorm$aic,fa.logis$aic)
names(AIC)<-c("Gamma", "Normalny", "Weibull", "Lognormalny", "Logistyczny")
print(AIC)
##       Gamma    Normalny     Weibull Lognormalny Logistyczny 
##    5790.069    5181.362    5112.804    6328.252    5092.912

Powyższe wyniki wskazują z kolei na rozkład logistyczny. Ma on najniższą wartość kryterium Akaike. Drugą najniższą wartością cechuje się rozkład Weibulla. Spróbujmy rozwiązać wybór pomiędzy tymi rozkładami za pomocą testu Kołmogorova-Smirnova:

ks.test(X_all$ln, "pweibull", shape=fa.weibull$estimate[1], scale=fa.weibull$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_all$ln
## D = 0.059137, p-value = 1.918e-05
## alternative hypothesis: two-sided
ks.test(X_all$ln, "plogis", location=fa.logis$estimate[1], scale=fa.logis$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_all$ln
## D = 0.043999, p-value = 0.003336
## alternative hypothesis: two-sided

Niestety test KS nie odpowiada na postawione pytanie. Póki co odłóżmy w czasie decyzję, który z rozkładów jest lepszy i zajmijmy się dopasowywaniem rozkładu za pomocą drugiego sposobu tj. zakładając, że rozkłady dodatnich i ujemnych zwrotów są różne.

Podejście I - Wersja II - modelowanie osobne zwrotów dodatnich i ujemnych - zwroty dodatnie

Analogicznie do rozważań z poprzedniego podrozdziału spróbujmy wymodelować zmienne \(X_{+}\) oraz \(X_{-}\). Zacznijmy od zwrotów dodatnich:

# modelowanie X+
X_plus<-X[X$ret>0,]
X_plus$ln<-log(X_plus$ret, exp(1))

X_plus$ret2<-X_plus$ret*a
X_plus$ln<-log(X_plus$ret2, exp(1))
f.gamma<-fitdist(X_plus$ln, "gamma")
f.normal<-fitdist(X_plus$ln, "norm")
f.weibull<-fitdist(X_plus$ln, "weibull")
f.lnorm<-fitdist(X_plus$ln, "lnorm")
f.logis<-fitdist(X_plus$ln, "logis")
# plot(f.gamma)
# plot(f.normal)
# plot(f.weibull)
# plot(f.lnorm)
# plot(f.logis)
AIC<-c(f.gamma$aic,f.normal$aic,f.weibull$aic,f.lnorm$aic,f.logis$aic)
names(AIC)<-c("Gamma", "Normalny", "Weibull", "Lognormalny", "Logistyczny")

Podobnie, jak w przypadku wersji pierwszej najlepszym dopasowaniem cechują się rozkłady Weibulla i Logistyczny. Również AIC wskazuje te dwa rozkłady jako najlepsze:

plot(f.weibull)

plot(f.logis)

print(AIC)
##       Gamma    Normalny     Weibull Lognormalny Logistyczny 
##    2913.425    2592.203    2572.567    3199.931    2549.985

Test K-S wskazuje jednak na rozkład logistyczny:

ks.test(X_plus$ln, "pweibull", shape=f.weibull$estimate[1], scale=f.weibull$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_plus$ln
## D = 0.05851, p-value = 0.007915
## alternative hypothesis: two-sided
ks.test(X_plus$ln, "plogis", location=f.logis$estimate[1], scale=f.logis$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_plus$ln
## D = 0.044357, p-value = 0.0832
## alternative hypothesis: two-sided

Podejście I - Wersja II - modelowanie osobne zwrotów dodatnich i ujemnych - zwroty ujemne

Rozważmy teraz zwroty ujemne

# modelowanie X-
X_min<-X[X$ret<0,]
X_min$ln<-log(-X_min$ret, exp(1))

X_min$ret2<-X_min$ret*a
X_min$ln<-log(-X_min$ret2, exp(1))
f2.gamma<-fitdist(X_min$ln, "gamma")
f2.normal<-fitdist(X_min$ln, "norm")
f2.weibull<-fitdist(X_min$ln, "weibull")
f2.lnorm<-fitdist(X_min$ln, "lnorm")
f2.logis<-fitdist(X_min$ln, "logis")
# plot(f2.gamma)
# plot(f2.normal)
# plot(f2.weibull)
# plot(f2.lnorm)
# plot(f2.logis)
AIC<-c(f2.gamma$aic,f2.normal$aic,f2.weibull$aic,f2.lnorm$aic,f2.logis$aic)
names(AIC)<-c("Gamma", "Normalny", "Weibull", "Lognormalny", "Logistyczny")

Podobnie, jak w przypadku wersji pierwszej oraz zwrotów dodatnich najlepszym dopasowaniem cechują się rozkłady Weibulla i Logistyczny. Również AIC wskazuje te dwa rozkłady jako najlepsze:

plot(f2.weibull)

plot(f2.logis)

print(AIC)
##       Gamma    Normalny     Weibull Lognormalny Logistyczny 
##    2871.376    2589.020    2537.865    3116.211    2543.613

Test K-S wskazuje na rozkład logistyczny:

ks.test(X_min$ln, "pweibull", shape=f2.weibull$estimate[1], scale=f2.weibull$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_min$ln
## D = 0.063893, p-value = 0.002034
## alternative hypothesis: two-sided
ks.test(X_min$ln, "plogis", location=f2.logis$estimate[1], scale=f2.logis$estimate[2])
## 
##  One-sample Kolmogorov-Smirnov test
## 
## data:  X_min$ln
## D = 0.049111, p-value = 0.03411
## alternative hypothesis: two-sided

Podejście I - wybór odpowiedniego rozkładu zwrotów

Z powyżsych rozważań należy wysnuć wniosek, że zarówno moduły zwrotów, jak i zwroty dodatnie i ujemne osobno najlepiej przybliżane są za pomocą rozkładów Weibulla i Logistycznego. Wyboru konkretnego, “najlepszego” rozkładu dokonamy za pomocą losowań i porównania statystyk ze statystykami rozkładu empirycznego. Rozważymy sześć dopasowań:

  1. [Weibull] - Losowanie modułu zwrotów z rozkładu Weibulla (Wersja I)
  2. [Logis] - Losowanie modułu zwrotów z rozkładu Logistycznego (Wersja I)
  3. [WW] - Losowanie zwrotów dodatnich i ujemnych z osobnych rozkładów Weibulla (Wersja II)
  4. [WL] - Losowanie zwrotów ujemnych z rozkładu Weibulla, a dodatnich z Logistycznego (Wersja II)
  5. [LW] - Losowanie zwrotów ujemnych z rozkładu Logistycznego, a dodatnich z Weibulla (Wersja II)
  6. [LL] - Losowanie zwrotów dodatnich i ujemnych z osobnych rozkładów Logistycznych (Wersja II)
W_plus<-rweibull(1000000, shape=f.weibull$estimate[1], scale=f.weibull$estimate[2])
l_plus<-rlogis(1000000, location=f.logis$estimate[1], scale=f.logis$estimate[2])
W_min<-rweibull(1000000, shape=f2.weibull$estimate[1], scale=f2.weibull$estimate[2])
l_min<-rlogis(1000000, location=f2.logis$estimate[1], scale=f2.logis$estimate[2])
W_all<-rweibull(1000000, shape=fa.weibull$estimate[1], scale=fa.weibull$estimate[2])
l_all<-rlogis(1000000, location=fa.logis$estimate[1], scale=fa.logis$estimate[2])

parametry<-data.frame(matrix(c(fa.weibull$estimate, fa.logis$estimate,f.weibull$estimate, f.logis$estimate, f2.weibull$estimate, f2.logis$estimate), ncol=2, nrow=6, byrow=T))

colnames(parametry)<-c("shape/location", "scale")
rownames(parametry)<-c("Weibull", "Logistyczny", "Dodatni Weibull", "Dodatni Logi", "Ujemny Weibull", "Ujemny Logi")
LOS<-data.frame(W_all, l_all, W_plus, l_plus, W_min, l_min)
rm("W_all", "l_all","W_plus", "W_min", "l_plus", "l_min")

Dokonajmy powrotnego przekształcenia. Dodatkowo określmy kierunek zwrotu. Oczywiście estymatorem MNW dla parametru p zmiennych Y i Z jest udział “sukcesów” w próbie, zatem:

LOS<-exp(LOS)
LOS<-LOS/a
p<-sum(X$ret>0)/sum(X$ret!=0)
for(i in 1:6){
  eval(parse(text=paste0("LOS$Y", i, "<-runif(1000000, min=0, max=1)")))
  eval(parse(text=paste0("LOS$Y", i, "<-ifelse(LOS$Y",i,"<=p, 1, 0)")))
}

LOS$Weibull<-ifelse(LOS$Y1==1, LOS$W_all, -LOS$W_all)
LOS$Logis<-ifelse(LOS$Y2==1, LOS$l_all, -LOS$l_all)
LOS$WW<-ifelse(LOS$Y3==1, LOS$W_plus, -LOS$W_min)
LOS$WL<-ifelse(LOS$Y4==1, LOS$l_plus, -LOS$W_min)
LOS$LW<-ifelse(LOS$Y5==1, LOS$W_plus, -LOS$l_min)
LOS$LL<-ifelse(LOS$Y6==1, LOS$l_plus, -LOS$l_min)

Mamy teraz sześć możliwych dopasowań. Przetestujmy zgodność rozkładów z empirycznym za pomocą testu Kołmogorova-Smirnova:

KTEST<-c(ks.test(X$ret, LOS$Weibull)$p, ks.test(X$ret, LOS$Logis)$p, ks.test(X$ret, LOS$WW)$p, ks.test(X$ret, LOS$WL)$p, ks.test(X$ret, LOS$LW)$p, ks.test(X$ret, LOS$LL)$p)
names(KTEST)<-colnames(LOS)[13:18]
print(KTEST)
##    Weibull      Logis         WW         WL         LW         LL 
## 0.06067599 0.14276563 0.06881705 0.06682303 0.14108323 0.24215831

Jak widać żaden test K-S nie odrzuca hipotezy zerowej o zgodności rozkładów. Spróbujmy zatem sprawdzić rozkłady na podstawie porównania statystyk teoretycznych i empirycznych. Zacznijmy od histogramów:

par(mfrow=c(3,2))
hist(LOS$Weibull, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

hist(LOS$Logis, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

hist(LOS$WW, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

hist(LOS$WL, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

hist(LOS$LW, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

hist(LOS$LL, col=rgb(0,0,1,0.5), breaks=100, freq=F)
hist(X$ret, col=rgb(1,0,0,0.5), breaks=30, freq=F, add=T)
box()

Histogramy wskazują na rozkłady “Weibull” lub “WW”. Rozkład logistyczny może notować ekstremalnie wysokie wartości zwrotów (kilkaset procent). W przypadku rozkładu Weibulla ma on większą gęstość w pobliżu średniej i grubsze ogony w porównaniu do rozkładu empirycznego. Ogólnie jednak dopasowania dla “Weibull” i dla “WW” wydają się satysfakcjonujące. Sprawdzimy teraz wartości statystyk opisowych i przedstawmy je na wykresach:

opis<-data.frame()
ret<-c(mean(X$ret), sd(X$ret), skewness(X$ret), kurtosis(X$ret), median(X$ret), quantile(X$ret)[2], quantile(X$ret)[4])
opis<-rbind(opis, ret)

for(i in 13:18){
  ret<-c(mean(LOS[,i]), sd(LOS[,i]), skewness(LOS[,i]), kurtosis(LOS[,i]), median(LOS[,i]),quantile(LOS[,i])[2], quantile(LOS[,i])[4])
  opis<-rbind(opis, ret)
}

colnames(opis)<-c("mean", "sd", "skewness", "kurtosis", "median", "Q1", "Q3")
rownames(opis)<-c("emp", "Weibull", "Logis", "WW", "WL", "LW", "LL")
opis$text<-rownames(opis)
opis$kolor<-c(1,0,0, 0, 0, 0, 0)

W pierwszej kolejności przyjrzyjmy się średnim oraz odchyleniom standardowym.

ms<-ggplot(opis)+theme_bw()+geom_point(aes(x=mean, y=sd), size=4, color="black")+xlab("Średnia")+ylab("Odchylenie standardowe")
ms<-ms+geom_label_repel(
  aes(mean, sd, fill = factor(kolor), label = rownames(opis)),
  fontface = 'bold', color = 'white',
  box.padding = unit(0.25, "lines"),
  point.padding = unit(0.5, "lines")
)+theme(legend.position="none")
ms

Powyższy wykres wyraźnie wskazuje na model “WW”. Na płaszczyźnie średnia, sd znajduje się najbliżej rozkładu empirycznego. Spójrzmy na skośność i kurtozę:

ks<-ggplot(opis)+theme_bw()+geom_point(aes(x=kurtosis, y=skewness), size=4, color="black")+xlab("Kurtoza")+ylab("Skośność")
ks<-ks+geom_label_repel(
  aes(kurtosis, skewness, fill = factor(kolor), label = rownames(opis)),
  fontface = 'bold', color = 'white',
  box.padding = unit(0.25, "lines"),
  point.padding = unit(0.5, "lines")
)+theme(legend.position="none")
ks

Rozkłady “WL”, “LL”, “LW” i “Logis” cechują się bardzo wysokimi wartościami kurtozy i skośności. Najbliżej rozkładu empirycznego są rozkłady “WW” oraz “Weibull”. Spójrzmy teraz na medianę oraz rozstęp międzykwartylowy:

opis$IQR<-opis$Q3-opis$Q1
mm<-ggplot(opis)+theme_bw()+geom_point(aes(x=IQR, y=median), size=4, color="black")+xlab("Rozstęp międzykwartylowy")+ylab("Mediana")
mm<-mm+geom_label_repel(
  aes(IQR, median, fill = factor(kolor), label = rownames(opis)),
  fontface = 'bold', color = 'white',
  box.padding = unit(0.25, "lines"),
  point.padding = unit(0.5, "lines")
)+theme(legend.position="none")
mm

Niestety, pod względem kwantyli wszystkie rozkłady teoretyczne są w znacznym stopniu odległe od rozkładu empirycznego. Ciężko wskazać mu najbliższy.

Podsumowując histogramy oraz trzy powyższe wykresy porównujące wartości statystyk opisowych najlepszym teoretycznym rozkładem dla zwrotów wydaje się rozkład “dwustronny”, gdzie zarówno dodatnie, jak i ujemne zwroty są losowane z (różnych) rozkładów Weibulla. Wykorzystamy go do symulacji zwrotów z lokat w części symulacyjnej. Wpierw rozważmy jeszcze inne podejście, bazujące na wyliczonym w tym rozdziale rozkładzie.

Modelowanie kursu - Podejście II - realizacja zmiennej losowej i łańcuch markowa

W podejściu pierwszym założyliśmy, że kierunek zwrotu, czyli to, czy zwrot jest dodatni, czy ujemny było czysto losowe, w szczególności nie zależało od poprzednich zwrotów, ani ich kierunków. Spróbujmy teraz uchylić to założenie. Załóżmy, że zwroty dodatnie i ujemne mają te same rozkłady, co poprzednio (gdyż kierunek nie miał na nie wpływu), jednak rozkład zmiennych Y i Z nie jest całkowicie losowy. Załóżmy, że Y i Z zależą od swoich poprzednich wartości. Można spodziewać się bowiem, że istnieją okresy, w których następuje więcej dodatnich zwrotów i takie, w których przeważają zwroty ujemne. Poglądowo spójrzmy na jeden okres wstecz, obliczając warunkowe prawdopodobieństwa:

MC_1<-data.frame(matrix(rep(0,4), nrow=2, ncol=2))
MC_1[1,1]<-sum(X$Y==1 & X$Y_1==1)/sum(X$Y_1==1)# P(Y_t=1|Y_(t-1)=1)
MC_1[1,2]<-sum(X$Y==0 & X$Y_1==1)/sum(X$Y_1==1)# P(Y=0|Y_1=1)
MC_1[2,1]<-sum(X$Y==1 & X$Y_1==0)/sum(X$Y_1==0)# P(Y=1|Y_1=0)
MC_1[2,2]<-sum(X$Y==0 & X$Y_1==0)/sum(X$Y_1==0)# P(Y=0|Y_1=0)
rownames(MC_1)<-colnames(MC_1)<-c("1", "0")
kable(MC_1, digits=2)
1 0
1 0.63 0.37
0 0.35 0.65

Wyraźnie widać, że znak zwrotu ma większe prawdopodobieństwo powtórzyć się niż nie powtórzyć się. Stwierdzenie, że kierunek zwrotu zależy od poprzednich wartości zwrotu jest tutaj zasadne. Powyższą macierz można traktować, jako macierz przejścia w jednym kroku dla dwustanowego (0,1) łańcucha Markowa, gdzie 0 oznacza zwrot ujemny, a 1 zwrot dodatni. Należy jednak spojrzeć ile okresów powinno się znaleźć w jednym stanie, czyli na ile dni wstecz należałoby spojrzeć modelując kierunek zwrotu. Spójrzmy po kolei na macierze przejść i występowanie stanów i oceńmy maksymalną liczbę opóźnień:

Skonstruujmy funkcję liczącą macierz przejścia:

macierz_przejscia<-function(X, X_poprz, k){
  przed<-X_poprz$Y
  for(i in 1:k){
    eval(parse(text=paste0("X$Y_", i, "<-lag.xts(X$Y,", i, ")")))
    eval(parse(text=paste0("X$Y_", i, "[1:",i,"]<-przed[(22-",i,"):21]")))
  }
  X$akt<-X$Y_1
  if(k!=1){
    for(i in 2:k){
      eval(parse(text=paste0("X$akt<-paste0(X$akt, X$Y_",i,")")))
    }
  }
  X$nast<-substr(paste(X$Y, X$akt, sep=""), 1, k)
  stany<-sort(unique(as.character(X$akt)))
  M<-matrix(rep(0, 2^(2*k)), nrow=2^k, ncol=2^k)
  colnames(M)<-rownames(M)<-stany
  i<-1
  j<-1
  for(i in 1:(2^k)){
    for(j in 1:(2^k)){
      stan_akt<-stany[i]
      stan_nast<-stany[j]
      M[i,j]<-sum(X$nast==stan_nast & X$akt==stan_akt)/sum(X$akt==stan_akt)
    }
  }
  return(list(M, count(X$akt))) # Oprócz macierzy przejść zwracamy liczebność stanów - żeby ocenić ile opóźnień możemy uwzględnić
}

Teraz rozpatrzmy kolejne opóźnienia:

M1<-macierz_przejscia(X, X_poprz, 1)
M2<-macierz_przejscia(X, X_poprz, 2)
kable(M2[2], digits=0)
x freq
00 547
01 301
10 301
11 507
kable(M1[1], digits=3)
0 1
0 0.645 0.355
1 0.373 0.627
kable(M2[1], digits=3)
00 01 10 11
00 0.607 0.000 0.393 0.000
01 0.714 0.000 0.286 0.000
10 0.000 0.282 0.000 0.718
11 0.000 0.426 0.000 0.574

W przypadku dwóch opóźnień wydaje się, że nie ma problemu z rzadkim występowaniem niektórych stanów, które mogłoby zaburzyć niektóre prawdopodobieństwa. Porównanie tabeli dla jednego i dwóch opóźnień wskazuje, że dodanie drugiego opóźnienia niesie nową informację. Dla przykładu zaraz po zmianie prawdopodobieństwo powtórzenia się kierunku zwrotu jest wyraźnie wyższe niż jeśli już przynajmniej dwa razy wystąpił ten sam kierunek:

\(P(00|01)>P(00|00), P(11|10)>P(11|11)\)

Różnice w tych prawdopodobieństwach są wysokie i z pewnością istotne. Rozpatrzmy teraz trzy opóźnienia:

M3<-macierz_przejscia(X, X_poprz, 3)
kable(M3[2], digits=0)
x freq
000 332
001 215
010 85
011 216
100 215
101 86
110 216
111 291
kable(M3[1], digits=3)
000 001 010 011 100 101 110 111
000 0.614 0.000 0.000 0.000 0.386 0.000 0.000 0.000
001 0.595 0.000 0.000 0.000 0.405 0.000 0.000 0.000
010 0.000 0.729 0.000 0.000 0.000 0.271 0.000 0.000
011 0.000 0.708 0.000 0.000 0.000 0.292 0.000 0.000
100 0.000 0.000 0.302 0.000 0.000 0.000 0.698 0.000
101 0.000 0.000 0.233 0.000 0.000 0.000 0.767 0.000
110 0.000 0.000 0.000 0.440 0.000 0.000 0.000 0.560
111 0.000 0.000 0.000 0.416 0.000 0.000 0.000 0.584

Macierz występowania stanów wskazuje, że znów można założyć, że próba dla każdego z nich jest wystarczająco duża i estymatory MLE będą działać poprawnie.Porównując macierze przejścia dla dwóch i trzech opóźnień można stwierdzić, że w większości przypadków trzecie opóźnienie nie wpływa znacząco na prawdopodobieństwa przejść. Jedyna dość wyraźna różnica to:

\(P(010|100)=0,3 oraz P(010|101)=0,23\)

M4<-macierz_przejscia(X, X_poprz, 4)
kable(M4[2], digits=0)
x freq
0000 204
0001 128
0010 62
0011 153
0100 65
0101 20
0110 95
0111 121
1000 128
1001 87
1010 23
1011 63
1100 150
1101 66
1110 121
1111 170
kable(M4[1], digits=3)
0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1110 1111
0000 0.627 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.373 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0001 0.594 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.406 0.000 0.000 0.000 0.000 0.000 0.000 0.000
0010 0.000 0.581 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.419 0.000 0.000 0.000 0.000 0.000 0.000
0011 0.000 0.601 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.399 0.000 0.000 0.000 0.000 0.000 0.000
0100 0.000 0.000 0.708 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.292 0.000 0.000 0.000 0.000 0.000
0101 0.000 0.000 0.800 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.200 0.000 0.000 0.000 0.000 0.000
0110 0.000 0.000 0.000 0.716 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.284 0.000 0.000 0.000 0.000
0111 0.000 0.000 0.000 0.702 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.298 0.000 0.000 0.000 0.000
1000 0.000 0.000 0.000 0.000 0.273 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.727 0.000 0.000 0.000
1001 0.000 0.000 0.000 0.000 0.345 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.655 0.000 0.000 0.000
1010 0.000 0.000 0.000 0.000 0.000 0.174 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.826 0.000 0.000
1011 0.000 0.000 0.000 0.000 0.000 0.254 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.746 0.000 0.000
1100 0.000 0.000 0.000 0.000 0.000 0.000 0.453 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.547 0.000
1101 0.000 0.000 0.000 0.000 0.000 0.000 0.409 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.591 0.000
1110 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.388 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.612
1111 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.435 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.565

Tabela częstości występowania stanów pokazuje, że stan 0101 występuje zaledwie 20 razy, co może być już problematyczne. Co do różnic w prawdopodobieństwach między macierzami przejść dla trzech i czterech opóźnień to są one w niektórych przypadkach stosunkowo wyraźne. Największa - ok. 10pp. między \(P(0010|0100)\), a \(P(0010|0101)\). Jednak może ona wynikać z rzadkiego występowania stanu 0101. Biorąc pod uwagę powyższe wydaje się, że dwa opóźnienia są najsensowniejsze. Łańcuch ma stosunkowo niewiele stanów (4), a prawdopodobieństwa przejść są wyraźnie różne.

Modelowanie kursu - podejście III - Modelowanie z użyciem modelu z rodziny GARCH

Czy modelowanie warunkowej wariancji ma sens?

Przed przystąpieniem do specyfikacji modelu warunkowej wariancji z rodziny modeli GARCH należy zbadać, czy w analizowanym przez nas szeregu czasowym występują efekty ARCH (GARCH). W związku z tym analizę rozpoczniemy od testu ARCH.

ArchTest(X$ret, lags = 5)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  X$ret
## Chi-squared = 278.88, df = 5, p-value < 2.2e-16

Uzyskana z niego wartość statystyki testowej chi2=278.88 (p-value<2.2e-16) daje podstawy do odrzucenia na poziomie istotności 5% hipotezyzerowej o niewystępowaniu efektów ARCH. Elementem analizy występowania efektu ARCH jest również zbadanie za pomocą statystyki Durbina-Watsona, czy kwadraty zwrotów są białym szumem.

durbinWatsonTest(lm(formula = X$ret ^ 2 ~ 1),
                 max.lag = 5)
##  lag Autocorrelation D-W Statistic p-value
##    1       0.2424348      1.514964   0.002
##    2       0.2154773      1.568778   0.002
##    3       0.3596624      1.280353   0.000
##    4       0.1533860      1.692840   0.006
##    5       0.1545462      1.690512   0.010
##  Alternative hypothesis: rho[lag] != 0

Uzyskane watrości dla 5 opóźnień pozwalają wnioskować, że tak nie jest w związku z czym możemy przypuszczać, że w analizowanym szeregu występuje efekt ARCH.

Wykresy ACF

WYBÓR WŁAŚCIWEGO MODELU GARCH(p,q)

Celem tej części naszej analizy będzie dokonanie specyfikacji modelu z rodziny modeli GARCH. Wyestymowane zostaną modele ARCH, GARCH oraz eGARCH. Dobór modelu nastąpi na podstawie tegi czy model eliminuje efekt ARCH, czy parametry modelu są istotne oraz w oparciu o kryteria informacyjne.

Analizę rozpoczynamy od relatywnie najprostszych modeli ARCH. Oszacowano modele ARCH(1), ARCH(2), ARCH(3) oraz ARCH(4), żaden z nich nie wyeliminował efektu ARCH z modelu. W związku z tym, zasadnym jest przeprowadzenie estymacji modeli GARCH.

Ponieważ stała okazała się być nieistotna, kolejne modele będą estymowane bez stałej.

Przeprowadziliśmy estymację modeli GARCH(1,1), GARCH(1,2), GARCH(2,1), GARCH(2,2). W każdym z nich wartości statystyk Durbina-Watsona policzonych dla 5 opóźnień oraz statystyk testu ArchLM dają podstawy do wnioskowania o tym, że modele nie wyeliminowały efektu ARCH.W związku z tym przystąpiliśmy do estymacji modeli klasy eGARCH. Rozpartywaliśmy modele eGARCH(1,1), eGARCH(1,2), eGARCH(2,1), eGARCH(2,2).

We wszystkich przeprowadzonych estymacjach uzyskaliśmy istotny parametr alpha1, który odnosi się do asymetrycnej reakcji wariancji na szoki. Wynika z tego, że w naszym przypadku sensowne jest modelowanie warunkowej wariancji przy pomocy modelu eGARCH.Tylko jeden z oszacowanych modeli cechuje się istotnością wszystkich parametrów i eliminacją efektu ARCH. Jest to model o specyfikacji eGARCH(2,1). Przed zaprezentowaniem wyników estymacji warto przeanalizować wartości kryteriów informacyjnych, aby upewnić się co do poprawności wyboru modelu.

Poniższa tabela zawiera wartości kryteriów informacyjnych dla wyestymowanych modeli.

#compare.ICs(c("k.arch1","k.arch1", "k.arch3", "k.garch11", "k.garch12", "k.garch21", "k.garch22"))
  AIC       BIC       SIC      HQIC     model

1 -8.421744 -8.415207 -8.421747 -8.419321 k.arch1 2 -8.421744 -8.415207 -8.421747 -8.419321 k.arch1 3 -8.493429 -8.480356 -8.493440 -8.488583 k.arch3 4 -8.551578 -8.541774 -8.551585 -8.547944 k.garch11 5 -8.571075 -8.558002 -8.571087 -8.566229 k.garch12 6 -8.550425 -8.537352 -8.550437 -8.545579 k.garch21 7 -8.569867 -8.553526 -8.569885 -8.563810 k.garch22

Ponadto dla modelu eGARCH(1,1):

Akaike -8.5642 Bayes -8.5511 Shibata -8.5642 Hannan-Quinn -8.5593

eGARCH(2,1)

Akaike -8.5954 Bayes -8.5758 Shibata -8.5954 Hannan-Quinn -8.5881

eGARCH(1,2)

Akaike -8.5889 Bayes -8.5726 Shibata -8.5890 Hannan-Quinn -8.5829

EGARCH(2,2) Akaike -8.5966 Bayes -8.5737 Shibata -8.5967 Hannan-Quinn -8.5881

Modelem, który przyjmuje najniższe wartości kryterium AIC jest model eGARCH(2,2), zaś kryterium BIC model eGARCH(2,1). W związku z faktem, że w modelu eGARCH(2,2) występują nieistotne parametry, do przeprowadzenia prognozowania i symulacji wykorzystamy model eGARCH(2,1).

Wyniki estymacji modelu eGARCH(2,1):

k.egarch21
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : eGARCH(2,1)
## Mean Model   : ARFIMA(0,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error   t value Pr(>|t|)
## omega  -0.170973    0.002979  -57.3891 0.000000
## alpha1  0.135331    0.034518    3.9206 0.000088
## alpha2 -0.073103    0.031219   -2.3416 0.019200
## beta1   0.984836    0.000466 2113.5713 0.000000
## gamma1  0.582606    0.052016   11.2005 0.000000
## gamma2 -0.386767    0.040358   -9.5835 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error   t value Pr(>|t|)
## omega  -0.170973    0.007782  -21.9708 0.000000
## alpha1  0.135331    0.038470    3.5179 0.000435
## alpha2 -0.073103    0.034856   -2.0973 0.035968
## beta1   0.984836    0.000603 1633.8785 0.000000
## gamma1  0.582606    0.054692   10.6524 0.000000
## gamma2 -0.386767    0.044948   -8.6048 0.000000
## 
## LogLikelihood : 7122.96 
## 
## Information Criteria
## ------------------------------------
##                     
## Akaike       -8.5954
## Bayes        -8.5758
## Shibata      -8.5954
## Hannan-Quinn -8.5881
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                      177.1       0
## Lag[2*(p+q)+(p+q)-1][2]     182.4       0
## Lag[4*(p+q)+(p+q)-1][5]     188.2       0
## d.o.f=0
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                          statistic p-value
## Lag[1]                      0.1896  0.6633
## Lag[2*(p+q)+(p+q)-1][8]     5.4534  0.2949
## Lag[4*(p+q)+(p+q)-1][14]    8.8206  0.2980
## d.o.f=3
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[4]    0.8317 0.500 2.000  0.3618
## ARCH Lag[6]    0.9655 1.461 1.711  0.7577
## ARCH Lag[8]    1.1572 2.368 1.583  0.8999
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  1.496
## Individual Statistics:              
## omega  0.42930
## alpha1 0.07704
## alpha2 0.05010
## beta1  0.41626
## gamma1 0.24234
## gamma2 0.11650
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.49 1.68 2.12
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           0.6825 0.4950    
## Negative Sign Bias  0.7501 0.4533    
## Positive Sign Bias  0.9915 0.3216    
## Joint Effect        2.2462 0.5229    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     26.54      0.11593
## 2    30     32.95      0.27979
## 3    40     49.41      0.12267
## 4    50     69.91      0.02651
## 
## 
## Elapsed time : 0.273195

Prognoza warunkowego odchylenia standardowego przy użyciu modelu eGARCH(2,1):

forecast <- ugarchforecast(k.egarch21, n.ahead = length(Dates_b$Data))
forecast_dataframe <- data.frame(forecast@forecast$sigmaFor)
colnames(forecast_dataframe) <- c("odchylenie_std")

Symulacja

Dokonamy 10 tys. losowań przebiegu kursu na czas trwania rozważanych lokat. Losowanie kierunku kursu przeprowadzimy w zależności od liczby dni wstecz, które bierzemy pod uwagę przy modelowaniu kierunków, a wartość zwrotu policzymy zgodnie z rozkładami Weibulla z rozkładu WW.

losuj_ciag_stanow<-function(M, start, d, k){
  A<-data.frame(runif(d, 0, 1))
  colnames(A)<-"los"
  A$stan<-0
  A$stan[1]<-start
  M<-data.frame(M[1])
  MM<-as.data.frame(matrix(rep(0,nrow(M)), nrow=nrow(M), ncol=1))
  rownames(MM)<-rownames(M)
  MM<-M[M>0]
  MM<-MM[1:nrow(M)]
  names(MM)<-rownames(M)
  i<-2
  for(i in 2:d){
    if(A$los[i]<MM[A$stan[i-1]]){
      A$stan[i]<-substr(paste0(0, A$stan[i-1]),1,k) 
    }else{
      A$stan[i]<-substr(paste0(1, A$stan[i-1]),1,k)
    }
  }
  A$Y<-as.numeric(substr(A$stan, 1, 1))
  return(A)
}

## Symulacja Łańcuchem Markova
Odsetki<-data.frame(matrix(rep(0,10), nrow=1, ncol=10))
colnames(Odsetki)<-c("rozszerzen","L1max", "L1sr", "L1min", "L3max", "L3sr", "L3min", "L2max", "L2sr", "L2min")
for(rozszerzen in 0:5){
for(j in 1:10000){
  Dates<-Dates_b
  
  start<-X$kurs[1656]
if(rozszerzen<5){
  Dates$Wp<-rweibull(length(Dates$Data), shape=f.weibull$estimate[1], scale=f.weibull$estimate[2])
  Dates$Wm<-rweibull(length(Dates$Data), shape=f2.weibull$estimate[1], scale=f2.weibull$estimate[2])
  
  
  Dates$Wp<-exp(Dates$Wp)
  Dates$Wm<-exp(Dates$Wm)
  Dates$Wp<-Dates$Wp/a
  Dates$Wm<-Dates$Wm/a
  Dates$Wm<--Dates$Wm
  
  if(rozszerzen>0){
    M1<-macierz_przejscia(X, X_poprz, rozszerzen)
    A<-losuj_ciag_stanow(M1, paste(as.character(rep(0, rozszerzen)), collapse=""), length(Dates$Data)+1, rozszerzen)
    A<-A[-1,]
    Dates$Y<-A$Y
    Dates$X<-ifelse(Dates$Y==1, Dates$Wp, Dates$Wm)
  } else {
    Dates$Y<-runif(length(Dates$Data), min=0, max=1)
    Dates$Y<-ifelse(Dates$Y<=p, 1, 0)
    Dates$X<-ifelse(Dates$Y==1, Dates$Wp, Dates$Wm)
  }
}else{
  Dates$X<-0
    for(i in 1:length(Dates$Data)) {
      Dates$X[i] <- rnorm(1,mean(X$ret),forecast_dataframe[i,1])
    }
}
  
  Dates$kurs<-0
  Dates$kurs[1]<-start*(1+Dates$X[1])
  for(i in 2:length(Dates$Data)){
    Dates$kurs[i]<-Dates$kurs[i-1]*(1+Dates$X[i])
  }
  
  
   ## Scenariusz optymistyczny ##
  L1Wmax_d<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]-0.13
  L1Wmax_g<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]+0.13
  
  L3Wmax_d<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]-0.12
  L3Wmax_g<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]
  
  ## Scenariusz średni ##
  L1Wsr_d<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]-0.105
  L1Wsr_g<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]+0.105
  
  L3Wsr_d<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]-0.10
  L3Wsr_g<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]
  
  ## Scenariusz pesymistyczny (przy zał. równości granic) ##
  L1Wmin_d<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]-0.08
  L1Wmin_g<-Dates$kurs[Dates$Data==as.Date("2016-06-06")]+0.08
  
  L3Wmin_d<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]-0.08
  L3Wmin_g<-Dates$kurs[Dates$Data==as.Date("2016-06-07")]
  
  ## Scen
  Dates$czy_L1_max<-ifelse(Dates$Lok1==1 & Dates$kurs>=L1Wmax_d & Dates$kurs<=L1Wmax_g, 1, 0)
  Dates$czy_L1_sr<-ifelse(Dates$Lok1==1 & Dates$kurs>=L1Wsr_d & Dates$kurs<=L1Wsr_g, 1, 0)
  Dates$czy_L1_min<-ifelse(Dates$Lok1==1 & Dates$kurs>=L1Wmin_d & Dates$kurs<=L1Wmin_g, 1, 0)
  
  Dates$czy_L3_max<-ifelse(Dates$Lok3==1 & Dates$kurs>=L3Wmax_d & Dates$kurs<=L3Wmax_g, 1, 
                           ifelse(Dates$Lok3==2 & Dates$kurs>=4.2 & Dates$kurs<=4.3, 1, 0))
  Dates$czy_L3_sr<-ifelse(Dates$Lok3==1 & Dates$kurs>=L3Wsr_d & Dates$kurs<=L3Wsr_g, 1, 
                          ifelse(Dates$Lok3==2 & Dates$kurs>=4.2 & Dates$kurs<=4.3, 1, 0))
  Dates$czy_L3_min<-ifelse(Dates$Lok3==1 & Dates$kurs>=L3Wmin_d & Dates$kurs<=L3Wmin_g, 1, 
                           ifelse(Dates$Lok3==2 & Dates$kurs>=4.2 & Dates$kurs<=4.3, 1, 0))
  
  
  
   zwroty<-c(rozszerzen,
    "L1max"=0.04*(sum(Dates$czy_L1_max)/sum(Dates$Lok1)),
    "L1sr"=0.04*(sum(Dates$czy_L1_sr)/sum(Dates$Lok1)),
    "L1min"=0.04*(sum(Dates$czy_L1_min)/sum(Dates$Lok1)),
    "L3max"=0.0028*sum(Dates$czy_L3_max),
    "L3sr"=0.0028*sum(Dates$czy_L3_sr),
    "L3min"=0.0028*sum(Dates$czy_L3_min),
    "L2max"=max(0,min(0.05,0.2*(Dates$kurs[Dates$Data==as.Date("2017-06-05")]-Dates$kurs[Dates$Data==as.Date("2016-06-06")]))),
    "L2sr"=max(0,min(0.05,0.15*(Dates$kurs[Dates$Data==as.Date("2017-06-05")]-Dates$kurs[Dates$Data==as.Date("2016-06-06")]))),
    "L2min"=max(0,min(0.05,0.1*(Dates$kurs[Dates$Data==as.Date("2017-06-05")]-Dates$kurs[Dates$Data==as.Date("2016-06-06")]))))
  
  
  Odsetki<-rbind(Odsetki, zwroty)
}
}
Odsetki<-Odsetki[-1,]

Policzmy statystyki dla lokat:

for(rozszerzen in 0:5){
OdsetkiA<-Odsetki[Odsetki$rozszerzen==rozszerzen,-1]>=0.025
s_opis_II<-data.frame(matrix(rep(0,9), nrow=1, ncol=9))
colnames(s_opis_II)<-colnames(Odsetki)[-1]
s_opis_II<-rbind(s_opis_II, colMeans(OdsetkiA))
OdsetkiA<-Odsetki[Odsetki$rozszerzen==rozszerzen,-1]==0
s_opis_II<-rbind(s_opis_II, colMeans(OdsetkiA))
s_opis_II<-rbind(s_opis_II, colMeans(Odsetki[Odsetki$rozszerzen==rozszerzen,-1]))
s_opis_II<-rbind(s_opis_II, apply(Odsetki[Odsetki$rozszerzen==rozszerzen,-1], 2, median))
s_opis_II<-rbind(s_opis_II, apply(Odsetki[Odsetki$rozszerzen==rozszerzen,-1], 2, sd))
s_opis_II<-rbind(s_opis_II, apply(Odsetki[Odsetki$rozszerzen==rozszerzen,-1], 2, IQR))
s_opis_II<-s_opis_II[-1,]
s_opis_II<-s_opis_II[,c(1,2,3,7,8,9,4,5,6)]
colnames(s_opis_II)<-c("LSI-O", "LSI_S", "LSI-P", "LSII-O", "LSII-S", "LSII-P", "LSIII-O", "LSIII-S", "LSIII_P")
rownames(s_opis_II)<-c("Prawdopodobieństwo wyższych odsetek niż w LB", "Prawdopodobieństwo zerowych odsetek", "Oczekiwane odsetki", "Mediana odsetek", "Odchylenie std. odsetek", "IQR odsetek")
s_opis_II<-round(100*s_opis_II, 4)
eval(parse(text=paste0("O_", rozszerzen, "<-s_opis_II")))
}

Zacznijmy od wyników dla podejścia pierwszego, czyli przy założeniu niezależności kierunku zwrotu od poprzednich kierunków zwrotu.

kable(O_0)
LSI-O LSI_S LSI-P LSII-O LSII-S LSII-P LSIII-O LSIII-S LSIII_P
Prawdopodobieństwo wyższych odsetek niż w LB 26.6900 16.4500 6.4100 47.4700 42.9200 34.7200 0.2700 0.2400 0.1500
Prawdopodobieństwo zerowych odsetek 0.0000 0.0200 0.0400 39.6500 39.6500 39.6500 28.7400 30.3600 32.7800
Oczekiwane odsetki 1.7993 1.5225 1.2156 2.3643 2.1578 1.7853 0.5405 0.5101 0.4733
Mediana odsetek 1.7391 1.4387 1.1225 1.9747 1.4810 0.9873 0.5600 0.2800 0.2800
Odchylenie std. odsetek 0.9826 0.8915 0.7607 2.2707 2.1758 1.9549 0.5275 0.5125 0.4940
IQR odsetek 1.6126 1.4071 1.1383 5.0000 5.0000 3.5746 0.8400 0.8400 0.8400
par(mfrow=c(3,3))
hist(Odsetki$L1max[Odsetki$rozszerzen==0], xlab="LSI-O", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==0], xlab="LSI-S", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==0], xlab="LSI-P", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==0], xlab="LSII-O", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==0], xlab="LSII-S", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==0], xlab="LSII-P", freq=F, col="darkred", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==0], xlab="LSIII-O", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==0], xlab="LSIII-S", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==0], xlab="LSIII-P", freq=F, col="navy", main = NULL)

I porównajmy je z wynikami dla podejścia drugiego, dla czterostanowego łańcucha, czyli przy uwzględnieniu dwóch poprzednich kierunków przy losowaniu kierunku na dany dzień. Jest to wg wstępnej analizy danych szereg najlepiej oddający rzeczywiste kierunki.

kable(O_2)
LSI-O LSI_S LSI-P LSII-O LSII-S LSII-P LSIII-O LSIII-S LSIII_P
Prawdopodobieństwo wyższych odsetek niż w LB 23.2600 13.3100 4.6000 46.4100 42.4800 34.5400 0.1500 0.1200 0.1000
Prawdopodobieństwo zerowych odsetek 0.0100 0.0100 0.0500 40.8300 40.8300 40.8300 29.2500 30.9500 33.7200
Oczekiwane odsetki 1.7247 1.4535 1.1574 2.3264 2.1309 1.7817 0.5179 0.4866 0.4501
Mediana odsetek 1.6759 1.3755 1.0593 1.7441 1.3081 0.8721 0.2800 0.2800 0.2800
Odchylenie std. odsetek 0.9488 0.8529 0.7228 2.2829 2.1898 1.9830 0.5052 0.4900 0.4725
IQR odsetek 1.5178 1.3123 1.0909 5.0000 5.0000 3.6778 0.8400 0.8400 0.8400
par(mfrow=c(3,3))
hist(Odsetki$L1max[Odsetki$rozszerzen==2], xlab="LSI-O", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==2], xlab="LSI-S", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==2], xlab="LSI-P", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==2], xlab="LSII-O", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==2], xlab="LSII-S", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==2], xlab="LSII-P", freq=F, col="darkred", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==2], xlab="LSIII-O", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==2], xlab="LSIII-S", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==2], xlab="LSIII-P", freq=F, col="navy", main = NULL)

W obydwu podejściach do modelowania kursu i w przypadku wszystkich lokat można stwierdzić, że są one gorsze od lokaty bezpiecznej zapewniającej 2,5% odsetek. Oczekiwane odsetki są najwyższe dla podejścia pierwszego i dla lokaty LII-O, wciąż jednak nie przekraczają zwrotu, który można uzyskać za pomocą LB. Podejścia pierwsze dla lokaty LSII-O ma również najwyższe prawdobodobieństwo otrzymania odsetewk wyższych niż 2,5% ({r} print(O_0[1,4])). Wciąż jednak jest to prawdopodobieństwo niższe niż 1/2.

W ogólności najwyższe oczekiwane zwroty oraz najwyższe prawdopodobieństwo otrzymania odsetek wyższych niż w przypadku LB ma lokata LSII, na drugim miejscu pod tym względem znalazłaby się lokata LSI. Zdedydowanie najgorszym wyborem byłaby lokata LSIII, zapewniająca znikomą szansę na wysokie odsetki. Najlepsza z powyższych lokat cechuje się znacznym odchyleniem standardowym. Jej konstrukcja sprzyja występowaniu skrajnych możliwych do uzyskania wartości zwrotu tj. 0% i 5% (czerwone histogramy), a co za tym idzie odchylenie standardowe zwrotu, które można utożsamiać z ryzykiem jest dla tej lokaty najwyższe. Wydaje się jednak, że byłaby to jedyna lokata spośród strukturyzowanych, która mogłaby być warta polecenia dla inwestora, zakładając, że miałby on znaczną skłonność do ryzyka. Biorąc jednak pod uwagę, że zdecydowana większość społeczeństwa cechuje się skrajną awersją do ryzyka można stwierdzić, że lokata bezpieczna jest zdecydowanie najlepszym wyborem spośród czterech analizowanych możliwości.

Porównując rozwiązania dla wersji pierwszej oraz dla wersji drugiej można zauważyć, że modelowanie kierunku zwrotu za pomocą łańcucha Markowa sprawia, że oczekiwana rentowność lokat strukturyzowanych obniża się w stosunku do podejścia pierwszego, czyli założenia, że kierunek zwrotu jest czysto losowy. Dla wszystkich lokat strukturyzowanych, jak i dla wszystkich scenariuszy dla tych lokat modelowanie za pomocą podejścia drugiego zwraca niższe oczekiwane odsetki oraz niższe prawdopodobieństwo przekroczenia zwrotu z lokaty 2,5%. Jako, że podejście pierwsze jest de facto przypadkiem podejścia drugiego uwzględniającym 0 opóźnień oraz to, że wyraźnie zastosowanie dwóch opóźnień zmniejsza rentowność wszystkich lokat w stosunku do zerowej liczby opóźnień można się zastanowić, jak liczba przyjętych opóźnień wpływa na wyniki. Przeprowadźmy zatem symulację dla liczby opóźnień od 0 do 4 (dla wyższych nie ma sensu estymowanie prawdopodobieństw przejścia) i sprawdźmy, jak zwiększenie/zmniejszenie liczby opóźnień będzie wpływać na wyniki symulacji w stosunku do zaprezentowanych powyżej wyników.

table<-data.frame()
for(i in 0:4){
  eval(parse(text=paste0("table<-rbind(table, O_", i, "[1,])")))
}
table$opoznien<-0:4
table<-table[,c(10,1:9)]

table2<-data.frame()
for(i in 0:4){
  eval(parse(text=paste0("table2<-rbind(table2, O_", i, "[3,])")))
}
table2$opoznien<-0:4
table2<-table2[,c(10,1:9)]

kable(table)
opoznien LSI-O LSI_S LSI-P LSII-O LSII-S LSII-P LSIII-O LSIII-S LSIII_P
Prawdopodobieństwo wyższych odsetek niż w LB 0 26.69 16.45 6.41 47.47 42.92 34.72 0.27 0.24 0.15
Prawdopodobieństwo wyższych odsetek niż w LB1 1 19.91 10.71 3.45 45.78 42.11 35.33 0.13 0.09 0.07
Prawdopodobieństwo wyższych odsetek niż w LB2 2 23.26 13.31 4.60 46.41 42.48 34.54 0.15 0.12 0.10
Prawdopodobieństwo wyższych odsetek niż w LB3 3 22.97 13.03 4.73 46.08 42.08 34.61 0.06 0.03 0.00
Prawdopodobieństwo wyższych odsetek niż w LB4 4 22.66 13.05 4.51 46.51 42.62 35.23 0.15 0.12 0.09
kable(table2)
opoznien LSI-O LSI_S LSI-P LSII-O LSII-S LSII-P LSIII-O LSIII-S LSIII_P
Oczekiwane odsetki 0 1.7993 1.5225 1.2156 2.3643 2.1578 1.7853 0.5405 0.5101 0.4733
Oczekiwane odsetki1 1 1.6298 1.3702 1.0863 2.3023 2.1255 1.7934 0.5024 0.4714 0.4358
Oczekiwane odsetki2 2 1.7247 1.4535 1.1574 2.3264 2.1309 1.7817 0.5179 0.4866 0.4501
Oczekiwane odsetki3 3 1.7036 1.4380 1.1471 2.3111 2.1213 1.7778 0.5088 0.4772 0.4392
Oczekiwane odsetki4 4 1.6980 1.4321 1.1389 2.3359 2.1483 1.8106 0.5169 0.4847 0.4475

Podejście trzecie

kable(O_5)
LSI-O LSI_S LSI-P LSII-O LSII-S LSII-P LSIII-O LSIII-S LSIII_P
Prawdopodobieństwo wyższych odsetek niż w LB 40.7500 28.6800 14.6000 42.6000 36.8000 27.7500 0.5500 0.490 0.30
Prawdopodobieństwo zerowych odsetek 0.0000 0.0000 0.0000 40.9100 40.9100 40.9100 26.7800 27.730 29.26
Oczekiwane odsetki 2.1783 1.8659 1.5105 2.1358 1.8961 1.4930 0.6199 0.589 0.55
Mediana odsetek 2.1976 1.8340 1.4387 1.3667 1.0250 0.6834 0.5600 0.560 0.28
Odchylenie std. odsetek 1.0288 0.9659 0.8527 2.1860 2.0525 1.7604 0.5893 0.571 0.55
IQR odsetek 1.7115 1.5692 1.3439 5.0000 4.1460 2.7640 0.8400 0.840 0.84
par(mfrow=c(3,3))
hist(Odsetki$L1max[Odsetki$rozszerzen==5], xlab="LSI-O", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==5], xlab="LSI-S", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L1max[Odsetki$rozszerzen==5], xlab="LSI-P", freq=F, col="darkgreen", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==5], xlab="LSII-O", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==5], xlab="LSII-S", freq=F, col="darkred", main = NULL)
hist(Odsetki$L2max[Odsetki$rozszerzen==5], xlab="LSII-P", freq=F, col="darkred", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==5], xlab="LSIII-O", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==5], xlab="LSIII-S", freq=F, col="navy", main = NULL)
hist(Odsetki$L3max[Odsetki$rozszerzen==5], xlab="LSIII-P", freq=F, col="navy", main = NULL)

Powyższa tabela oraz histogramy przedstawiają wyniki dla trzeciego podejścia badania opartego na modelowaniu warunkowej wariancji przy użyciu modelu eGARCH(2,1). Również w tym przypadku możemy stwierdzić, że lokaty strukturyzowane są gorsze od lokaty bezpiecznej zapewniającej 2,5% odsetek. Podobnie jak w przypadku podejścia pierwszego i drugiego można wnioskować, że najwyższe prawdopodobieństwo wyższych odsetek niż w LB i najwyższe oczekiwane odsetki oferuje lokata LSII, zaś na drugim miejscu pod tymi względami plasuje się lokata LSI.

Podsumowanie

Za pomocą metod właściwych dla analizy szeregów czasowych dokonaliśmy oceny rentowności trzech lokat strukturyzowanych opartych na kursie EUR/PLN - Range accural EUR/PLN - GETIN Noble Bank, Call Spread EUR/PLN - GETIN Noble Bank, ILT Suma procentów 26 - ING Bank Śląski. Wykorzystaliśmy trzy podejścia do modelowania kursu EUR/PLN: pierwsze przy założeniu przy założeniu niezależności kierunku zwrotu od poprzednich kierunków zwrotu, drugie za pomocą łańcucha Markowa oraz trzecie oparte na modelowaniu warunkowej wariancji przy użyciu modelu eGARCH. Na podstawie wyników uzyskanych z trzech podejść możemy wnioskować, że wszystkie lokaty strukturyzowane charakteryzują się niższą rentownością niż lokata bezpieczna. Co więcej, na podstawie przeprowadzonej przez nas analizy można wnioskować, że najbardziej rentowną z trzech analizowanych lokat jest lokata druga tj. Call Spread EUR/PLN - GETIN Noble Bank.