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.
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.
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:
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).
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.
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.
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 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)
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ą:
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.
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
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
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ń:
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.
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)
|
kable(M1[1], digits=3)
|
kable(M2[1], digits=3)
|
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)
|
kable(M3[1], digits=3)
|
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)
|
kable(M4[1], digits=3)
|
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.
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")
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.
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.