Cel: wyznaczenie prognoz kursu wymiany USD-GBP za pomocą wygładzania wykładniczego oraz modelu ARIMA. Porównanie jakości otrzymanych prognoz.
Dane z okresu 2019-01-01–2022-12-31 podzielono na dwa zbiory: uczący (2019-01-01–2022-11-30) i testowy (2022-12-01–2022-12-31). Model jest szacowny na podstawie danych ze zbioru uczącego a jego zdolność predykcyjna (jakość prognoz) jest szacowana przez porównanie z wartościami ze zbioru testowego.
dat_xts <- as.xts(read.zoo('USD-GBP_r.csv', header=T,
index.column = 1,
sep = ",", format = "%Y/%d/%m"))
dat_train <- dat_xts["2019-01-01/2022-11-30"]
dat_test <- dat_xts["2022-12-01/2022-12-31"]
hmax <- length(dat_test)
n_train <-length(dat_train)
n_test <-length(dat_test)
Zbiór uczący ma 1022 obserwacji.
Zbiór testowy ma 22 obserwacji.
m_es <- holt(dat_train, h=hmax, alpha=.33)
#summary(m_es)
accuracy(m_es)
## ME RMSE MAE MPE MAPE
## Training set 0.00003243548 0.006965649 0.004727911 -0.002491196 0.5982294
## MASE ACF1
## Training set 1.360272 0.7040088
##checkresiduals(m_es)
res_es <- m_es$residuals
m_es.fitted <- m_es$fitted
autoplot(m_es.fitted, series="teoret") + autolayer(m_es$x, series="empir")
Box.test(res_es, type='Ljung-Box')
##
## Box-Ljung test
##
## data: res_es
## X-squared = 508.02, df = 1, p-value < 0.00000000000000022
## wyznaczenie prognoz
m_esf <- forecast(m_es, h=hmax)
autoplot(m_esf)
m_esa <- accuracy(m_esf, dat_test)
Dokładność prognoz
m_esa
## ME RMSE MAE MPE MAPE
## Training set 0.00003243548 0.006965649 0.004727911 -0.002491196 0.5982294
## Test set -0.01160272755 0.013619570 0.011602728 -1.419761112 1.4197611
## MASE ACF1
## Training set 1.360272 0.7040088
## Test set 3.338232 NA
Stosowany jest wariant ARIMA(0,1,0) z dryfem.
m_aa <- auto.arima(dat_train)
##summary(m_aa)
accuracy(m_aa)
## ME RMSE MAE MPE MAPE
## Training set 0.00004591731 0.004885595 0.003459473 0.003821782 0.4396782
## MASE ACF1
## Training set 0.9953285 -0.0006688156
##checkresiduals(m_aa)
res_aa <- m_aa$residuals
m_aa.fitted <- m_aa$fitted
autoplot(m_aa.fitted, series="teoret") + autolayer(m_aa$x, series="empir")
Box.test(res_aa, type='Ljung-Box')
##
## Box-Ljung test
##
## data: res_aa
## X-squared = 0.0004585, df = 1, p-value = 0.9829
##Wyznacznie prognoz na 4 miesiace i porównanie z wartościami ze zbioru testowgo
m_aaf <- forecast(m_aa, h=hmax)
autoplot(m_aaf)
m_aaa <- accuracy(m_aaf, dat_test)
m_aaa
## ME RMSE MAE MPE MAPE
## Training set 0.00004591731 0.004885595 0.003459473 0.003821782 0.4396782
## Test set -0.00767361928 0.010708434 0.008217079 -0.941968726 1.0073373
## MASE ACF1
## Training set 0.9953285 -0.0006688156
## Test set 2.3641440 NA
W metodzie naiwnej prognozą jest ostatnia zaobserowana wartość. Zwykle służy jako twz. benchmark (jeżeli bardziej skomplikowana metoda daje jakościowo te same prognozy to tejże skomplikowanej metody nie warto stosować)
m_sn <- naive(dat_train, h=hmax)
f.naive.forecast <- forecast(m_sn, h=hmax)
e.residuals1 <- m_sn$residuals
e.fitted1 <- m_sn$fitted
plot(m_sn)
autoplot(m_sn)
##e.acc.naive <- accuracy(f.naive.forecast, ets.t)
e.acc.naive <- accuracy(f.naive.forecast, dat_test)
A.table <- rbind( m_esa, m_aaa, e.acc.naive)
row.names(A.table) <- c('es', 'es/t', 'arima', 'arima/t', 'naive', 'naive/t')
A.table <- as.data.frame(A.table)
A.table <- A.table[order(A.table$RMSE),]
A.table
## ME RMSE MAE MPE MAPE MASE
## arima 0.00004591731 0.004885595 0.003459473 0.003821782 0.4396782 0.9953285
## naive 0.00004397649 0.004952445 0.003475710 0.003578828 0.4409876 1.0000000
## es 0.00003243548 0.006965649 0.004727911 -0.002491196 0.5982294 1.3602719
## naive/t -0.00750000000 0.010490905 0.008100000 -0.920708169 0.9928825 2.3304590
## arima/t -0.00767361928 0.010708434 0.008217079 -0.941968726 1.0073373 2.3641440
## es/t -0.01160272755 0.013619570 0.011602728 -1.419761112 1.4197611 3.3382323
## ACF1
## arima -0.0006688156
## naive 0.0843591673
## es 0.7040087987
## naive/t NA
## arima/t NA
## es/t NA
Jakość prognoz jest bardzo dobra a wielkość błędu podobna przy zastosowaniu wszystkich trzech metod. Czyli można naiwną :-)
Porównanie na wykresie (dane empiryczne + prognozy dla trzech metod):
autoplot(as.ts(dat_xts), series="empir") +
autolayer(m_esf$mean, series="es") +
autolayer(m_aaf$mean, series="aa") +
autolayer(f.naive.forecast$mean, series="naive")
Porównanie na wykresie (dane empiryczne tylko dla zbioru testowego + prognozy dla trzech metod):
autoplot(as.ts(dat_test, start= n_train +1), series="empir") +
autolayer(m_esf$mean, series="es") +
autolayer(m_aaf$mean, series="aa") +
autolayer(f.naive.forecast$mean, series="naive")
Widać co zaszło: wartości szeregu rosnąco osycolowały od wartości 0,815 do wartości 0,825. ARIMA oraz MN przewidywały w zasadzie stałą wartość na poziomie 0.83 a wygładzanie wykładnicze lekko rosnącą na poziomie około 0.835. Różnice między metodami są niewielkie. Wszystkie trzy zawyżają wartości; WW zawyża najbardziej.