sobota, 6 sierpnia 2016

Sezonowość i Prognozowanie.

W tym poście przypomnę wam mój wcześniejszy post. Pokazane zostaną inne metody badania sezonowości danych.
Na początku porównajmy dekompozycję tygodniową szeregu czasowego z aktualnymi danymi:
Skrypt:
library(quantmod)
kgh = getStooqData('kgh')
prices = kgh[,5]
data = as.Date(kgh[,1])
ts =xts(prices, data)
w.ts= ts(ts, start = c(1997,7), end = c(2016,8), frequency = 52)
modeldek = decompose(w.ts)
plot(modeldek$trend +modeldek$seasonal)
lines(w.ts, col ="red")
Model z porównaniem kgh
Czarna kreska to prognoza modelu.
Czerwona kreska to dane rzeczywsite kghm-u.
Następnie wykonajmy takie samo porównanie dla danych miesięcznych.
kgh.m= ts(kgh.monthly, start = c(1997,7), end = c(2016,8), frequency = 12)
mmodeldek = decompose(kgh.m, type = "multiplicative")
plot(mmodeldek$trend +  (1-mmodeldek$seasonal)*mmodeldek$trend)
lines(kgh.m, col = "red")

Tak wygląda prognoza miesięczna:
Teraz spróbujmy sprawdzić jak wyglądają miesięczne stopy zwrotu.
library(forecast)
m.ts= ts(monthlyReturn(ts), start = c(1997,7), end = c(2016,8), frequency = 12)
seasonplot(m.ts, col = c("red", "blue"), year.labels = TRUE, cex = 0.75)
Na wykresie kghmu nie widać sezonowości w miesięcznych stopach zwrotu.  Nie widać żadnego schematu zachowywania się cen akcji kgm-u.

Do prognozy szeregów czasowych wykorzystywane są metody autoregresyjne. Modele autoregresujne starają się przewidzieć cenę akcji poprzez używanie wcześniejszych obesrwacji. Pomocne może się okazać wykrycie autokorelacji. Autokorelacja oznacza że wcześniejsze wartości obserwacji są skorelowane z obserwacjami w przyszłych okresach.

Model ten wyraża się za pomocą ARIMA(p,d,q)
p - kolejność modelu autoregresyjnego
d - ilość różnicowań by doprowadzić do stacjonarności
q -  stopień średniej kroczącej

Przed skonstruowaniem modelu sprawdzimy autokorelację i autokorleację czątkową. 

acf(weeklyReturn(kgh.weekly))
acf(m.ts,lag = 30)
pacf(m.ts,lag = 30)




Jest to wykres acf dla danych miesięcznych kghmu. Pokazuje, które opóżnione dane mają statystycznie istotną korelację. Pierwszy słópek pomijamy, ponieważ jest to korelacja tych samych przypadków. I tak w tym przypdku na istotne poziomie 0.95 jest cofnięcie o 3 przypadki do tyłu, a następnie cofnięcie o 30 przypadków. Ponieważ było 30 przypadków, a poziom istotności to 0.95. Oznacza to że powinno się spodziewać od 1 do 2 statystycznie istotnych danych. I w rzeczywistości tak się stało.

Teraz użyta zostanie funkcja auto.arima. Jest to funkcja, która automatycznie dobiera najlepszy model pod względem 3 rodzajów kryteriów informacyjnych. Jeżeli ustalimy nasz argument trace = TRUE, wtedy otrzymamy listę alternatywnych modeli.
auto.arima(kgh.m, trace = TRUE)

Jednym z dwóch pierwszych wierszy jakie otrzymaliśmy jest:
 ARIMA(2,1,2)(1,0,1)[12] with drift         : 1515.436
 ARIMA(0,1,0) with drift         : 1500.055

Pierwszy model ma więcej parametrów, ponieważ jest ot arima uwzględniająca parametry sezonowości. 12 na końcu oznacza skok wartości przy 12 opóźnieniu w acf. Drugi model z driftem można uzyskać używając funkcji Arima (UWAGA! bardzo ważne jest ot że pierwsza litera jest wielką, arima i Arima to dwie różne funkcje)
Następnie ukazują się oszacowania parametrów:
 Best model: ARIMA(1,1,1)(0,0,1)[12]                   

Series: kgh.m
ARIMA(1,1,1)(0,0,1)[12]                   

Coefficients:
          ar1     ma1     sma1
      -0.4913  0.6433  -0.1197
s.e.   0.1676  0.1417   0.0661

sigma^2 estimated as 39.56:  log likelihood=-744.66
AIC=1497.31   AICc=1497.49   BIC=1511.05

modelarima = auto.arima(kgh.m)
Następnie, żeby uzyskać prognozę, należy wpisać::
forecast(modelarima, 5)
I żeby ją narysować, wystarczy:
plot(forecast(modelarima, 5)

3 komentarze:

  1. Bardzo ciekawe jest to, o czym piszesz. Lubię czytać Twoje analizy, bo sporo się od nich uczę. Może kiedyś powrócisz na bloga i podzielisz się nowymi treściami?

    OdpowiedzUsuń
    Odpowiedzi
    1. Zamierzam powrócić. Aktualnie zajmuję się studiami i pracą zawodową, przez co mam duże zaległości. Ale mam jeszcze bardzooo ciekawe tematy, przede wszystkim chciałbym się zająć analizą sezonowości z wykorzystaniem transformaty fouriera. Bardzo ciekawy temat.

      Usuń
  2. Wygląda świetnie, przeczytam jeszcze z 15 razy i może w końcu zrozumiem :)

    OdpowiedzUsuń