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.
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.
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.
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)
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
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.
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):
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:
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:
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
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:
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:
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:
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:
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
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.
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:
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:
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:
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.