Dopasowałem model ARIMA (1,1,1) -GARCH (1,1) do szeregów czasowych cen dzienników kursów wymiany AUD / USD próbkowanych w jednominutowych odstępach przez kilka lat, co dało mi ponad dwa milion punktów danych, na podstawie których można oszacować model. Zestaw danych jest dostępny tutaj . Dla jasności był to model ARMA-GARCH dopasowany do zwrotów kłód ze względu na integrację cen kłód pierwszego rzędu. Oryginalny szereg czasowy AUD / USD wygląda następująco:
Następnie spróbowałem zasymulować szereg czasowy na podstawie dopasowanego modelu, dając mi następujące informacje:
Zarówno oczekuję, jak i pragnę, aby symulowane szeregi czasowe różniły się od serii oryginalnej, ale nie spodziewałem się, że będzie tak znacząca różnica. Zasadniczo chcę, aby symulowana seria zachowywała się lub ogólnie wyglądała jak oryginał.
Oto kod R, którego użyłem do oszacowania modelu i symulacji serii:
library(rugarch)
rows <- nrow(data)
data <- (log(data[2:rows,])-log(data[1:(rows-1),]))
spec <- ugarchspec(variance.model = list(model = "sGARCH", garchOrder = c(1, 1)), mean.model = list(armaOrder = c(1, 1), include.mean = TRUE), distribution.model = "std")
fit <- ugarchfit(spec = spec, data = data, solver = "hybrid")
sim <- ugarchsim(fit, n.sim = rows)
prices <- exp(diffinv(fitted(sim)))
plot(seq(1, nrow(prices), 1), prices, type="l")
I to jest wynik oszacowania:
*---------------------------------*
* GARCH Model Fit *
*---------------------------------*
Conditional Variance Dynamics
-----------------------------------
GARCH Model : sGARCH(1,1)
Mean Model : ARFIMA(1,0,1)
Distribution : std
Optimal Parameters
------------------------------------
Estimate Std. Error t value Pr(>|t|)
mu 0.000000 0.000000 -1.755016 0.079257
ar1 -0.009243 0.035624 -0.259456 0.795283
ma1 -0.010114 0.036277 -0.278786 0.780409
omega 0.000000 0.000000 0.011062 0.991174
alpha1 0.050000 0.000045 1099.877416 0.000000
beta1 0.900000 0.000207 4341.655345 0.000000
shape 4.000000 0.003722 1074.724738 0.000000
Robust Standard Errors:
Estimate Std. Error t value Pr(>|t|)
mu 0.000000 0.000002 -0.048475 0.961338
ar1 -0.009243 0.493738 -0.018720 0.985064
ma1 -0.010114 0.498011 -0.020308 0.983798
omega 0.000000 0.000010 0.000004 0.999997
alpha1 0.050000 0.159015 0.314436 0.753190
beta1 0.900000 0.456020 1.973598 0.048427
shape 4.000000 2.460678 1.625568 0.104042
LogLikelihood : 16340000
Byłbym bardzo wdzięczny za wszelkie wskazówki dotyczące ulepszenia mojego modelowania i symulacji, a także za wgląd w błędy, które mogłem popełnić. Wygląda na to, że resztkowy model nie jest używany jako składnik szumu w mojej próbie symulacji, chociaż nie jestem pewien, jak to uwzględnić.
ugarchspec()
iugarchsim()
). Upewnij się, że Twój kod jest odtwarzalny za każdym razem, gdy zadajesz pytanie tutaj, a to „pomoże ludziom pomóc”.Odpowiedzi:
Pracuję z prognozowaniem danych na rynku Forex i zaufaj mi za każdym razem, gdy korzystasz z metod prognozowania statystycznego, czy to ARMA, ARIMA, GARCH, ARCH itp. Zawsze mają tendencję do pogorszenia się, gdy próbujesz przewidzieć z dużym wyprzedzeniem. Mogą, ale nie muszą, pracować przez jeden lub dwa kolejne okresy, ale na pewno nie więcej. Ponieważ dane, z którymi mamy do czynienia, nie mają autokorelacji, trendu ani sezonowości.
Moje pytanie do Ciebie, czy sprawdziłeś ACF i PACF lub testy pod kątem trendów, sezonowości przed użyciem ARMA i GARCH? Bez wyżej wymienionych właściwości w danych prognozowanie statystyczne nie działa, ponieważ naruszasz podstawowe założenia tych modeli.
źródło
Moją sugestią byłoby upewnienie się, że wybrany model jest odpowiedni dla danych.
źródło
distribution.model="std"