Streszczenie

Celem niniejszej pracy jest oszacowanie możliwości osiągnięcia dodatkowego zysku z inwestycji w lokaty strukturyzowane oraz porównanie ich atrakcyjności w stosunku do tradycyjnych lokat oferowanych w tym samym czasie na rynku. Na podstawie historycznych stóp zwrotu przeprowadzono prognozę zwrotów kursu EUR/PLN oraz USD/PLN i obliczono zyski dla trzech przykładowych lokat strukturyzowanych oferowanych przez wybrane banki. Dane wykorzystane w analizie pochodzą z serwisu http://stooq.com. Analizie poddano następujące trzy lokaty strukturyzowane oferowane przez:
* Getin Noble Bank “Range accrual EUR/PLN maj 2016”,
* mBank „Silny kurs IV”,
* Bank Zachodni WBK “Range Accrual EUR Złoty Stabilizacja (10 maj 2017)”.

Zdecydowano się na trzy podejścia:
* symulacja Monte Carlo oparta o rozkład jednostajny na podstawie danych historycznych,
* symulacja Monte Carlo oparta o rozklad normalny, którego parametry oszacowano na podstawie danych historycznych,
* symulacja Monte Carlo oparta o warunkową wariancję oszacowaną na podstawie modelu GARCH.

Wprowadzenie

Ostatni kryzys finansowy przyczynił się do wzrostu niepewności na rynkach finansowych, co z jednej strony zniechęca inwestorów do angażowania środków w inwestycje kapitałowe, z drugiej zaś strony działa motywująco i skłania do poszukiwania alternatywnych form inwestowania. Polscy inwestorzy mają pod tym względem stosunkowo szeroki wybór. Dość dużą popularnością cieszą się m.in. produkty strukturyzowane (ang. exchange traded products, ETP). Wprawdzie instrumenty te nie powinny stanowić jedynego rodzaju lokaty, jednak ich dywersyfikujące własności, które przyczyniają się do poprawy efektywności portfela, są przedmiotem badań coraz szerszej grupy badaczy.

Charakterystyczną cechą produktów strukturyzowanych jest ich duża różnorodność. Wspólną cechą tych instrumentów stanowi istnienie określonego terminu zapadalności oraz gwarancja ochrony kapitału (nie zawsze jednak całkowitej) przy jednoczesnej możliwości osiągnięcia dodatkowych ponadprzeciętnych zysków, które nie są znane w momencie podejmowania inwestycji. Produkty strukturyzowane umożliwiają uzyskanie dostępu do rynków, które na ogół nie są bezpośrednio dostępne kupującym jednostki tradycyjnych funduszy. W ten sposób można zacząć zarabiać na rynkach surowców i towarów, funduszy hedge oraz zagranicznych rynków forex.

Produkty strukturyzowane wydają się mieć zatem sporo korzyści dla potencjalnych inwestorów. W przeciwieństwie do tradycyjnych funduszy zapewniają one niezależność od zdolności inwestycyjnych oraz stylu osoby zarządzającej funduszem. Już przed momentem podjęcia decyzji o zakupie takiego produktu wiadomo, jaka jego część jest objęta gwarancją, w jakim stopniu inwestor będzie miał udział w potencjalnych zyskach oraz czy zyski te będą w mniejszym lub większym stopniu ograniczone. Inwestor ma też pewność, że warunki te nie ulegną zmianie w czasie trwania produktu.

Należy jednak pamiętać, że chociaż możliwości strat są ograniczone, to uzyskany zwrot niekoniecznie będzie zadowalający. Wybór danego produktu strukturyzowanego musi być zatem oparty o analizę skłonności inwestora do ponoszenia ryzyka. Generalnie instrumenty te są przeznaczone dla osób, które posiadają określone preferencje odnośnie rynków bazowych lub są zainteresowane możliwością osiągnięcia wyższej stopy zwrotu przy jednoczesnej akceptacji odpowiednio większego poziomu ryzyka, które nieodłącznie łączy się z inwestycją w tę klasę aktywów.

Opis wybranych produktów

GETIN NOBLE BANK
RANGE ACCRUAL EUR/PLN MAJ 2016
czas trwania: 12 mies.
koszyk: kurs: EUR/PLN
maksymalny zysk: 4% (rocznie: 4%)
poziom ochrony: 100%

Pierwszym z analizowanych produktów jest lokata “Range accrual EUR/PLN maj 2016”, której szczegółowy opis dostępny jest tutaj. Jest to lokata inwestycyjna oparta na kursie EUR wyrażonym w PLN, zawartym w Tabeli A kursów średnich walut obcych, publikowanym przez Narodowy Bank Polski (NBP). Odsetki od lokaty naliczane są w dniu zakończenia okresu trwania lokaty według wzoru:
odsetki = kwota lokaty * 4,00% * n/N;
gdzie:
* n liczba dni obserwacji, w których kurs EUR/PLN będzie miał wartość z zakresu ustalonego w dniu 06.06.2016 r.
* N to liczba wszystkich dni obserwacji.
Zakres to przedział o szerokości maksymalnie 26 groszy, minimalnie 16 groszy, którego: dolna bariera znajdzie się maksymalnie 13 groszy poniżej kursu EUR/PLN z dnia 06.06.2016 r., a górna bariera znajdzie się maksymalnie 13 groszy powyżej kursu EUR/PLN z dnia 06.06.2016 r.

MBANK
LOKATA INWESTYCYJNA SILNY KURS IV
czas trwania: 12 mies.
koszyk: kurs: USD/PLN
maksymalny zysk: 4% (rocznie: 4%)
poziom ochrony: 100%

Kolejnym produktem, której opis można znaleźć tutaj, jest lokata strukturyzowana oparta o kurs fixingu USD/PLN ogłaszany przez Narodowy Bank Polski. Odsetki od lokaty naliczane i wypłacane są w dniu zakończenia lokaty według wzoru:
odsetki = kwota lokaty * kupon * (n/N),
gdzie:
* kupon to wysokość oprocentowania lokaty (wartość nie niższa niż 3,5%),
* n - liczba dni obserwacji kursu, w których fixing NBP dla pary walutowej USD/PLN będzie wyższy niż kurs USD/PLN ustalony na fixingu NBP w dniu 08.03.2016 pomniejszony o 0,1500 PLN i niższy niż kurs USD/PLN ustalony na fixingu NBP w dniu 08.03.2016 powiększony o 0,0300 PLN (pierwszym dniem obserwacji kursu jest dzień 08.03.2016, ostatnim dniem obserwacji kursu jest dzień 06.03.2017),
* N - liczba wszystkich dni obserwacji (N=252).
Jeśli w dowolnym dniu obserwacji nie będzie możliwe określenie wartości instrumentu bazowego, Bank będzie miał prawo do ustalenia wartości odsetek od lokaty na podstawie własnych obliczeń.

BANK ZACHODNI WBK
LOKATA STRUKTURYZOWANA EUR ZŁOTY STABILIZACJA (10 MAJA 2017)
czas trwania: 12 mies.
koszyk: kurs: EUR/PLN
maksymalny zysk: 5% (rocznie: 5%)
poziom ochrony: 100%

Ostatnią lokatą, która została przeanalizowana jest Lokata Strukturyzowana EUR Złoty Stabilizacja (szczegółowy opis dostępny jest tutaj). Strategia lokaty zakłada brak istotnych zmian złotego względem euro. Stopa procentowa uzależniona jest od kursu średniego EUR wyrażonego w PLN ogłaszanego przez NBP. W zależności od zachowania się tego kursu, stopa procentowa może wynieść 5,0% w skali roku, w przypadku, gdy kurs w dniu ostatniej obserwacji przyjmie wartość z przedziału pomiędzy kursem EUR/PLN1 (kurs z dnia 11.05.2016 pomniejszony o 0,06 zł) a kursem EUR/PLN2 (kurs z dnia 11.05.2016 powiększony o 0,06 zł). W pozostałych przypadkach odsetki nie będą naliczone.

Wczytanie pakietów

Do przeprowadzenia niniejszej analizy wykorzystano następujące pakiety programu R:

library(xts)
library(dygraphs)
library(fBasics) 
library(tseries)
library(car) 
library(knitr)
library(FinTS) 
library(fGarch) 
library(rugarch) 
library(foreach)
library(doMC)
library(PerformanceAnalytics)
library(mc2d)

GETIN NOBLE BANK: RANGE ACCRUAL EUR/PLN MAJ 2016

Aby zaimportować dane dotyczące kursu walutowego, użyto funkcji read.csv:

url <- "http://stooq.com/q/d/l/?s=eurpln&d1=19990104&d2=20160605&i=d"
EURPLN <- read.csv(url,
                   header = TRUE,
                   sep = ",",
                   dec = ".",
                   stringsAsFactors = F)

Ponieważ na razie zmienna “Date” jest zmienną typu znakowego (10 znaków), dlatego należy zadabać o to, by data była we właściwym formacie.

EURPLN$Date <- as.Date(EURPLN$Date)

W dalszej analizie potrzebne będą tylko dwie kolumny - jedna reprezentująca daty oraz druga odpowiadająca za ceny zamknięcia. Pozostałe kolumny są zbędne, dlatego zostaną usunięte. Zmieniamy nagłówki kolumn odpowiednio na “Date” oraz “EURPLN”.

EURPLN <- EURPLN[, c("Date", "Close")]
colnames(EURPLN) <- c("Date", "EURPLN")

Przed przystąpieniem do analizy zaleca się, aby sprawdzić, jaką strukturę ma utworzony przez nas obiekt EURPLN. W ten sposób sprawdzimy, m.in. czy zmienne należące do tego obiektu mają właściwy format.

str(EURPLN)
## 'data.frame':    4474 obs. of  2 variables:
##  $ Date  : Date, format: "1999-01-04" "1999-01-05" ...
##  $ EURPLN: num  4.06 4.02 4 4.04 4 ...

Można też zobaczyć początkowe i końcowe wartości obiektu EURPLN:

head(EURPLN, n = 10)
##          Date EURPLN
## 1  1999-01-04 4.0629
## 2  1999-01-05 4.0163
## 3  1999-01-06 4.0040
## 4  1999-01-07 4.0430
## 5  1999-01-08 4.0050
## 6  1999-01-11 4.0603
## 7  1999-01-12 4.0665
## 8  1999-01-13 4.1825
## 9  1999-01-14 4.1571
## 10 1999-01-15 4.1175
tail(EURPLN, n = 10)
##            Date  EURPLN
## 4465 2016-05-23 4.44423
## 4466 2016-05-24 4.42696
## 4467 2016-05-25 4.40693
## 4468 2016-05-26 4.40795
## 4469 2016-05-27 4.38639
## 4470 2016-05-30 4.39392
## 4471 2016-05-31 4.38625
## 4472 2016-06-01 4.38447
## 4473 2016-06-02 4.38516
## 4474 2016-06-03 4.38616

Wstępna analiza danych

W dalszej analizie potrzebne będą ciągłe stopy zwrotu, dlatego należy odpowiednio przekształcić kursy walutowe, tj. obliczyć różnice logarytmów pierwszych różnic:

EURPLN$r <- diff.xts(log(EURPLN$EURPLN))

Teraz można przyjrzeć się, jak wygląda wykres kursów zamknięcia:

EURPLN.xts <- xts(EURPLN[, c("r", "EURPLN")], order.by = EURPLN$Date)
dygraph(EURPLN.xts$EURPLN) %>% dyRangeSelector(height = 40)

a jak z kolei wygląda wykres ciągłych stóp zwrotu:

plot(EURPLN$Date, EURPLN$r, type = "l",
     main = "Dzienne zwroty z EURPLN",
     xlab = "", ylab = "zwroty")

Poniżej zamieszczony jest wykres wartości ACF dla zwrotów:

acf(EURPLN$r,
    lag.max = 40,
    na.action = na.pass,
    ylim = c(-0.05, 0.2),
    col = "darkblue", lwd = 7,
    main = "ACF zwrotów EUR/PLN")

a tutaj wykres wartości ACF dla kwadratów zwrotów:

acf(EURPLN$r^2, lag.max = 40, na.action = na.pass,
    ylim = c(-0.05, 0.7),
    col = "darkblue", lwd = 7,
    main = "ACF kwadratów zwrotów EUR/PLN")

Wykres wartości ACF dla zwrotów pokazuje występowanie silnej zależności autokorelacyjnej. Również kwadraty zwrotów cechują się autokorelacją, co oznacza, że ten szereg finansowy podlega procesom ARCH. To zaś pozwala stwierdzić, że trzy fakty stylizowane takie, jak leptokurtyczność, zjawisko grupowania wariancji oraz efekt dźwigni są obecne w analizowanym szeregu.

Warto też rzucić okiem na podstawowe statystyki opisowe, szczególnie na średnią, odchylenie standardowe oraz skośność i kurtozę. To pozwoli stwierdzić, czy rozkład jest lepto- czy platykurtyczny, a także czy jest lewo- czy prawoskośny. Dzięki można wyciągnąć pierwsze hipotezy odnośnie tego, jak bardzo rozkład stóp zwrotu przypomina bądź też odbiega od rozkładu normalnego.

basicStats(EURPLN$r)
##             X..EURPLN.r
## nobs        4474.000000
## NAs            1.000000
## Minimum       -0.035996
## Maximum        0.055271
## 1. Quartile   -0.003384
## 3. Quartile    0.003176
## Mean           0.000017
## Median        -0.000192
## Sum            0.076557
## SE Mean        0.000094
## LCL Mean      -0.000168
## UCL Mean       0.000202
## Variance       0.000040
## Stdev          0.006302
## Skewness       0.374011
## Kurtosis       4.789390

Średnia oraz odchylenie standardowe są bliskie zeru. Wartość współczynnika skośności nie jest aż tak duża, by stwierdzić jakąś znaczącą asymetrię w rozkładzie. Natomiast wartość współczynnika kurtozy odbiegająca mocno od 3 (tyle wynosi kurtoza dla rozkładu normalnego) dowodzi, że mamy do czynienia z rozkładem leptokurtycznym i zjawiskiem tzw. grubych ogonów, które są dość typowe dla finansowych szeregów finansowych.

Wniosek ten potwierdza wykres kwantylowy. Czerwona linia obrazuje kwantyle rozkładu teoretycznego (w naszym przypadku: rozkładu normalnego). Wyraźnie widać, że w lewej części wykresu kwantyle leżą zbyt nisko, w prawej części wykresu - zbyt wysoko. Obserwuje się więc duże odstępstwa od rozkładu normalnego.

Symulacja Monte Carlo oparta o rozkład jednostajny

W analizie Monte Carlo użyto 10 000 powtórzeń. W każdym powtórzeniu spośród historycznych stóp zwrotu losowane są z jednakowym prawdopodobieństwem 252 stopy zwrotu (czyli tyle, ile jest dni handlowych w roku). Następnie zostają one przekstałcane w ścieżkę cen i odbywa się sprawdzenie, ile z nich mieści się w przedziale \(<4.23; 4.49>?\). Na podstawie tego udziału oblicza się zysk z lokaty zgodnie z jej założeniami.

r <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- sample(na.omit(EURPLN$r), runs, replace = F)
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r[i] <- sum(sims2 >= 4.23 & sims2 <= 4.49) / runs * 4
}

Na podstawie przeprowadzonych 10 000 powtórzeń w symulacji Monte Carlo można obliczyć prawdopodobieństwo osiągnięcia zysku przekraczającego 0,75%, które wynosi 38.8%.

Histogram stóp zwrotu przedstawia się następująco (dla lepszego zobrazowania uwzględniono też na wykresie estymowaną gęstość rozkładu i gęstość rozkładu normalnego):

Symulacja Monte Carlo oparta o rozkład normalny

Zamiast losować zwroty historyczne, można też oszacować ich wartość oczekiwaną oraz wariancję i losować z rozkładu normalnego. W efekcie ścieżki cen będą generowane zgodnie z geometrycznym ruchem Browna, czyli zgodnie z założeniami modelu Blacka-Scholesa. Takie podejście zignoruje jednak występowanie tzw. grubych ogonów w rozkładach stóp zwrotu. Podobnie jak w poprzednim przypadku wylosowane stopy zwrotu zostają przekształcone w ścieżkę cen, po czym odbywa się sprawdzenie, ile z nich znajdzie się w zadanym przedziale, co posłuży do obliczenia zysku z lokaty.

r2 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(EURPLN$r)),
                sd = sd(na.omit(EURPLN$r)))
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r2[i] <- sum(sims2 >= 4.23 & sims2 <= 4.49) / runs * 4
}

W tym przypadku prawdopodobieństwo osiągnięcia zysku, który przekroczy 0,75%, wynosi 38.88%.

Histogram jest przestawiony poniżej:

Symulacja Monte Carlo oparta o oszacowanie warunkowej wariancji na podstawie modelu GARCH

Można wreszcie do analizy wykorzystać też modele GARCH. Na postawie historycznych stóp zwrotu oszacować parametry modelu GARCH, co pozwoli uzyskać oszacowanie warunkowej wariancji zwrotów, które następnie można wykorzystać do symulowania przyszłych zwrotów.

W tym celu należy najpierw sprawdzić, który z modeli ARCH lub GARCH najlepiej pasuje do danych i wyjaśnia efekty ARCH.

ARCH(1)

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(EURPLN$r),
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x0000000013776e20>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##          mu        omega       alpha1  
## -2.7080e-05   2.9823e-05   2.5971e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##          Estimate  Std. Error  t value Pr(>|t|)    
## mu     -2.708e-05   8.629e-05   -0.314    0.754    
## omega   2.982e-05   8.447e-07   35.306   <2e-16 ***
## alpha1  2.597e-01   2.569e-02   10.109   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16468.47    normalized:  3.681751 
## 
## Description:
##  Wed Jul 06 09:18:56 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  5631.523  0           
##  Shapiro-Wilk Test  R    W      0.956682  0           
##  Ljung-Box Test     R    Q(10)  24.15287  0.007204806 
##  Ljung-Box Test     R    Q(15)  40.6092   0.0003667191
##  Ljung-Box Test     R    Q(20)  48.80153  0.0003280019
##  Ljung-Box Test     R^2  Q(10)  460.3731  0           
##  Ljung-Box Test     R^2  Q(15)  539.0754  0           
##  Ljung-Box Test     R^2  Q(20)  683.0496  0           
##  LM Arch Test       R    TR^2   332.934   0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.362160 -7.357864 -7.362161 -7.360646

Ze względu na to, że stała w równaniu średniej jest nieistotna, można ją wykluczyć z modelu.

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(EURPLN$r),
                    include.mean = F, # wyrzucimy stałą, skoro jest nieistotna
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x00000000136bd678>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1  
## 2.9823e-05  2.5970e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  2.982e-05   8.450e-07    35.29   <2e-16 ***
## alpha1 2.597e-01   2.570e-02    10.10   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16468.42    normalized:  3.68174 
## 
## Description:
##  Wed Jul 06 09:18:57 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  5619.829  0           
##  Shapiro-Wilk Test  R    W      0.9566954 0           
##  Ljung-Box Test     R    Q(10)  24.08256  0.007384236 
##  Ljung-Box Test     R    Q(15)  40.57608  0.0003709902
##  Ljung-Box Test     R    Q(20)  48.79936  0.0003282338
##  Ljung-Box Test     R^2  Q(10)  461.384   0           
##  Ljung-Box Test     R^2  Q(15)  540.2932  0           
##  Ljung-Box Test     R^2  Q(20)  684.3548  0           
##  LM Arch Test       R    TR^2   333.5362  0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.362585 -7.359721 -7.362585 -7.361575

Na podstawie wyników testu Ljung-Boxa na autokorelację kwadratów wystandaryzowanych reszt należy odrzucić hipotezę zerową na rzecz hipotezy alternatywnej i wyciągnąć wniosek, że istnieje autokorelacja.

GARCH(1,1)

k.garch11 <- garchFit(formula = ~ garch(1, 1),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x000000001379f948>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 3.9935e-07  8.6237e-02  9.0629e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  3.993e-07   8.929e-08    4.473 7.73e-06 ***
## alpha1 8.624e-02   8.532e-03   10.108  < 2e-16 ***
## beta1  9.063e-01   8.758e-03  103.477  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16913.23    normalized:  3.781182 
## 
## Description:
##  Wed Jul 06 09:18:57 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1306.315  0        
##  Shapiro-Wilk Test  R    W      0.9838817 0        
##  Ljung-Box Test     R    Q(10)  10.64303  0.3859965
##  Ljung-Box Test     R    Q(15)  19.74247  0.1820362
##  Ljung-Box Test     R    Q(20)  26.97897  0.1358567
##  Ljung-Box Test     R^2  Q(10)  9.484974  0.4867771
##  Ljung-Box Test     R^2  Q(15)  15.46951  0.4181555
##  Ljung-Box Test     R^2  Q(20)  17.19452  0.6403091
##  LM Arch Test       R    TR^2   10.67618  0.5568551
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.561022 -7.556726 -7.561023 -7.559508

Wszystkie parametry są istotne, a wysokie wartości p-value w teście Ljung-Boxa nie pozwalają na odrzucenie hipotezy zerowej o braku autokoelacji wśród kwadratów wystandaryzowanych reszt.

GARCH(1,2)

k.garch12 <- garchFit(formula = ~ garch(1, 2),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 2), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 2)
## <environment: 0x00000000137cf730>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1       beta2  
## 4.2977e-07  9.3693e-02  7.9860e-01  9.9664e-02  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  4.298e-07   1.057e-07    4.065 4.79e-05 ***
## alpha1 9.369e-02   1.425e-02    6.575 4.86e-11 ***
## beta1  7.986e-01   1.594e-01    5.009 5.47e-07 ***
## beta2  9.966e-02   1.476e-01    0.675    0.499    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16912.7    normalized:  3.781065 
## 
## Description:
##  Wed Jul 06 09:18:57 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1336.845  0        
##  Shapiro-Wilk Test  R    W      0.98373   0        
##  Ljung-Box Test     R    Q(10)  10.6513   0.3853218
##  Ljung-Box Test     R    Q(15)  19.66873  0.1850123
##  Ljung-Box Test     R    Q(20)  26.87855  0.1387156
##  Ljung-Box Test     R^2  Q(10)  8.995961  0.5324869
##  Ljung-Box Test     R^2  Q(15)  14.80712  0.4653982
##  Ljung-Box Test     R^2  Q(20)  16.46012  0.6877006
##  LM Arch Test       R    TR^2   10.10984  0.6063253
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.560341 -7.554613 -7.560343 -7.558322

Parametr beta2 jest nieistotny.

GARCH(2,1)

k.garch21 <- garchFit(formula = ~ garch(2, 1),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 1), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 1)
## <environment: 0x0000000012d6dc90>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1  
## 3.9894e-07  8.6140e-02  1.0000e-08  9.0639e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  3.989e-07   9.275e-08    4.301 1.70e-05 ***
## alpha1 8.614e-02   1.633e-02    5.274 1.33e-07 ***
## alpha2 1.000e-08   1.788e-02    0.000        1    
## beta1  9.064e-01   9.789e-03   92.591  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16912.48    normalized:  3.781015 
## 
## Description:
##  Wed Jul 06 09:18:58 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1309.811  0        
##  Shapiro-Wilk Test  R    W      0.9838259 0        
##  Ljung-Box Test     R    Q(10)  10.67085  0.3837304
##  Ljung-Box Test     R    Q(15)  19.76663  0.1810689
##  Ljung-Box Test     R    Q(20)  26.98452  0.1357001
##  Ljung-Box Test     R^2  Q(10)  9.513402  0.4841685
##  Ljung-Box Test     R^2  Q(15)  15.5116   0.4152316
##  Ljung-Box Test     R^2  Q(20)  17.20108  0.6398804
##  LM Arch Test       R    TR^2   10.71112  0.5538244
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.560242 -7.554513 -7.560243 -7.558223

Parametr alpha2 jest nieistotny.

GARCH(2,2)

k.garch22 <- garchFit(formula = ~ garch(2, 2),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 2), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 2)
## <environment: 0x000000001364f1b0>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1       beta2  
## 7.4570e-07  9.6229e-02  6.6635e-02  1.0000e-08  8.2333e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  7.457e-07   1.721e-07    4.333 1.47e-05 ***
## alpha1 9.623e-02   1.203e-02    8.000 1.33e-15 ***
## alpha2 6.664e-02   1.602e-02    4.159 3.19e-05 ***
## beta1  1.000e-08   7.868e-02    0.000        1    
## beta2  8.233e-01   7.131e-02   11.546  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16914.51    normalized:  3.781469 
## 
## Description:
##  Wed Jul 06 09:18:59 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1262.598  0        
##  Shapiro-Wilk Test  R    W      0.9840248 0        
##  Ljung-Box Test     R    Q(10)  10.75518  0.3769075
##  Ljung-Box Test     R    Q(15)  19.58742  0.1883372
##  Ljung-Box Test     R    Q(20)  26.80519  0.1408344
##  Ljung-Box Test     R^2  Q(10)  8.732     0.5577127
##  Ljung-Box Test     R^2  Q(15)  14.77469  0.4677651
##  Ljung-Box Test     R^2  Q(20)  16.65779  0.6750701
##  LM Arch Test       R    TR^2   9.632449  0.6481703
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.560702 -7.553541 -7.560704 -7.558178

Parametr beta1 jest nieistotny.

WYBÓR MODELU GARCH
Aby stwierdzić, który z wyżej wymienionych modeli najlepiej pasuje do danych, warto spojrzeć na wartości kryteriów informacyjnych:

##         AIC       BIC       SIC      HQIC     model
## 1 -7.362585 -7.359721 -7.362585 -7.361575   k.arch1
## 2 -7.561022 -7.556726 -7.561023 -7.559508 k.garch11
## 3 -7.560341 -7.554613 -7.560343 -7.558322 k.garch12
## 4 -7.560242 -7.554513 -7.560243 -7.558223 k.garch21
## 5 -7.560702 -7.553541 -7.560704 -7.558178 k.garch22

Najniższe wartości kryteriów posiada model GARCH(1,1), więc z racji na to, a także ze względu na to, że tylko w tym modelu wszystkie parametry były istotne (w przeciwieństwie do pozostałych modeli z klasy GARCH), dlatego ten model wybierzemy do dalszej analizy.

Wykres oszacowań warunkowej wariancji przestawia się następująco:

Aby sprawdzić, czy wystandaryzowane reszty pochodzą z rozkładu normalnego, należy spojrzeć na histogram wystandaryzowanych reszt, który wygląda jak poniżej (dla lepszego zobrazowania dodano gęstość rozkładu normalnego):

Statystyki opisowe dla wystandaryzowanych reszt:

basicStats(stdres)
##                  stdres
## nobs        4473.000000
## NAs            0.000000
## Minimum       -3.600621
## Maximum        9.297987
## 1. Quartile   -0.625353
## 3. Quartile    0.594765
## Mean          -0.001277
## Median        -0.035697
## Sum           -5.711097
## SE Mean        0.014966
## LCL Mean      -0.030617
## UCL Mean       0.028063
## Variance       1.001834
## Stdev          1.000916
## Skewness       0.441429
## Kurtosis       2.493361

Test Jarque-Bery:

jarque.bera.test(stdres)
## 
##  Jarque Bera Test
## 
## data:  stdres
## X-squared = 1306.3, df = 2, p-value < 2.2e-16

Dla porównania statystyka Jarque-Bery dla rozkładu normalnego wynosi:

## 
##  Jarque Bera Test
## 
## data:  rnorm(10000)
## X-squared = 0.18171, df = 2, p-value = 0.9131

co wyraźnie pokazuje, że wystandaryzowane reszty nie pochodzą z rozkładu normalnego.

Warto zobaczyć, czy reszty nie podlegają autokorelacji. W tym celu zostanie przeprowadzony test Durbina-Watsona dla pierwszych 5 opóźnień:

durbinWatsonTest(lm(formula = stdres ~ 1),
                 max.lag = 5)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.01327721      2.025809   0.410
##    2     -0.01166882      2.022548   0.438
##    3     -0.02552237      2.049783   0.080
##    4     -0.01765391      2.033608   0.250
##    5      0.01600897      1.965452   0.308
##  Alternative hypothesis: rho[lag] != 0

Wysokie wartości p-value wskazują na to, że nie można odrzucić hipotezy zerowej o występowaniu autokorelacji wśród reszt dla 5 pierwszych opóźnień.

I na koniec zostanie jeszcze przeprowadzony test na występowanie efektów ARCH wśród wystandaryzowanych reszt:

ArchTest(stdres, lags = 5)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  stdres
## Chi-squared = 5.2735, df = 5, p-value = 0.3834

Wysoka wartość p-value nie pozwala odrzucić hipotezy zerowej o braku efektu ARCH. A więc wygląda na to, że efekty ARCH zostały wyjaśnione przez model GARCH(1,1), który zostanie użyty do analizy Monte Carlo.

Symulacja Monte Carlo oparta o warunkową wariancję oszacowaną na postawie modelu GARCH(1,1) wygląda analogicznie jak w przypadku z wykorzystaniem rozkładu normalnego, z tym, że zamiast wariancji oszacowanej na próbie zostanie użyta warunkowa wariancja, czyli dopuszczona zostanie sytuacja, gdy wariancja zwrotów będzie się zmieniała w czasie zgodnie ze specyfkacją modelu GARCH.

r3 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(EURPLN$r)),
                sd = k.garch11@sigma.t)
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r3[i] <- sum(sims2 >= 4.23 & sims2 <= 4.49) / runs * 4
}

Na tej podstawie wyliczono prawdopodobieństwo osiągnięcia zysku przekraczającego 0,75% (czyli tyle, ile wynosi oprocentowanie tradycyjnej lokaty oferowanej przez Getin Noble Bank), które ukształtowało się na poziomie 39.68%.

Histogram wygląda następująco:

MBANK: LOKATA INWESTYCYJNA SILNY KURS IV

Importowanie danych dotyczących tym razem kursu walutowego USDPLN:

url <- "http://stooq.com/q/d/l/?s=usdpln&d1=19990104&d2=20160307&i=d"
USDPLN <- read.csv(url,
                   header = TRUE,
                   sep = ",",
                   dec = ".",
                   stringsAsFactors = F)

Przygotowywanie danych (analogiczne jak w przypadku poprzedniej lokaty):

USDPLN$Date <- as.Date(USDPLN$Date)
USDPLN <- USDPLN[, c("Date", "Close")]
colnames(USDPLN) <- c("Date", "USDPLN")

Początkowe i końcowe wartości obiektu USDPLN:

head(USDPLN, n = 10)
##          Date USDPLN
## 1  1999-01-04  3.435
## 2  1999-01-05  3.410
## 3  1999-01-06  3.418
## 4  1999-01-07  3.450
## 5  1999-01-08  3.470
## 6  1999-01-11  3.515
## 7  1999-01-12  3.520
## 8  1999-01-13  3.570
## 9  1999-01-14  3.550
## 10 1999-01-15  3.545
tail(USDPLN, n = 10)
##            Date  USDPLN
## 4399 2016-02-23 3.97636
## 4400 2016-02-24 3.97437
## 4401 2016-02-25 3.95254
## 4402 2016-02-26 3.99372
## 4403 2016-02-29 3.99756
## 4404 2016-03-01 3.98407
## 4405 2016-03-02 3.97701
## 4406 2016-03-03 3.96160
## 4407 2016-03-04 3.92765
## 4408 2016-03-07 3.93278

Wstępna analiza danych

Obliczenie ciągłych stóp zwrotu:

USDPLN$r <- diff.xts(log(USDPLN$USDPLN))

Wykres kursów zamknięcia:

Wykres ciągłych stóp zwrotu:

plot(USDPLN$Date, USDPLN$r, type = "l",
     main = "Dzienne zwroty z USDPLN",
     xlab = "", ylab = "zwroty")

Wykres wartości ACF dla zwrotów:

acf(USDPLN$r,
    lag.max = 40,
    na.action = na.pass,
    ylim = c(-0.05, 0.2),
    col = "darkblue", lwd = 7,
    main = "ACF zwrotów USD/PLN")

Wykres wartości ACF dla kwadratów zwrotów:

acf(USDPLN$r^2, 
    lag.max = 40,
    na.action = na.pass,
    ylim = c(-0.05, 0.7),
    col = "darkblue", lwd = 7,
    main = "ACF kwadratów zwrotów USD/PLN")

Statystyki opisowe:

basicStats(USDPLN$r)
##             X..USDPLN.r
## nobs        4408.000000
## NAs            1.000000
## Minimum       -0.069162
## Maximum        0.051576
## 1. Quartile   -0.004615
## 3. Quartile    0.004441
## Mean           0.000031
## Median        -0.000229
## Sum            0.135330
## SE Mean        0.000131
## LCL Mean      -0.000227
## UCL Mean       0.000288
## Variance       0.000076
## Stdev          0.008719
## Skewness       0.085882
## Kurtosis       4.070990

Wykres kwantylowy:

Symulacja Monte Carlo oparta o rozkład jednostajny

W tej analizie Monte Carlo również użyto 10 000 powtórzeń. W przypadku tej lokaty sprawdzano natomiast, czy kursy walutowe znalazły się w przedziale \(<3.78; 3.96>\).

r <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- sample(na.omit(USDPLN$r), runs, replace = T)
  sims2 <- USDPLN$USDPLN[1] * exp(cumsum(sims))
  r[i] <- sum(sims2 >= 3.78 & sims2 <= 3.96) / runs * 4
}

Prawdopodobieństwo osiągnięcia zysku przekraczającego 1,4% dla tej lokaty, wykorzystując do tego symulacje Monte Carlo opartą o rozkład jednostajny, wynosi 4.52%.

Histogram stóp zwrotu przedstawia się następująco:

Symulacja Monte Carlo oparta o rozkład normalny

r2 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(USDPLN$r)),
                sd = sd(na.omit(USDPLN$r)))
  sims2 <- USDPLN$USDPLN[1] * exp(cumsum(sims))
  r2[i] <- sum(sims2 >= 3.78 & sims2 <= 3.96) / runs * 4
}

Prawdopodobieństwo osiągnięcia zysku, który przekroczy 1,4%, wynosi 3.84%.

Histogram jest przestawiony poniżej:

Symulacja Monte Carlo oparta o oszacowanie warunkowej wariancji na podstawie modelu GARCH

ARCH(1)

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(USDPLN$r),
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x0000000012573778>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##          mu        omega       alpha1  
## -1.5350e-04   5.6169e-05   2.6767e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##          Estimate  Std. Error  t value Pr(>|t|)    
## mu     -1.535e-04   1.210e-04   -1.269    0.205    
## omega   5.617e-05   1.597e-06   35.168   <2e-16 ***
## alpha1  2.677e-01   2.551e-02   10.494   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  14810.7    normalized:  3.360722 
## 
## Description:
##  Wed Jul 06 09:19:11 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  1991.647  0           
##  Shapiro-Wilk Test  R    W      0.9670728 0           
##  Ljung-Box Test     R    Q(10)  25.28336  0.004833503 
##  Ljung-Box Test     R    Q(15)  38.00274  0.0009014529
##  Ljung-Box Test     R    Q(20)  40.12377  0.004818477 
##  Ljung-Box Test     R^2  Q(10)  674.6418  0           
##  Ljung-Box Test     R^2  Q(15)  1002.96   0           
##  Ljung-Box Test     R^2  Q(20)  1354.316  0           
##  LM Arch Test       R    TR^2   505.7306  0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.720083 -6.715733 -6.720084 -6.718549

Ze względu na to, że stała w równaniu średniej jest nieistotna, można ją wykluczyć z modelu.

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(USDPLN$r),
                    include.mean = F,
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x000000003dcc1748>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1  
## 5.6291e-05  2.6531e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  5.629e-05   1.596e-06    35.27   <2e-16 ***
## alpha1 2.653e-01   2.530e-02    10.49   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  14809.9    normalized:  3.36054 
## 
## Description:
##  Wed Jul 06 09:19:11 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  1995.084  0           
##  Shapiro-Wilk Test  R    W      0.967012  0           
##  Ljung-Box Test     R    Q(10)  25.18109  0.005012625 
##  Ljung-Box Test     R    Q(15)  38.03965  0.0008902007
##  Ljung-Box Test     R    Q(20)  40.19482  0.004719592 
##  Ljung-Box Test     R^2  Q(10)  675.2641  0           
##  Ljung-Box Test     R^2  Q(15)  1005.308  0           
##  Ljung-Box Test     R^2  Q(20)  1358.376  0           
##  LM Arch Test       R    TR^2   506.1639  0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.720172 -6.717272 -6.720173 -6.719149

Na podstawie wyników testu Ljung-Boxa na autokorelację kwadratów wystandaryzowanych reszt należy odrzucić hipotezę zerową na rzecz hipotezy alternatywnej i wyciągnąć wniosek, że istnieje autokorelacja.

GARCH(1,1)

k.garch11 <- garchFit(formula = ~ garch(1, 1),
                      data = na.omit(USDPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x0000000021c80c10>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 9.3327e-07  7.4820e-02  9.1237e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  9.333e-07   1.875e-07    4.977 6.45e-07 ***
## alpha1 7.482e-02   8.061e-03    9.282  < 2e-16 ***
## beta1  9.124e-01   8.957e-03  101.862  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  15246.44    normalized:  3.459595 
## 
## Description:
##  Wed Jul 06 09:19:11 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  441.994   0         
##  Shapiro-Wilk Test  R    W      0.9901571 0         
##  Ljung-Box Test     R    Q(10)  19.47114  0.03467084
##  Ljung-Box Test     R    Q(15)  29.28269  0.01478773
##  Ljung-Box Test     R    Q(20)  33.56834  0.02919737
##  Ljung-Box Test     R^2  Q(10)  15.22618  0.1240308 
##  Ljung-Box Test     R^2  Q(15)  20.42246  0.1563186 
##  Ljung-Box Test     R^2  Q(20)  22.76349  0.3005562 
##  LM Arch Test       R    TR^2   15.66959  0.2068424 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.917829 -6.913478 -6.917830 -6.916294

Wszystkie parametry są istotne, a wysokie wartości p-value w teście Ljung-Boxa nie pozwalają na odrzucenie hipotezy zerowej o braku autokoelacji wśród kwadratów wystandaryzowanych reszt.

GARCH(1,2)

k.garch12 <- garchFit(formula = ~ garch(1, 2),
                      data = na.omit(USDPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 2), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 2)
## <environment: 0x0000000012656a10>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1       beta2  
## 1.2374e-06  1.0645e-01  4.0406e-01  4.7283e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.237e-06   2.655e-07    4.660 3.16e-06 ***
## alpha1 1.065e-01   1.381e-02    7.706 1.29e-14 ***
## beta1  4.041e-01   1.499e-01    2.696 0.007016 ** 
## beta2  4.728e-01   1.407e-01    3.360 0.000779 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  15249.12    normalized:  3.460205 
## 
## Description:
##  Wed Jul 06 09:19:12 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  404.9651  0         
##  Shapiro-Wilk Test  R    W      0.990431  0         
##  Ljung-Box Test     R    Q(10)  18.64765  0.0449731 
##  Ljung-Box Test     R    Q(15)  28.10106  0.0209449 
##  Ljung-Box Test     R    Q(20)  32.17002  0.04151999
##  Ljung-Box Test     R^2  Q(10)  9.621513  0.4743025 
##  Ljung-Box Test     R^2  Q(15)  14.76468  0.468497  
##  Ljung-Box Test     R^2  Q(20)  17.78676  0.6014531 
##  LM Arch Test       R    TR^2   10.33001  0.5870335 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.918595 -6.912794 -6.918596 -6.916549

Wszystkie parametry są istotne.

GARCH(2,1)

k.garch21 <- garchFit(formula = ~ garch(2, 1),
                      data = na.omit(USDPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 1), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 1)
## <environment: 0x000000003e1afef8>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1  
## 9.3362e-07  7.4838e-02  1.0000e-08  9.1235e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  9.336e-07   2.039e-07    4.579 4.67e-06 ***
## alpha1 7.484e-02   1.506e-02    4.970 6.70e-07 ***
## alpha2 1.000e-08   1.695e-02    0.000        1    
## beta1  9.123e-01   1.035e-02   88.150  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  15246.43    normalized:  3.459593 
## 
## Description:
##  Wed Jul 06 09:19:12 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  442.0986  0         
##  Shapiro-Wilk Test  R    W      0.9901559 0         
##  Ljung-Box Test     R    Q(10)  19.46224  0.03476945
##  Ljung-Box Test     R    Q(15)  29.26634  0.01486   
##  Ljung-Box Test     R    Q(20)  33.54967  0.02933733
##  Ljung-Box Test     R^2  Q(10)  15.22575  0.1240456 
##  Ljung-Box Test     R^2  Q(15)  20.42055  0.1563864 
##  Ljung-Box Test     R^2  Q(20)  22.76271  0.3005955 
##  LM Arch Test       R    TR^2   15.66356  0.2071359 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.917371 -6.911570 -6.917372 -6.915325

Parametr alpha2 jest nieistotny.

GARCH(2,2)

k.garch22 <- garchFit(formula = ~ garch(2, 2),
                      data = na.omit(USDPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 2), data = na.omit(USDPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 2)
## <environment: 0x00000000219e6f78>
##  [data = na.omit(USDPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1       beta2  
## 1.2853e-06  1.0494e-01  5.3177e-03  3.5909e-01  5.1334e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  1.285e-06   4.560e-07    2.818  0.00483 ** 
## alpha1 1.049e-01   1.850e-02    5.671 1.42e-08 ***
## alpha2 5.318e-03   4.205e-02    0.126  0.89937    
## beta1  3.591e-01   3.716e-01    0.966  0.33393    
## beta2  5.133e-01   3.369e-01    1.524  0.12757    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  15249.13    normalized:  3.460207 
## 
## Description:
##  Wed Jul 06 09:19:13 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value   
##  Jarque-Bera Test   R    Chi^2  406.7065  0         
##  Shapiro-Wilk Test  R    W      0.9904186 0         
##  Ljung-Box Test     R    Q(10)  18.69056  0.04437368
##  Ljung-Box Test     R    Q(15)  28.14457  0.0206814 
##  Ljung-Box Test     R    Q(20)  32.21345  0.04107628
##  Ljung-Box Test     R^2  Q(10)  9.786843  0.4593892 
##  Ljung-Box Test     R^2  Q(15)  14.94343  0.4555    
##  Ljung-Box Test     R^2  Q(20)  17.97897  0.588794  
##  LM Arch Test       R    TR^2   10.48369  0.5736056 
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -6.918144 -6.910893 -6.918147 -6.915587

Parametr alpha2, beta1 i beta2 są nieistotne.

WYBÓR MODELU GARCH Podobnie jak wcześniej, również tym razem do wyboru najlepszego modelu najlepiej posłużyć się kryteriami informacyjnymi, które przestawiają się następująco:

##         AIC       BIC       SIC      HQIC     model
## 1 -6.720172 -6.717272 -6.720173 -6.719149   k.arch1
## 2 -6.917829 -6.913478 -6.917830 -6.916294 k.garch11
## 3 -6.918595 -6.912794 -6.918596 -6.916549 k.garch12
## 4 -6.917371 -6.911570 -6.917372 -6.915325 k.garch21
## 5 -6.918144 -6.910893 -6.918147 -6.915587 k.garch22

Pod względem kryteriów AIC, SIC i HQIC najlepszym modelem wydaje się GARCH(1,2), a pod względem kryterium BIC najlepszym jest GARCH(1,1). Decydujemy się więc na wybór modelu GARCH(1,2).

Wykres oszacowań warunkowej wariancji:

Histogram wystandaryzowanych reszt:

Statystyki opisowe dla wystandaryzowanych reszt:

basicStats(stdres)
##                  stdres
## nobs        4407.000000
## NAs            0.000000
## Minimum       -3.560382
## Maximum        7.398439
## 1. Quartile   -0.629234
## 3. Quartile    0.586840
## Mean          -0.004066
## Median        -0.027789
## Sum          -17.917611
## SE Mean        0.015064
## LCL Mean      -0.033598
## UCL Mean       0.025467
## Variance       1.000005
## Stdev          1.000002
## Skewness       0.274404
## Kurtosis       1.377867

Test Jarque-Bery:

jarque.bera.test(stdres)
## 
##  Jarque Bera Test
## 
## data:  stdres
## X-squared = 404.97, df = 2, p-value < 2.2e-16

Wyniki wskazują, że wystandaryzowane reszty nie są z rozkładu normalnego.

Test Durbina-Watsona dla pierwszych 5 opóźnień:

durbinWatsonTest(lm(formula = stdres ~ 1),
                 max.lag = 5)
##  lag Autocorrelation D-W Statistic p-value
##    1    0.0445200523      1.910793   0.000
##    2    0.0300147015      1.939358   0.030
##    3   -0.0194857635      2.037982   0.216
##    4    0.0017844740      1.995322   0.928
##    5   -0.0006915473      1.999649   0.956
##  Alternative hypothesis: rho[lag] != 0

Wysokie wartości p-value wskazują na to, że nie możemy odrzucić hipotezy zerowej o występowaniu autokorelacji, z wyjątkiem dwóch pierwszych opóźnień.

Test na występowanie efektów ARCH wśród wystandaryzowanych reszt:

ArchTest(stdres, lags = 5)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  stdres
## Chi-squared = 4.518, df = 5, p-value = 0.4775

Wysoka wartość p-value nie pozwala odrzucić hipotezy zerowej o braku efektu ARCH. A więc wygląda na to, że efekty ARCH zostały wyjaśnione przez model GARCH(1,2).

Symulacja Monte Carlo oparta o warunkową wariancję oszacowaną na postawie modelu GARCH(1,2):

r3 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(USDPLN$r)),
                sd = k.garch12@sigma.t)
  sims2 <- USDPLN$USDPLN[1] * exp(cumsum(sims))
  r3[i] <- sum(sims2 >= 3.78 & sims2 <= 3.96) / runs * 4
}

Prawdopodobieństwo osiągnięcia zysku przekraczającego 1,4%: 5.79%.

Histogram wygląda następująco:

BANK ZACHODNI WBK: LOKATA STRUKTURYZOWANA EUR ZŁOTY STABILIZACJA

Importowanie danych dotyczących kursu walutowego EURPLN:

url <- "http://stooq.com/q/d/l/?s=eurpln&d1=19990104&d2=20160510&i=d"
EURPLN <- read.csv(url,
                   header = TRUE,
                   sep = ",",
                   dec = ".",
                   stringsAsFactors = F)

Przygotowywanie danych (analogiczne jak w przypadku poprzednich lokat):

EURPLN$Date <- as.Date(EURPLN$Date)
EURPLN <- EURPLN[, c("Date", "Close")]
colnames(EURPLN) <- c("Date", "EURPLN")

Początkowe i końcowe wartości obiektu EURPLN:

head(EURPLN, n = 10)
##          Date EURPLN
## 1  1999-01-04 4.0629
## 2  1999-01-05 4.0163
## 3  1999-01-06 4.0040
## 4  1999-01-07 4.0430
## 5  1999-01-08 4.0050
## 6  1999-01-11 4.0603
## 7  1999-01-12 4.0665
## 8  1999-01-13 4.1825
## 9  1999-01-14 4.1571
## 10 1999-01-15 4.1175
tail(EURPLN, n = 10)
##            Date  EURPLN
## 4447 2016-04-27 4.38490
## 4448 2016-04-28 4.39726
## 4449 2016-04-29 4.37320
## 4450 2016-05-02 4.37999
## 4451 2016-05-03 4.39264
## 4452 2016-05-04 4.40154
## 4453 2016-05-05 4.40529
## 4454 2016-05-06 4.43284
## 4455 2016-05-09 4.43240
## 4456 2016-05-10 4.41787

Wstępna analiza danych

Obliczenie ciągłych stóp zwrotu:

EURPLN$r <- diff.xts(log(EURPLN$EURPLN))

Wykres kursów zamknięcia:

Wykres ciągłych stóp zwrotu:

plot(EURPLN$Date, EURPLN$r, type = "l",
     main = "Dzienne zwroty z EURPLN",
     xlab = "", ylab = "zwroty")

Wykres wartości ACF dla zwrotów:

acf(EURPLN$r,
    lag.max = 40,
    na.action = na.pass,
    ylim = c(-0.05, 0.2),
    col = "darkblue", lwd = 7,
    main = "ACF zwrotów EUR/PLN")

Wykres wartości ACF dla kwadratów zwrotów:

acf(EURPLN$r^2, 
    lag.max = 40,
    na.action = na.pass,
    ylim = c(-0.05, 0.7),
    col = "darkblue", lwd = 7,
    main = "ACF kwadratów zwrotów EUR/PLN")

Statystyki opisowe:

basicStats(EURPLN$r)
##             X..EURPLN.r
## nobs        4456.000000
## NAs            1.000000
## Minimum       -0.035996
## Maximum        0.055271
## 1. Quartile   -0.003388
## 3. Quartile    0.003180
## Mean           0.000019
## Median        -0.000192
## Sum            0.083761
## SE Mean        0.000095
## LCL Mean      -0.000167
## UCL Mean       0.000204
## Variance       0.000040
## Stdev          0.006310
## Skewness       0.373746
## Kurtosis       4.778056

Patrząc na podstawowe statystyki opisowe, można odnieść wrażenie, że stopy zwrotu z kursu walutowego EUR/PLN pochodzą z rozkładu normalnego, gdyż średnia oraz odchylenie standardowe są bliskie zeru, a współczynnik skośności nie sugeruje, by w rozkładzie występowała asymetria. Niestety wartość współczynnika kurtozy jest znacznie wyższa niż 3, co oznacza, że jest to rozkład leptokurtyczny i że występują tzw. grube ogony.

Wykres kwantylowy:

Na wykresie kwantylowym również widoczne są odstępstwa od rozkładu normalnego. W lewej części wykresu kwantyle leżą poniżej linii referencyjnej, w prawej części - powyżej niej.

Symulacja Monte Carlo oparta o rozkład jednostajny

W tej analizie Monte Carlo podobnie jak w poprzednich użyto 10 000 powtórzeń. Tym razem zgodnie z założeniami lokaty sprawdzano, czy kursy walutowe znalazły się w przedziale \(<4.36; 4.48>\).

r <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- sample(na.omit(EURPLN$r), runs, replace = T)
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r[i] <- sum(sims2 >= 4.36 & sims2 <= 4.48) / runs * 5
}

Prawdopodobieństwo osiągnięcia zysku przekraczającego 0,5% wynosi 24.87%.

Histogram stóp zwrotu przedstawia się następująco:

Symulacja Monte Carlo oparta o rozkład normalny

r2 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(EURPLN$r)),
                sd = sd(na.omit(EURPLN$r)))
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r2[i] <- sum(sims2 >= 4.36 & sims2 <= 4.48) / runs * 5
}

Prawdopodobieństwo osiągnięcia zysku, który przekroczy 0,5%, wynosi 25.67%.

Histogram jest przestawiony poniżej:

Symulacja Monte Carlo oparta o oszacowanie warunkowej wariancji na podstawie modelu GARCH

ARCH(1)

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(EURPLN$r),
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x000000003ddadcf8>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##          mu        omega       alpha1  
## -2.4988e-05   2.9897e-05   2.5997e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##          Estimate  Std. Error  t value Pr(>|t|)    
## mu     -2.499e-05   8.656e-05   -0.289    0.773    
## omega   2.990e-05   8.490e-07   35.212   <2e-16 ***
## alpha1  2.600e-01   2.578e-02   10.084   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16396.25    normalized:  3.680415 
## 
## Description:
##  Wed Jul 06 09:19:24 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  5591.664  0           
##  Shapiro-Wilk Test  R    W      0.9567237 0           
##  Ljung-Box Test     R    Q(10)  23.7254   0.008363601 
##  Ljung-Box Test     R    Q(15)  40.33689  0.0004033056
##  Ljung-Box Test     R    Q(20)  48.66047  0.0003434122
##  Ljung-Box Test     R^2  Q(10)  458.2501  0           
##  Ljung-Box Test     R^2  Q(15)  536.6176  0           
##  Ljung-Box Test     R^2  Q(20)  679.7059  0           
##  LM Arch Test       R    TR^2   331.4438  0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.359484 -7.355173 -7.359485 -7.357964

Ze względu na to, że stała w równaniu średniej jest nieistotna, można ją wykluczyć z modelu.

k.arch1 <- garchFit(formula = ~ garch(1, 0),
                    data = na.omit(EURPLN$r),
                    include.mean = F,
                    cond.dist = "norm",
                    trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 0), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 0)
## <environment: 0x00000000134422f8>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1  
## 2.9896e-05  2.5997e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  2.990e-05   8.493e-07    35.20   <2e-16 ***
## alpha1 2.600e-01   2.579e-02    10.08   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16396.21    normalized:  3.680406 
## 
## Description:
##  Wed Jul 06 09:19:24 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value     
##  Jarque-Bera Test   R    Chi^2  5580.99   0           
##  Shapiro-Wilk Test  R    W      0.9567359 0           
##  Ljung-Box Test     R    Q(10)  23.66145  0.008551545 
##  Ljung-Box Test     R    Q(15)  40.30685  0.0004075515
##  Ljung-Box Test     R    Q(20)  48.6593   0.0003435434
##  Ljung-Box Test     R^2  Q(10)  459.174   0           
##  Ljung-Box Test     R^2  Q(15)  537.7303  0           
##  Ljung-Box Test     R^2  Q(20)  680.8967  0           
##  LM Arch Test       R    TR^2   331.9952  0           
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.359914 -7.357040 -7.359915 -7.358901

Na podstawie wyników testu Ljung-Boxa na autokorelację kwadratów wystandaryzowanych reszt należy odrzucić hipotezę zerową na rzecz hipotezy alternatywnej i wyciągnąć wniosek, że istnieje autokorelacja.

GARCH(1,1)

k.garch11 <- garchFit(formula = ~ garch(1, 1),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 1), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 1)
## <environment: 0x0000000012605220>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1  
## 4.0051e-07  8.6314e-02  9.0631e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  4.005e-07   8.960e-08     4.47 7.82e-06 ***
## alpha1 8.631e-02   8.550e-03    10.10  < 2e-16 ***
## beta1  9.063e-01   8.768e-03   103.36  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16839.08    normalized:  3.779815 
## 
## Description:
##  Wed Jul 06 09:19:24 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1301.425  0        
##  Shapiro-Wilk Test  R    W      0.9838705 0        
##  Ljung-Box Test     R    Q(10)  10.59849  0.3896425
##  Ljung-Box Test     R    Q(15)  19.82326  0.1788178
##  Ljung-Box Test     R    Q(20)  27.23931  0.1286644
##  Ljung-Box Test     R^2  Q(10)  9.408607  0.4938132
##  Ljung-Box Test     R^2  Q(15)  15.26352  0.4326071
##  Ljung-Box Test     R^2  Q(20)  17.01523  0.6519847
##  LM Arch Test       R    TR^2   10.58021  0.5651952
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.558284 -7.553973 -7.558285 -7.556764

Wszystkie parametry są istotne, a wysokie wartości p-value w teście Ljung-Boxa nie pozwalają na odrzucenie hipotezy zerowej o braku autokoelacji wśród kwadratów wystandaryzowanych reszt.

GARCH(1,2)

k.garch12 <- garchFit(formula = ~ garch(1, 2),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(1, 2), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(1, 2)
## <environment: 0x000000000d6492a0>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1       beta1       beta2  
## 4.3248e-07  9.4130e-02  7.9381e-01  1.0410e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  4.325e-07   1.065e-07    4.059 4.92e-05 ***
## alpha1 9.413e-02   1.436e-02    6.557 5.49e-11 ***
## beta1  7.938e-01   1.604e-01    4.949 7.48e-07 ***
## beta2  1.041e-01   1.485e-01    0.701    0.483    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16838.57    normalized:  3.779703 
## 
## Description:
##  Wed Jul 06 09:19:25 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1332.951  0        
##  Shapiro-Wilk Test  R    W      0.9837144 0        
##  Ljung-Box Test     R    Q(10)  10.60397  0.3891922
##  Ljung-Box Test     R    Q(15)  19.74609  0.1818908
##  Ljung-Box Test     R    Q(20)  27.13296  0.1315647
##  Ljung-Box Test     R^2  Q(10)  8.893428  0.5422467
##  Ljung-Box Test     R^2  Q(15)  14.57327  0.482569 
##  Ljung-Box Test     R^2  Q(20)  16.25335  0.7007878
##  LM Arch Test       R    TR^2   9.986189  0.6171723
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.557609 -7.551861 -7.557611 -7.555583

Parametr beta2 jest nieistotny.

GARCH(2,1)

k.garch21 <- garchFit(formula = ~ garch(2, 1),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 1), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 1)
## <environment: 0x0000000021ed3b18>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1  
## 4.0010e-07  8.6217e-02  1.0000e-08  9.0641e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  4.001e-07   9.305e-08    4.300 1.71e-05 ***
## alpha1 8.622e-02   1.637e-02    5.266 1.40e-07 ***
## alpha2 1.000e-08   1.792e-02    0.000        1    
## beta1  9.064e-01   9.795e-03   92.537  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16838.34    normalized:  3.779649 
## 
## Description:
##  Wed Jul 06 09:19:25 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1304.888  0        
##  Shapiro-Wilk Test  R    W      0.9838148 0        
##  Ljung-Box Test     R    Q(10)  10.6264   0.3873558
##  Ljung-Box Test     R    Q(15)  19.84618  0.177913 
##  Ljung-Box Test     R    Q(20)  27.2418   0.1285972
##  Ljung-Box Test     R^2  Q(10)  9.435229  0.4913557
##  Ljung-Box Test     R^2  Q(15)  15.30371  0.4297697
##  Ljung-Box Test     R^2  Q(20)  17.02085  0.6516197
##  LM Arch Test       R    TR^2   10.61499  0.5621703
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.557502 -7.551754 -7.557504 -7.555476

Parametr alpha2 jest nieistotny.

GARCH(2,2)

k.garch22 <- garchFit(formula = ~ garch(2, 2),
                      data = na.omit(EURPLN$r),
                      include.mean = F,
                      cond.dist = "norm",
                      trace = FALSE)

Wyniki (w tym testy diagnostyczne):

## 
## Title:
##  GARCH Modelling 
## 
## Call:
##  garchFit(formula = ~garch(2, 2), data = na.omit(EURPLN$r), cond.dist = "norm", 
##     include.mean = F, trace = FALSE) 
## 
## Mean and Variance Equation:
##  data ~ garch(2, 2)
## <environment: 0x0000000012167c38>
##  [data = na.omit(EURPLN$r)]
## 
## Conditional Distribution:
##  norm 
## 
## Coefficient(s):
##      omega      alpha1      alpha2       beta1       beta2  
## 7.4856e-07  9.6390e-02  6.6713e-02  1.0000e-08  8.2326e-01  
## 
## Std. Errors:
##  based on Hessian 
## 
## Error Analysis:
##         Estimate  Std. Error  t value Pr(>|t|)    
## omega  7.486e-07   1.728e-07    4.332 1.48e-05 ***
## alpha1 9.639e-02   1.215e-02    7.934 2.22e-15 ***
## alpha2 6.671e-02   1.615e-02    4.132 3.60e-05 ***
## beta1  1.000e-08   7.782e-02    0.000        1    
## beta2  8.233e-01   7.051e-02   11.675  < 2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Log Likelihood:
##  16840.36    normalized:  3.780103 
## 
## Description:
##  Wed Jul 06 09:19:26 2016 by user: Ania 
## 
## 
## Standardised Residuals Tests:
##                                 Statistic p-Value  
##  Jarque-Bera Test   R    Chi^2  1257.658  0        
##  Shapiro-Wilk Test  R    W      0.9840146 0        
##  Ljung-Box Test     R    Q(10)  10.70602  0.3808759
##  Ljung-Box Test     R    Q(15)  19.67133  0.1849066
##  Ljung-Box Test     R    Q(20)  27.06326  0.1334937
##  Ljung-Box Test     R^2  Q(10)  8.636998  0.5668648
##  Ljung-Box Test     R^2  Q(15)  14.5628   0.483343 
##  Ljung-Box Test     R^2  Q(20)  16.47976  0.6864501
##  LM Arch Test       R    TR^2   9.5258    0.6574843
## 
## Information Criterion Statistics:
##       AIC       BIC       SIC      HQIC 
## -7.557962 -7.550777 -7.557965 -7.555429

Parametr beta1 jest nieistotny.

WYBÓR MODELU GARCH

Podobnie jak wcześniej, również tym razem do wyboru najlepszego modelu najlepiej posłużyć się kryteriami informacyjnymi, które przedstawiają się następująco:

##         AIC       BIC       SIC      HQIC     model
## 1 -7.359914 -7.357040 -7.359915 -7.358901   k.arch1
## 2 -7.558284 -7.553973 -7.558285 -7.556764 k.garch11
## 3 -7.557609 -7.551861 -7.557611 -7.555583 k.garch12
## 4 -7.557502 -7.551754 -7.557504 -7.555476 k.garch21
## 5 -7.557962 -7.550777 -7.557965 -7.555429 k.garch22

Pod względem wszystkich kryteriów informacyjnych najlepszym spośród modeli wydaje się GARCH(1,1). Tylko w tym modelu wszystkie parametry były istotne.

Wykres oszacowań warunkowej wariancji:

Histogram wystandaryzowanych reszt:

Statystyki opisowe dla wystandaryzowanych reszt:

basicStats(stdres)
##                  stdres
## nobs        4455.000000
## NAs            0.000000
## Minimum       -3.592168
## Maximum        9.326893
## 1. Quartile   -0.623595
## 3. Quartile    0.595471
## Mean          -0.000780
## Median        -0.035766
## Sum           -3.474399
## SE Mean        0.015000
## LCL Mean      -0.030188
## UCL Mean       0.028628
## Variance       1.002436
## Stdev          1.001217
## Skewness       0.446234
## Kurtosis       2.524146

Test Jarque-Bery:

jarque.bera.test(stdres)
## 
##  Jarque Bera Test
## 
## data:  stdres
## X-squared = 1333, df = 2, p-value < 2.2e-16

Wyniki wskazują, że wystandaryzowane reszty nie są z rozkładu normalnego.

Test Durbina-Watsona dla pierwszych 5 opóźnień:

durbinWatsonTest(lm(formula = stdres ~ 1),
                 max.lag = 5)
##  lag Autocorrelation D-W Statistic p-value
##    1     -0.01346127      2.026082   0.356
##    2     -0.01154733      2.022201   0.444
##    3     -0.02556279      2.049336   0.102
##    4     -0.01703556      2.031811   0.252
##    5      0.01643676      1.963935   0.204
##  Alternative hypothesis: rho[lag] != 0

Wysokie wartości p-value wskazują na to, że nie możemy odrzucić hipotezy zerowej o występowaniu autokorelacji wśród wystandaryzowanych reszt.

Test na występowanie efektów ARCH wśród wystandaryzowanych reszt:

ArchTest(stdres, lags = 5)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  stdres
## Chi-squared = 4.7803, df = 5, p-value = 0.4433

Wysoka wartość p-value nie pozwala odrzucić hipotezy zerowej o braku efektu ARCH. A więc wygląda na to, że efekty ARCH zostały wyjaśnione przez model GARCH(1,1).

Symulacja Monte Carlo oparta o warunkową wariancję oszacowaną na podstawie modelu GARCH(1,1):

r3 <- array(0, 10000)
for(i in 1:10000){
  runs <- 252
  sims <- rnorm(runs,
                mean = mean(na.omit(EURPLN$r)),
                sd = k.garch12@sigma.t)
  sims2 <- EURPLN$EURPLN[1] * exp(cumsum(sims))
  r3[i] <- sum(sims2 >= 4.36 & sims2 <= 4.48) / runs * 5
}

Prawdopodobieństwo osiągnięcia zysku przekraczającego 1,8%: 2.3%.

Histogram wygląda następująco:

Podsumowanie

W niniejszej pracy podjęto problem analizy ryzyka rozumianego jako możliwość osiągnięcia zakładanego zysku przez osoby inwestujące w lokaty strukturyzowane. Metody, które zostały zaprezentowane, pokazują, że szansa osiągnięcia zysku na lokacie strukturyzowanej względem tradycyjnych lokat bankowych jest nieporównywalnie mniejsza.

Pierwsza z analizowanych lokat to oferowana przez Getin Noble Bank lokata strukturyzowana Range Accrual EUR/PLN maj 2016. W porównaniu do lokaty standardowej oferowanej przez Getin Bank, której średnie oprocentowanie wynosi 0,75%, wypada ona tylko teoretycznie korzystnie dla potencjalnego inwestora. Prawdopodobieństwo osiągnięcia zysku powyżej 0,75% dla tego produktu strukturyzowanego wynosi bowiem ok. 39%.

Silny kurs IV mBanku wydaje się być najmniej atrakcyjnym z trzech analizowanych przez nas produktów. Formuła służąca do obliczania wysokości odsetek w przypadku tej lokaty oparta jest na kursie USD/PLN. Bank w ofercie ma lokatę terminową, gdzie klient może zyskać 1,4%. Prawdopodobieństwo osiągnięcia zysku większego niż przy założeniu standardowej lokaty oferowanej przez bank wynosi zaledwie od 4% do 6%.

Natomiast szansa osiągnięcia ponadprzeciętnego zysku z lokaty strukturyzowanej EUR Złoty Stabilizacja oferowanej przez Bank Zachodni WBK oscyluje w okolicach 26%. W porównaniu z lokatą standardową oferowaną przez Bank Zachodni WBK, której oprocentowanie to 0,5%, oferta ta również nie wypada korzystnie.