Każdy model prognostyczny może być rozumiany na dwa sposoby. Pierwszy wynika z założenia, że istnieje "prawdziwy model", którym można prognozować pewne wielkości w kolejnych okresach. Nie chodzi tu o prawdziwy model w ścisłym znaczeniu tego słowa, ale o model wystarczająco dobry w pewnym oknie czasowym. Z tego założenia wywodzi się sama możliwość użycia próby testowej (out-of-sample) w ten sposób, że do modelu podstawiamy albo prognozy z przeszłości (argument n.ahead w rugarch omówiony w poprzednim artykule) albo faktyczne wartości, których model "nie widział" podczas estymacji parametrów (n.roll dla prognozy kroczącej). W przypadku prognozy kroczącej (rolling forecast) przedłużamy niejako model w przyszłość, używając możliwie najbardziej aktualnych danych, ale przy zachowaniu starych parametrów, i to się czasem nazywa rolowaniem prognozy.
Drugi sposób modelowania wynika z założenia, że nie istnieje prawdziwy model i to czym dysponujemy należy przez cały czas reestymować. W świecie ekonomii i giełdy jest to naturalne założenie, a nawet stanowi coś w rodzaju aksjomatu. Problem z nim jest taki, że dużo trudniej jest testować taki model. Próba testowa jest równa treningowej, bo każda kolejna obserwacja jest dodawana do próby uczącej, która z kolei wykorzystywana jest do nowej estymacji parametrów.
W praktyce obydwa sposoby mieszane są ze sobą lub używane równorzędnie. I tak najczęściej prognoza krocząca zaczyna się dopiero od jakiegoś dalszego okresu, a reestymacja nie odbywa się co okres, ale np. co kilka okresów, co przyspiesza proces obliczeń. Równoległe zaś użycie obu metod umożliwia ocenę pogarszania się modelu w czasie. Jeżeli bowiem zakładamy, że parametry modelu są zmienne w czasie - są dynamiczne, to jeśli nasza prognoza też jest dynamiczna, to powinna być lepsza niż statyczna (czyli niż bez reestymacji). Jeżeli zatem widzimy, że prognoza dynamiczna jest gorsza od statycznej, to dostajemy dowód, że model jest błędny - przypadkowo się dostroił do próby testowej.
Inaczej mówiąc, o ile użycie kryterium informacyjnego (AIC, BIC, HQC) może dać złudzenie uzyskania dobrego modelu z powodu sztucznego dopasowania go do próby uczącej, o tyle prognoza krocząca bez reestymacji może dać złudzenie uzyskania dobrego modelu z powodu sztucznego dopasowania do próby testowej. I tak jak prognoza krocząca bez reestymacji jest sposobem, żeby odkryć pierwsze złudzenie, o tyle prognoza z reestymacją jest sposobem, by odkryć drugie złudzenie.
Prognozę bez reestymacji omówiłem wcześniej. Teraz zajmę się drugim przypadkiem. Prognozę kroczącą z reestymacją można oczywiście samodzielnie zakodować, ale rugarch oferuje specjalną funkcję: arfimaroll() i ugarchroll(). Ta druga jest bardziej ogólna, dlatego to nią się posłużymy. Ma ona ogólną postać:
ugarchroll(spec, data, n.ahead = 1, forecast.length = 500, n.start = NULL, refit.every = 25, refit.window = c("recursive", "moving"), window.size = NULL, solver = "hybrid", fit.control = list(), solver.control = list(), calculate.VaR = TRUE, VaR.alpha = c(0.01, 0.05), cluster = NULL, keep.coef = TRUE, ...)
Funkcja ma następujące argumenty:
spec - teoretyczny model GARCH,
data - dane do modelowania i prognozy, najlepiej w xts,
n.ahead - pomijamy (nie ma sensu w przypadku tej funkcji, bo to jest zwykła liczba okresów do prognozy bez refitingu)
forecast.length - długość prognozy dla próby testowej (tj. out-of-sample), która liczona jest końca całej próby,
n.start - można użyć zamiast forecast.length, zamiast liczyć od końca można po prostu określić punkt startowy dla prognozy,
refit.every - określa, co którą obserwację w próbie testowej ponownie estymować; jeśli więc chcemy aby dla każdej następnej obserwacji reestymować, wpisujemy 1,
refit.window - wybór czy reestymować od początku próby do ostatniej dostępnej obserwacji ("recursive"), czy też reestymować w oknie o stałej liczebności, czyli tak jak np. średnia 30-okresowa ("moving"),
window.size - jeżeli wybraliśmy refit.window = "moving", wtedy ustawiamy tu długość okna, w którym estymowane są parametry; w przeciwnym wypadku dajemy NULL,
solver - zazwyczaj wybieram "hybrid", bo jest najbardziej wszechstronny,
cluster - również tu stosujemy przetwarzanie równoległe, aby przyspieszyć obliczenia; dla samej funkcji nie potrzeba żadnego dodatkowego pakietu, natomiast problemy się mogą robić, gdy używamy złożonych funkcji, wewnątrz których używamy niniejszej funkcji ugarchroll (dlatego używam dodatkowo pakietu parallel).
Mimo dynamiczności kroczącej prognozy, trzeba mieć na względzie, że model teoretyczny w sensie jego rodzaju nie zmienia postaci podczas rolowania prognozy. Szukamy więc najlepszego modelu. Dotychczas posługiwałem się funkcją auto.arfima(). Ponieważ jednak zdecydowałem posłużyć się ogólniejszym modelem, tj. ARMA-GARCH(1, 1), musiałem zbudować funkcję, która będzie iteracyjnie obliczać statystyki dla każdego rzędu ARMA. jak widać rzędy GARCH pozostawiam na poziomie (1, 1). Sprawdzanie kolejnych rzędów do samego GARCH bardzo wydłużyłoby analizę. Z moich dotychczasowych prób wynikało, że GARCH(1, 1) jest całkowicie wystarczający, ale kiedyś można będzie to lepiej ocenić.
Funkcja będzie poszukiwać najlepszego modelu wg trzech kryteriów: najniższego HQIC, najwyższego DAC w próbie uczącej i najwyższego DAC w próbie testowej. Aby cały proces przyspieszyć trzeba użyć przetwarzania równoległego. O ile rugarch importuje sam pakiet parallel, ja użyję innego - doParallel. Przydatny będzie też w tym celu pakiet foreach. Poza tym zastosuję funkcję bind_rows() z pakietu dplyr. Pakiet ten jest częścią większego pakietu tidyverse. Reszta jak wcześniej (czyli xts i rugarch). Cała analiza jest kontynuacją poprzednich (1, 2, 3, 4). W sumie zaczynamy od:
# Przedwstęp
if (require("tidyverse")==FALSE) {
install.packages("tidyverse")
}
library("dplyr")
if (require("xts")==FALSE) {
install.packages("xts")
}
library("xts")
if (require("rugarch")==FALSE) {
install.packages("rugarch")
}
library("rugarch")
if (require("foreach")==FALSE) {
install.packages("foreach")
}
library("foreach")
if (require("doParallel")==FALSE) {
install.packages("doParallel")
}
library("doParallel")
#precyzja i sposób zapisu liczb:
options(scipen = 100, digits = 4)
Kontynuuję analizę tygodniowych (logarytmicznych) stóp zwrotu WIG20, ale tym razem 230 ostatnich danych - tak żeby mieć 200 poza próbą testową (źródło: stooq.pl). Ostatnie notowanie 11.10.2024:
# Wstęp
nazwaPliku = "wig20_d.csv"
Obs <- 231
plik <- read.csv(nazwaPliku)
plik$Data <- as.Date(plik$Data)
tabela <- tail(to.weekly(as.xts(plik), indexAt="endof", OHLC=FALSE), Obs)
cena <- tabela$Zamkniecie
stopaZwrotu <- diff.xts(log(cena))
tabela$stopaZwrotu <- stopaZwrotu
tabela <- na.omit(tabela)
stopaZwrotu <- tabela$stopaZwrotu
Używam modelu EGARCH(1, 1) o rozkładzie skośno-normalnym.
Może najpierw pokażę prosty i krótki kod na szukanie optimum, bez obliczeń równoległych:
# stare
rozklad <- "snorm"
hqc <- list()
dacDopas <- list()
dacPrognoza <- list()
model_Garch <- "eGARCH"
submodel_Garch <- NULL
wyrzuc <- 30
for (k in 0:1) {
for (i in 0:15) {
for (j in 0:15) {
tryCatch({
dopasGarch <- NULL
rzad_modelu <- sprintf("ARMA(%d, %d)%s", i, j, ifelse(k == 1, "-ARCH_In_Mean", ""))
mojGarch <- ugarchspec(variance.model = list(model = model_Garch, submodel = submodel_Garch,
garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(i, j), archm = as.logical(k)),
distribution.model = rozklad)
dopasGarch <- ugarchfit(spec = mojGarch, data = stopaZwrotu, out.sample=wyrzuc,
#solver = "nlminb")
solver = "hybrid")
# HQC
hqc[[rzad_modelu]] <- infocriteria(dopasGarch)[4,]
# DAC in sample
stopaZwrotuDopas <- fitted(dopasGarch)
stopaZwrotuZgodna <- stopaZwrotuDopas + residuals(dopasGarch)
dacDopas[[rzad_modelu]] <- DACTest(forecast = as.numeric(stopaZwrotuDopas),
actual = as.numeric(stopaZwrotuZgodna),
test = "PT")$DirAcc
# wg DAC out of sample
prognozaGarch <- ugarchforecast(dopasGarch, n.ahead = 1, n.roll = wyrzuc-1)
dacPrognoza[[rzad_modelu]] <- fpm(prognozaGarch)[3]
names(dacPrognoza[[rzad_modelu]]) <- rzad_modelu
}, error = function(e) {
message("Błąd w ARMA(", i, ", ", j, ") z k = ", k, ": ", conditionMessage(e))
return(list(error = conditionMessage(e), rzad_modelu = rzad_modelu))
})
}
}
}
Gdy jednak ustawiamy max AR i MA na więcej niż 10, czas mocno się wydłuża, szczególnie dla rozkładu niegaussowskiego. Zoptymalizowałem więc kod, tak by używał przetwarzania równoległego, jak już było wspomniane. Powyższy kod może wyglądać wtedy następująco:
# to samo co wyżej z parallel
rozklad <- "snorm"
hqc <- list()
dacDopas <- list()
dacPrognoza <- list()
model_Garch <- "eGARCH"
submodel_Garch <- NULL
wyrzuc <- 30
# Ustawienie równoległego backendu do użycia wielu procesorów
ileRdzeni <- detectCores() - 1 # Użyj jednego mniej niż całkowita liczba rdzeni
klaster <- makeCluster(ileRdzeni)
registerDoParallel(klaster)
# Utworzenie siatki parametrów dla pętli
siatka_parametrow <- expand.grid(k = 0:1, i = 0:15, j = 0:15)
# Użycie foreach do przetwarzania równoległego
wyniki <- foreach(param = 1:nrow(siatka_parametrow), .packages = c("rugarch")) %dopar% {
k <- siatka_parametrow$k[param]
i <- siatka_parametrow$i[param]
j <- siatka_parametrow$j[param]
rzad_modelu <- sprintf("ARMA(%d, %d)%s", i, j, ifelse(k == 1, "-ARCH_In_Mean", ""))
tryCatch({
dopasGarch <- NULL
mojGarch <- ugarchspec(variance.model = list(model = model_Garch, submodel = submodel_Garch,
garchOrder = c(1, 1)),
mean.model = list(armaOrder = c(i, j), archm = as.logical(k)),
distribution.model = rozklad)
dopasGarch <- ugarchfit(spec = mojGarch, data = stopaZwrotu, out.sample=wyrzuc,
solver = "hybrid")
stopaZwrotuDopas <- fitted(dopasGarch)
stopaZwrotuZgodna <- stopaZwrotuDopas + residuals(dopasGarch)
prognozaGarch <- ugarchforecast(dopasGarch, n.ahead = 1, n.roll = wyrzuc - 1)
# Inicjalizacja wartości DAC
dacDopas_wartosc <- NA
dacPrognoza_wartosc <- NA
# Sprawdzenie ARMA(0, 0) i pominięcie DACTest jeśli prawda
if (!(i == 0 && j == 0 && k == 0)) {
dacDopas_wartosc <- DACTest(forecast = as.numeric(stopaZwrotuDopas),
actual = as.numeric(stopaZwrotuZgodna),
test = "PT")$DirAcc
dacPrognoza_wartosc <- as.numeric(fpm(prognozaGarch)[3]) # Liczenie DAC dla prognozy
}
return(list(
rzad_modelu = rzad_modelu,
hqc = infocriteria(dopasGarch)[4,],
dacDopas = dacDopas_wartosc,
dacPrognoza = dacPrognoza_wartosc
))
}, error = function(e) {
message("Błąd w ARMA(", i, ", ", j, ") z k = ", k, ": ", conditionMessage(e))
return(list(error = conditionMessage(e), rzad_modelu = rzad_modelu))
})
}
# Zatrzymaj klaster po przetwarzaniu
stopCluster(klaster)
# Przetwórz wyniki i przechowaj je w oryginalnych listach
for (wynik in wyniki) {
if (!is.null(wynik)) {
for (nazwa_modelu in names(wynik)) {
hqc[[wynik$rzad_modelu]] <- wynik$hqc
dacDopas[[wynik$rzad_modelu]] <- wynik$dacDopas
dacPrognoza[[wynik$rzad_modelu]] <- wynik$dacPrognoza
}
}
}
> kryterium_hqc
                    ARMA(13, 10)
HQC                      -4.3762
DAC (in sample)           0.7100
DAC (out of sample)       0.5333
> kryterium_dacDopas
                    ARMA(13, 10)
HQC                      -4.3762
DAC (in sample)           0.7100
DAC (out of sample)       0.5333
> kryterium_dacPrognoza
                    ARMA(12, 8)-ARCH_In_Mean
HQC                                  -4.1194
DAC (in sample)                       0.6350
DAC (out of sample)                   0.7667
 | |
  | 
Rodzą się dwa spostrzeżenia. Po pierwsze wszystkie 3 kryteria dały podobne optima, co jest dobrym znakiem. W przypadku HQC i DAC dla próby uczącej dostajemy to samo optimum, ARMA(13, 10). Szybko jednak zauważymy, że ten model daje zupełnie przypadkowe wyniki z punktu widzenia DAC w próbie testowej. Nie znaczy to jeszcze, że model jest zupełnie bezużyteczny, bo znak stopy zwrotu jest jednym z prognozowanych elementów, a ponadto nie uwzględniliśmy w ogóle reestymacji. Za to najlepszy model dla DAC na próbie testowej to ARMA(12, 8)-Arch_In_Mean. Na 30 obserwacji ok. 23 jest poprawnie prognozowanych (76,67%). Dalej wyciągamy parametry:
# parametry - HQC
wyciagnij_liczby <- function(wyr, x) {
as.numeric(gsub("[^0-9]", "", substr(wyr, x, x+2), ))
}
rzadAR_hqc <- wyciagnij_liczby(colnames(kryterium_hqc), 6)
rzadMA_hqc <- wyciagnij_liczby(colnames(kryterium_hqc), 9)
czy_archm_hqc <- grepl("ARCH_In_Mean", colnames(kryterium_hqc))
# parametry - DAC out of sample
wyciagnij_liczby <- function(wyr, x) {
as.numeric(gsub("[^0-9]", "", substr(wyr, x, x+2), ))
}
rzadAR_DAC <- wyciagnij_liczby(colnames(kryterium_dacPrognoza), 6)[1]
rzadMA_DAC <- wyciagnij_liczby(colnames(kryterium_dacPrognoza), 9)[1]
czy_archm_DAC <- grepl("ARCH_In_Mean", colnames(kryterium_dacPrognoza))[1]
> dopasGarch_hqc
*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*
Conditional Variance Dynamics 	
-----------------------------------
GARCH Model	: eGARCH(1,1)
Mean Model	: ARFIMA(13,0,10)
Distribution	: snorm 
Optimal Parameters
------------------------------------
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001778    0.000001    3187.4        0
ar1     0.613189    0.000060   10174.9        0
ar2    -0.230097    0.000038   -6082.9        0
ar3     0.222988    0.000043    5243.7        0
ar4     0.217702    0.000065    3368.1        0
ar5    -0.327908    0.000031  -10717.8        0
ar6    -0.045269    0.000000 -106355.2        0
ar7     0.204282    0.000025    8227.4        0
ar8    -0.295914    0.000029  -10116.2        0
ar9     0.914463    0.000003  327459.8        0
ar10   -0.282518    0.000051   -5548.4        0
ar11    0.049116    0.000005   10504.4        0
ar12   -0.271441    0.000008  -32509.3        0
ar13    0.137039    0.000020    6840.4        0
ma1    -0.231903    0.000043   -5375.9        0
ma2     0.200755    0.000037    5378.9        0
ma3    -0.006765    0.000002   -4222.9        0
ma4    -0.347592    0.000053   -6613.8        0
ma5     0.336234    0.000058    5793.3        0
ma6     0.136536    0.000055    2460.6        0
ma7    -0.346302    0.000069   -4984.0        0
ma8     0.448850    0.000068    6615.9        0
ma9    -1.371759    0.000196   -7006.0        0
ma10   -0.033945    0.000011   -3077.0        0
omega  -0.947041    0.000183   -5171.6        0
alpha1 -0.386418    0.000083   -4648.3        0
beta1   0.875887    0.000131    6680.6        0
gamma1 -0.303940    0.000138   -2201.8        0
skew    0.721121    0.000567    1270.8        0
Robust Standard Errors:
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001778    0.000003    572.79        0
ar1     0.613189    0.000158   3888.48        0
ar2    -0.230097    0.000052  -4414.02        0
ar3     0.222988    0.000133   1678.64        0
ar4     0.217702    0.000236    923.73        0
ar5    -0.327908    0.000005 -62812.59        0
ar6    -0.045269    0.000011  -4310.29        0
ar7     0.204282    0.000040   5126.05        0
ar8    -0.295914    0.000116  -2561.42        0
ar9     0.914463    0.000487   1878.31        0
ar10   -0.282518    0.000185  -1528.32        0
ar11    0.049116    0.000007   6918.33        0
ar12   -0.271441    0.000099  -2749.41        0
ar13    0.137039    0.000032   4308.67        0
ma1    -0.231903    0.000103  -2252.38        0
ma2     0.200755    0.000146   1378.90        0
ma3    -0.006765    0.000004  -1662.03        0
ma4    -0.347592    0.000118  -2938.63        0
ma5     0.336234    0.000067   5008.16        0
ma6     0.136536    0.000331    412.02        0
ma7    -0.346302    0.000170  -2038.25        0
ma8     0.448850    0.000028  15997.18        0
ma9    -1.371759    0.000816  -1681.73        0
ma10   -0.033945    0.000046   -735.19        0
omega  -0.947041    0.001079   -877.72        0
alpha1 -0.386418    0.000124  -3120.09        0
beta1   0.875887    0.000227   3858.24        0
gamma1 -0.303940    0.000381   -798.69        0
skew    0.721121    0.000122   5933.58        0
LogLikelihood : 486 
Information Criteria
------------------------------------
                    
Akaike       -4.5698
Bayes        -4.0915
Shibata      -4.6051
Hannan-Quinn -4.3762
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                          statistic p-value
Lag[1]                        2.234  0.1350
Lag[2*(p+q)+(p+q)-1][68]     22.335  1.0000
Lag[4*(p+q)+(p+q)-1][114]    38.545  0.9999
d.o.f=23
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      3.788 0.05163
Lag[2*(p+q)+(p+q)-1][5]     4.638 0.18454
Lag[4*(p+q)+(p+q)-1][9]     5.538 0.35487
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]   0.01662 0.500 2.000  0.8974
ARCH Lag[5]   1.46976 1.440 1.667  0.6003
ARCH Lag[7]   1.97098 2.315 1.543  0.7235
Nyblom stability test
------------------------------------
Joint Statistic:  no.parameters>20 (not available)
Individual Statistics:               
mu     0.026996
ar1    0.011957
ar2    0.012313
ar3    0.011328
ar4    0.013683
ar5    0.015958
ar6    0.013125
ar7    0.007785
ar8    0.008588
ar9    0.007616
ar10   0.006301
ar11   0.006253
ar12   0.008755
ar13   0.009341
ma1    0.013380
ma2    0.007712
ma3    0.016855
ma4    0.013099
ma5    0.007400
ma6    0.009297
ma7    0.013352
ma8    0.013728
ma9    0.013263
ma10   0.007913
omega  0.386518
alpha1 0.245545
beta1  0.405043
gamma1 0.825370
skew   0.776156
Asymptotic Critical Values (10% 5% 1%)
Individual Statistic:	 0.35 0.47 0.75
Sign Bias Test
------------------------------------
                   t-value   prob sig
Sign Bias            1.027 0.3056    
Negative Sign Bias   1.329 0.1853    
Positive Sign Bias   1.295 0.1968    
Joint Effect         5.945 0.1143    
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20      24.6      0.17413
2    30      33.7      0.25041
3    40      56.8      0.03258
4    50      63.0      0.08625Parametry skośności i odpowiedzialne za efekt EGARCH są trochę niestabilne (wartość powyżej 0,47), ale poza tym jest ok - nie ma autokorelacji w resztach, więc uwzględniliśmy wszystkie autokorelacje, także w kwadratach reszt, a wszystkie parametry są istotne. Jedynie dopasowanie w grupie 3 w teście dobroci Pearsona jest nieco za słabe - prawdopodobnie rozkład reszt jest nieco inny niż wybrano "snorm", ale jest to duże odchylenie.
Dla upewnienia się czy nie ma gdzieś pomyłki, możemy użyć testu na DAC:
> # DAC w próbie
> dopas_hqc <- fitted(dopasGarch_hqc)
> stopaZwrotuZgodne <- dopas_hqc + residuals(dopasGarch_hqc)
> DACTest(forecast=dopas_hqc, actual=stopaZwrotuZgodne, test="PT")
$Test
[1] "Pesaran and Timmermann"
$Stat
[1] 5.854
$p.value
[1] 0.000000002401
$H0
[1] "Independently Distributed"
$Decision
[1] "Reject  H0"
$DirAcc
[1] 0.710,71 to tyle samo co wcześniej otrzymaliśmy (zmienna kryterium_hqc), więc wszystko się zgadza. Możemy dodatkowo sprawdzić jak wygląda DAC dla ostatnich 50 danych:
> Ost <- 50
> DACTest(forecast = tail(as.numeric(dopas_hqc), Ost), actual = tail(as.numeric(stopaZwrotuZgodne), Ost), test = "AG")
$Test
[1] "Anatolyev and Gerko"
$Stat
[1] 4.756
$p.value
[1] 0.0000009883
$H0
[1] "No Predictability"
$Decision
[1] "Reject  H0"
$DirAcc
[1] 0.78Akurat tutaj użyłem drugiego rodzaju (AG), który daje najczęściej takie same wartości jak PT. W próbie uczącej model radzi sobie przez cały czas całkiem dobrze, ponieważ systematycznie hipoteza braku prognozowalności zostaje odrzucona.
Przejdziemy teraz stopniowo do próby testowej. Najpierw obliczamy DAC dla całej próby (ucząca + testowa). Estymujemy więc najpierw uzyskany dotychczas model dla całej próby za pomocą ugarchfit():
> dopasGarchCalaProba_hqc <- tryCatch(
+   {
+     ugarchfit(spec = mojGarch_hqc, data = stopaZwrotu, solver = "hybrid")
+   }, warning = function(w) {
+     message("Ostrzeżenie: ", conditionMessage(w))
+     ugarchfit(spec = mojGarch_hqc, data = stopaZwrotu, solver = "hybrid")
+   }
+ )
Ostrzeżenie: prawdopodobny problem zbieżności: 'optim' zwrócił kod= 1
Komunikat ostrzegawczy:
W poleceniu 'arima(data, order = c(modelinc[2], 0, modelinc[3]), include.mean = modelinc[1], ':
  prawdopodobny problem zbieżności: 'optim' zwrócił kod= 1
> dopasGarchCalaProba_hqc
*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*
Conditional Variance Dynamics 	
-----------------------------------
GARCH Model	: eGARCH(1,1)
Mean Model	: ARFIMA(13,0,10)
Distribution	: snorm 
Optimal Parameters
------------------------------------
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.000876    0.000000   3244.73        0
ar1    -0.527835    0.000196  -2694.35        0
ar2     0.684617    0.000062  11063.85        0
ar3    -0.142261    0.000398   -357.86        0
ar4    -0.820883    0.000061 -13496.80        0
ar5     0.293763    0.000021  14042.21        0
ar6     0.452103    0.000086   5227.05        0
ar7    -0.232687    0.000099  -2340.97        0
ar8    -0.070984    0.000108   -656.74        0
ar9     0.357832    0.000037   9762.27        0
ar10    0.020505    0.000048    427.04        0
ar11   -0.185835    0.000043  -4301.92        0
ar12    0.003256    0.000011    298.65        0
ar13    0.069660    0.000171    408.22        0
ma1     0.571280    0.000127   4507.56        0
ma2    -0.660489    0.000091  -7260.13        0
ma3     0.161063    0.000917    175.66        0
ma4     0.835642    0.000242   3456.81        0
ma5    -0.327134    0.000012 -26400.84        0
ma6    -0.538823    0.000154  -3503.44        0
ma7     0.192344    0.000114   1683.00        0
ma8     0.130609    0.000157    833.86        0
ma9    -0.234300    0.000108  -2175.97        0
ma10   -0.237432    0.000026  -9220.62        0
omega  -0.765569    0.000111  -6870.67        0
alpha1 -0.254834    0.000028  -9192.27        0
beta1   0.893351    0.000117   7658.60        0
gamma1 -0.320261    0.000257  -1247.88        0
skew    0.815441    0.001631    500.05        0
Robust Standard Errors:
        Estimate  Std. Error    t value Pr(>|t|)
mu      0.000876    0.000002    414.684        0
ar1    -0.527835    0.001263   -417.874        0
ar2     0.684617    0.000229   2984.727        0
ar3    -0.142261    0.001288   -110.408        0
ar4    -0.820883    0.000460  -1784.982        0
ar5     0.293763    0.000459    640.153        0
ar6     0.452103    0.000029  15504.063        0
ar7    -0.232687    0.000452   -514.996        0
ar8    -0.070984    0.000447   -158.903        0
ar9     0.357832    0.000662    540.440        0
ar10    0.020505    0.000189    108.288        0
ar11   -0.185835    0.000216   -861.202        0
ar12    0.003256    0.000051     64.180        0
ar13    0.069660    0.001136     61.315        0
ma1     0.571280    0.000962    593.674        0
ma2    -0.660489    0.000891   -741.613        0
ma3     0.161063    0.004921     32.733        0
ma4     0.835642    0.001461    571.974        0
ma5    -0.327134    0.000133  -2452.617        0
ma6    -0.538823    0.000077  -6953.614        0
ma7     0.192344    0.000347    554.317        0
ma8     0.130609    0.000598    218.284        0
ma9    -0.234300    0.000451   -519.405        0
ma10   -0.237432    0.000342   -694.913        0
omega  -0.765569    0.000321  -2386.021        0
alpha1 -0.254834    0.000660   -386.185        0
beta1   0.893351    0.001459    612.425        0
gamma1 -0.320261    0.000021 -15025.018        0
skew    0.815441    0.004400    185.319        0
LogLikelihood : 512.7 
Information Criteria
------------------------------------
                    
Akaike       -4.2057
Bayes        -3.7722
Shibata      -4.2330
Hannan-Quinn -4.0309
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                          statistic p-value
Lag[1]                        1.434  0.2310
Lag[2*(p+q)+(p+q)-1][68]     25.530  1.0000
Lag[4*(p+q)+(p+q)-1][114]    42.082  0.9988
d.o.f=23
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      1.396  0.2374
Lag[2*(p+q)+(p+q)-1][5]     3.374  0.3430
Lag[4*(p+q)+(p+q)-1][9]     6.010  0.2971
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     2.544 0.500 2.000  0.1107
ARCH Lag[5]     3.226 1.440 1.667  0.2586
ARCH Lag[7]     5.209 2.315 1.543  0.2042
Nyblom stability test
------------------------------------
Joint Statistic:  no.parameters>20 (not available)
Individual Statistics:              
mu     0.02266
ar1    0.02024
ar2    0.02111
ar3    0.02888
ar4    0.01956
ar5    0.02272
ar6    0.02255
ar7    0.15612
ar8    0.02344
ar9    0.02388
ar10   0.02475
ar11   0.02319
ar12   0.02538
ar13   0.02162
ma1    0.02144
ma2    0.02181
ma3    0.03071
ma4    0.02657
ma5    0.02350
ma6    0.06516
ma7    0.02290
ma8    0.02397
ma9    0.02463
ma10   0.02744
omega  0.02269
alpha1 0.02531
beta1  0.18295
gamma1 0.06803
skew   0.03629
Asymptotic Critical Values (10% 5% 1%)
Individual Statistic:	 0.35 0.47 0.75
Sign Bias Test
------------------------------------
                   t-value   prob sig
Sign Bias           0.0987 0.9215    
Negative Sign Bias  1.3704 0.1719    
Positive Sign Bias  1.1653 0.2451    
Joint Effect        3.2359 0.3567    
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20     20.96       0.3392
2    30     37.65       0.1303
3    40     46.52       0.1903
4    50     46.96       0.5563
Kryteria informacyjne pogorszyły się.
W końcu dochodzimy do prognozy kroczącej z reestymacją.
# Prognoza z reestymacją
klaster <- makeCluster(detectCores() - 1)
prognozaGarchReest_hqc <- ugarchroll(spec = mojGarch_hqc, data = stopaZwrotu, forecast.length = wyrzuc,
n.start = NULL, refit.every = 1, refit.window = "recursive",
window.size = NULL, solver = "hybrid", calculate.VaR = TRUE,
VaR.alpha = c(0.01, 0.05),
cluster = klaster)
prognozaGarchReest_hqc <- resume(prognozaGarchReest_hqc)
stopCluster(klaster)
> DACTest(forecast=prognozaReest_hqc, 
+         actual=tail(as.numeric(stopaZwrotu), wyrzuc),
+         test="PT")
$Test
[1] "Pesaran and Timmermann"
$Stat
[1] 1.576
$p.value
[1] 0.05755
$H0
[1] "Independently Distributed"
$Decision
[1] "Fail to Reject H0"
$DirAcc
[1] 0.6333
> prognoza_hqc <- fitted(prognozaGarch_hqc)
> prognoza_hqc
    2024-03-15 2024-03-22 2024-03-28 2024-04-05 2024-04-12 2024-04-19 2024-04-26 2024-05-02
T+1   0.004522   -0.02022    0.02879   -0.01329     0.0068   0.001236   0.006209   -0.02933
    2024-05-10 2024-05-17 2024-05-24 2024-05-31 2024-06-07 2024-06-14 2024-06-21 2024-06-28
T+1   -0.02474    0.03675   -0.03833  -0.005701   -0.02924    0.02577   -0.01997    0.02392
    2024-07-05 2024-07-12 2024-07-19 2024-07-26 2024-08-02 2024-08-09 2024-08-16 2024-08-23
T+1   -0.01662   -0.06338    0.02571   -0.02336   -0.01967   -0.07568    0.09247   -0.05133
    2024-08-30 2024-09-06 2024-09-13 2024-09-20 2024-09-27 2024-10-04
T+1   0.009721   -0.02933   -0.04628    0.01524  -0.006271    0.05237> prognozaGarchReest_hqc
*-------------------------------------*
*              GARCH Roll             *
*-------------------------------------*
No.Refits		: 30
Refit Horizon	: 1
No.Forecasts	: 30
GARCH Model		: eGARCH(1,1)
Distribution	: snorm 
Forecast Density:
                Mu  Sigma   Skew Shape Shape(GIG) Realized
2024-03-22  0.0045 0.0115 0.7211     0          0   0.0113
2024-03-28  0.0004 0.0195 0.9559     0          0   0.0242
2024-04-05  0.0055 0.0188 0.9982     0          0   0.0141
2024-04-12 -0.0166 0.0130 0.8980     0          0  -0.0100
2024-04-19  0.0207 0.0110 0.9934     0          0   0.0073
2024-04-26  0.0036 0.0229 0.7858     0          0   0.0061
..........................
                Mu  Sigma   Skew Shape Shape(GIG) Realized
2024-09-06  0.0229 0.0184 2.5994     0          0  -0.0397
2024-09-13 -0.0048 0.0302 0.8268     0          0   0.0079
2024-09-20 -0.0065 0.0379 0.7288     0          0  -0.0245
2024-09-27  0.0121 0.0353 0.8327     0          0   0.0442
2024-10-04  0.0075 0.0290 0.8249     0          0  -0.0391
2024-10-11  0.0048 0.0327 0.8784     0          0   0.0183*---------------------------------*
*          GARCH Model Fit        *
*---------------------------------*
Conditional Variance Dynamics 	
-----------------------------------
GARCH Model	: eGARCH(1,1)
Mean Model	: ARFIMA(12,0,8)
Distribution	: snorm 
Optimal Parameters
------------------------------------
        Estimate  Std. Error   t value Pr(>|t|)
mu      0.001648    0.000000   4997.32        0
ar1    -0.663854    0.000077  -8578.89        0
ar2    -0.262185    0.000024 -10887.50        0
ar3    -0.051030    0.000004 -11599.32        0
ar4     0.309857    0.000032   9822.05        0
ar5     0.342351    0.000041   8407.70        0
ar6     0.359999    0.000043   8357.61        0
ar7     0.580322    0.000067   8602.21        0
ar8     0.010979    0.000001   8979.89        0
ar9     0.137562    0.000004  39254.41        0
ar10    0.026932    0.000003   7747.40        0
ar11    0.104187    0.000017   6313.71        0
ar12   -0.001168    0.000002   -514.54        0
ma1     0.921020    0.000120   7703.09        0
ma2     0.336957    0.000034  10038.87        0
ma3     0.097933    0.000013   7816.74        0
ma4    -0.370421    0.000018 -21002.82        0
ma5    -0.588972    0.000061  -9683.56        0
ma6    -0.596177    0.000061  -9768.79        0
ma7    -0.861720    0.000114  -7588.11        0
ma8    -0.046927    0.000005  -9285.27        0
archm  -0.029292    0.000004  -7966.21        0
omega  -0.808888    0.000100  -8114.56        0
alpha1 -0.311233    0.000853   -364.68        0
beta1   0.891072    0.000109   8198.37        0
gamma1 -0.364227    0.000340  -1070.40        0
skew    0.561526    0.002689    208.79        0
Robust Standard Errors:
        Estimate  Std. Error    t value Pr(>|t|)
mu      0.001648    0.000000  11903.419        0
ar1    -0.663854    0.000158  -4196.632        0
ar2    -0.262185    0.000105  -2494.059        0
ar3    -0.051030    0.000011  -4762.124        0
ar4     0.309857    0.000099   3118.566        0
ar5     0.342351    0.000054   6362.322        0
ar6     0.359999    0.000174   2072.837        0
ar7     0.580322    0.000191   3039.481        0
ar8     0.010979    0.000003   3309.169        0
ar9     0.137562    0.000056   2467.595        0
ar10    0.026932    0.000001  29139.146        0
ar11    0.104187    0.000020   5260.849        0
ar12   -0.001168    0.000003   -392.560        0
ma1     0.921020    0.000310   2975.374        0
ma2     0.336957    0.000039   8634.698        0
ma3     0.097933    0.000004  22486.872        0
ma4    -0.370421    0.000091  -4059.529        0
ma5    -0.588972    0.000149  -3952.367        0
ma6    -0.596177    0.000038 -15636.003        0
ma7    -0.861720    0.000496  -1736.513        0
ma8    -0.046927    0.000008  -6015.220        0
archm  -0.029292    0.000023  -1255.820        0
omega  -0.808888    0.000116  -6952.590        0
alpha1 -0.311233    0.002262   -137.605        0
beta1   0.891072    0.000602   1479.867        0
gamma1 -0.364227    0.000235  -1552.219        0
skew    0.561526    0.006557     85.641        0
LogLikelihood : 457 
Information Criteria
------------------------------------
                    
Akaike       -4.2996
Bayes        -3.8543
Shibata      -4.3305
Hannan-Quinn -4.1194
Weighted Ljung-Box Test on Standardized Residuals
------------------------------------
                         statistic p-value
Lag[1]                     0.02059  0.8859
Lag[2*(p+q)+(p+q)-1][59]  21.65058  1.0000
Lag[4*(p+q)+(p+q)-1][99]  35.98965  0.9985
d.o.f=20
H0 : No serial correlation
Weighted Ljung-Box Test on Standardized Squared Residuals
------------------------------------
                        statistic p-value
Lag[1]                      0.565  0.4523
Lag[2*(p+q)+(p+q)-1][5]     5.352  0.1272
Lag[4*(p+q)+(p+q)-1][9]     6.283  0.2670
d.o.f=2
Weighted ARCH LM Tests
------------------------------------
            Statistic Shape Scale P-Value
ARCH Lag[3]     2.216 0.500 2.000  0.1366
ARCH Lag[5]     2.468 1.440 1.667  0.3768
ARCH Lag[7]     2.517 2.315 1.543  0.6090
Nyblom stability test
------------------------------------
Joint Statistic:  no.parameters>20 (not available)
Individual Statistics:              
mu     0.02688
ar1    0.03818
ar2    0.03886
ar3    0.03903
ar4    0.03875
ar5    0.03790
ar6    0.03681
ar7    0.18916
ar8    0.03516
ar9    0.03328
ar10   0.03355
ar11   0.02755
ar12   0.03261
ma1    0.03305
ma2    0.03679
ma3    0.03647
ma4    0.03476
ma5    0.01836
ma6    0.03795
ma7    0.35048
ma8    0.03726
archm  0.02762
omega  0.02795
alpha1 0.01723
beta1  0.04913
gamma1 0.07816
skew   0.20351
Asymptotic Critical Values (10% 5% 1%)
Individual Statistic:	 0.35 0.47 0.75
Sign Bias Test
------------------------------------
                   t-value   prob sig
Sign Bias           0.4007 0.6890    
Negative Sign Bias  1.0956 0.2746    
Positive Sign Bias  0.4800 0.6317    
Joint Effect        1.4322 0.6980    
Adjusted Pearson Goodness-of-Fit Test:
------------------------------------
  group statistic p-value(g-1)
1    20      12.2       0.8769
2    30      37.0       0.1462
3    40      34.0       0.6970
4    50      34.0       0.9491> DACTest(forecast = prognozaReest_hqc[te_same_znaki], actual = as.numeric(tail(stopaZwrotu, wyrzuc))[te_same_znaki],
+         test="AG")
$Test
[1] "Anatolyev and Gerko"
$Stat
[1] 1.618
$p.value
[1] 0.05288
$H0
[1] "No Predictability"
$Decision
[1] "Fail to Reject H0"
$DirAcc
[1] 0.6522











