ΕΑ - εργασία 011 - Time Series Forecasting

Dataset: JohnsonJohnson (R base) — τριμηνιαία κέρδη ανά μετοχή (EPS) της Johnson & Johnson — 84 παρατηρήσεις, 1960–1980 (συχνότητα = 4)

💼 Brief

Είστε financial analysts μιας μεγάλης τράπεζας.

Ο portfolio manager σας ζητάει μια τεκμηριωμένη πρόβλεψη των τριμηνιαίων κερδών της Johnson & Johnson για τα επόμενα 3 χρόνια (12 τρίμηνα), προκειμένου να αποφασιστεί η θέση του fund στη μετοχή.

Η ανάλυσή σας πρέπει να περιγράφει τη δυναμική της εταιρίας, να αξιολογεί τα μοντέλα σε πραγματικά δεδομένα και να δίνει μια πρόβλεψη με διαστήματα εμπιστοσύνης — όχι απλώς ένα point estimate.

# ============================================================
#  ΕΡΓΑΣΙΑ 011 — Time Series Forecasting
#  Dataset: Johnson & Johnson Quarterly Earnings (1960–1980)
#  Στόχος: Πρόβλεψη τριμηνιαίων κερδών για τα επόμενα 3 χρόνια
# ============================================================

# --- Εγκατάσταση & Φόρτωση πακέτων ---
#install.packages(c("forecast", "tseries", "ggplot2", "gridExtra"))

library(forecast)
## Warning: package 'forecast' was built under R version 4.5.3
library(tseries)
## Warning: package 'tseries' was built under R version 4.5.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(ggplot2)
library(gridExtra)
## Warning: package 'gridExtra' was built under R version 4.5.3
set.seed(42)

# --- Φόρτωση δεδομένων ---
data("JohnsonJohnson")
jj <- JohnsonJohnson

class(jj)            # έλεγχος: είναι ήδη ts object;
## [1] "ts"
start(jj); end(jj); frequency(jj)
## [1] 1960    1
## [1] 1980    4
## [1] 4
length(jj)           # 84 παρατηρήσεις (21 χρόνια × 4 τρίμηνα)
## [1] 84
head(jj, 12)
##      Qtr1 Qtr2 Qtr3 Qtr4
## 1960 0.71 0.63 0.85 0.44
## 1961 0.61 0.69 0.92 0.55
## 1962 0.72 0.77 0.92 0.60

📈 Μέρος Α — Exploration & Decomposition

# ============================================================ # ΜΕΡΟΣ Α — Exploration & Decomposition # ============================================================

TODO 1:

# Κύριο time series plot
autoplot(jj) +
  ggtitle("Johnson & Johnson Quarterly Earnings (1960–1980)") +
  xlab("Έτος") +
  ylab("Κέρδη") +
  theme_minimal()

Το διάγραμμα δείχνει μια ισχυρή και σταθερή ανοδική τάση στα κέρδη της εταιρείας κατά την περίοδο 1960–1980, γεγονός που υποδηλώνει συνεχή επιχειρηματική ανάπτυξη. Η χρονοσειρά αποκαλύπτει μια εταιρεία με ισχυρή αναπτυξιακή πορεία και προβλέψιμα εποχικά πρότυπα. Η επαναληψιμότητα της εποχικότητας διευκολύνει τον προγραμματισμό πωλήσεων, παραγωγής και οικονομικών προβλέψεων, ενώ η συνεχής αύξηση των κερδών αποτελεί ένδειξη βιώσιμης επιχειρηματικής ανάπτυξης.

TODO 2:

# Seasonal plot: κάθε έτος ώς χωριστή γραμμή
ggseasonplot(jj, year.labels = TRUE) +
  ggtitle("Seasonal plot — jj")

# Subseries plot: ένα mini-plot ανά μήνα
ggsubseriesplot(jj) +
  ggtitle("Subseries plot — μεταβολή ανά μήνα")

Το seasonal plot μας φανερώνει ότι το 3ο τρίμηνο ή μάλλον η περίοδος ανάμεσα στο Q2 και στο Q3 είναι συστηματικά η καλύτερη, καθώς παρατηρείται συστηματική αύξηση όλων των καμπυλών, δηλαδή κάθε έτος, στη διάρκεια αυτού του διαστήματος.

Το ίδιο μπορούμε να συμπεράνουμε κοιτάζοντας και το subseries plot, το οποίο κατά αυτή τη διάρκεια αυξάνεται περισσότερο.

TODO 3:

Η χρονοσειρά είναι multiplicative για τους εξής λόγους:

Η σειρά έχει μια ισχυρή ανοδική τάση με την πάροδο του χρόνου. Οι εποχιακές διακυμάνσεις μεγαλώνουν καθώς το επίπεδο αυξάνεται. Γύρω στο 1960, οι ανοδικές και οι καθοδικές διακυμάνσεις είναι πολύ μικρές. Μέχρι το 1978–1980, οι εποχικές διακυμάνσεις έχουν πλάτος αρκετών μονάδων. Σε ένα additive μοντέλο, το εποχικό πλάτος παραμένει περίπου σταθερό με την πάροδο του χρόνου. Σε ένα multiplicative μοντέλο, το εποχικό πλάτος αυξάνεται αναλογικά με το επίπεδο της σειράς, όπως και παρατηρούμε εδώ πέρα.

TODO 4:

# Επειδή είδαμε ότι το πλάτος μεγαλώνει → multiplicative
dec_mult <- decompose(jj, type = "multiplicative")
autoplot(dec_mult) +
  ggtitle("Multiplicative Decomposition — jj")

dec_mult$figure
## [1] 0.9930006 1.0329845 1.1140535 0.8599614

Η συνιστώσα τάσης (trend) παρουσιάζει έντονη ανοδική πορεία καθ’ όλη τη διάρκεια της περιόδου, υποδηλώνοντας συνεχή αύξηση των τριμηνιαίων κερδών της εταιρείας. Θα χαρακτηρίζαμε τo trend component, καμπυλωτό.

TODO 5:

# STL (Seasonal-Trend-Loess) - αλλά δουλεύει μόνο additive,
# οπότε εφαρμόζουμε log() πρώτα για να γίνει additive
prof_log <- log(jj)
stl_fit <- stl(prof_log, s.window = "periodic")
autoplot(stl_fit) +
  ggtitle("STL Decomposition (σε log scale)")

Μετά την εφαρμογή του λογαρίθμου, η χρονοσειρά εμφανίζει πιο σταθερή διακύμανση και η ανοδική τάση γίνεται πιο γραμμική. Επιπλέον, οι εποχικές διακυμάνσεις αποκτούν πιο ομοιόμορφο μέγεθος σε όλη τη διάρκεια της περιόδου, γεγονός που υποδηλώνει ότι η αρχική multiplicative εποχικότητα μετατρέπεται σε περίπου additive. Η λογαριθμική μετατροπή διευκολύνει την ανάλυση και τη μοντελοποίηση της χρονοσειράς, καθώς μειώνει την ετεροσκεδαστικότητα και σταθεροποιεί τη μεταβλητότητα των δεδομένων.

🔮 Μέρος Β — Modeling & Forecasting

# ============================================================ # ΜΕΡΟΣ Β — Modeling & Forecasting # ============================================================

TODO 6:

train <- window(jj, end = c(1978, 4))
test  <- window(jj, start = c(1979, 1))
length(train)  # 76
## [1] 76
length(test)   # 8
## [1] 8

TODO 7:

adf.test(jj)
## Warning in adf.test(jj): p-value greater than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  jj
## Dickey-Fuller = 1.9321, Lag order = 4, p-value = 0.99
## alternative hypothesis: stationary
#log & diff
jj_diff <- diff(diff(log(jj)), lag = 4)

autoplot(jj_diff) +
  ggtitle("Μετά από log + 1η διαφόριση + εποχιακή διαφόριση") 

#και βγαινει στασιμη αλλα αυτη τη φορα αληθεια
# Ξανά ελέγχουμε
adf.test(jj_diff)
## Warning in adf.test(jj_diff): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  jj_diff
## Dickey-Fuller = -6.8701, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

TODO 8:

p1 <- ggAcf(jj_diff)  + ggtitle("ACF")
p2 <- ggPacf(jj_diff) + ggtitle("PACF")
grid.arrange(p1, p2, ncol = 2)

Για το ACF σημαντικά lags είναι κυρίως τα Lag1 & Lag7, ενώ και κάποια άλλα πλησιάζουν αρκετά τα όρια, όπως τα Lag4, Lag11, Lag12.

Για το PACF σημαντικά είναι τα Lag1 & Lag4.

TODO 9:

# Πρόβλεψη: κάθε μήνας = ίδιος μήνας πέρυσι
fit_snaive <- snaive(train, h = 8)
autoplot(fit_snaive) +
  ggtitle("Seasonal Naïve Forecast") +
  autolayer(test, series = "Πραγματικά")

# Τρεις παράμετροι: α (επίπεδο), β (τάση), γ (εποχικότητα)
fit_hw <- hw(train, h = 8, seasonal = "multiplicative")
summary(fit_hw)
## 
## Forecast method: Holt-Winters' multiplicative method
## 
## Model Information:
## Holt-Winters' multiplicative method 
## 
## Call:
## hw(y = train, h = 8, seasonal = "multiplicative")
## 
##   Smoothing parameters:
##     alpha = 0.197 
##     beta  = 0.1082 
##     gamma = 1e-04 
## 
##   Initial states:
##     l = 0.5902 
##     b = 0.0072 
##     s = 0.8267 1.0468 1.0827 1.0439
## 
##   sigma:  0.1337
## 
##      AIC     AICc      BIC 
## 174.6172 177.3444 195.5938 
## 
## Error measures:
##                     ME      RMSE       MAE       MPE     MAPE      MASE
## Training set 0.0420402 0.3595992 0.2602222 0.5285725 9.289055 0.4395027
##                   ACF1
## Training set 0.1282904
## 
## Forecasts:
##         Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 1979 Q1       12.83495 10.636472 15.03343  9.472669 16.19723
## 1979 Q2       13.76326 11.303396 16.22312 10.001224 17.52529
## 1979 Q3       13.74580 11.122117 16.36949  9.733221 17.75839
## 1979 Q4       11.19950  8.872544 13.52645  7.640730 14.75826
## 1980 Q1       14.57307 11.235132 17.91102  9.468132 19.67802
## 1980 Q2       15.56606 11.610776 19.52135  9.516974 21.61515
## 1980 Q3       15.48923 11.116368 19.86209  8.801514 22.17695
## 1980 Q4       12.57631  8.637829 16.51479  6.552923 18.59970
#test (better than train)
autoplot(fit_hw) +
  ggtitle("Holt-Winters Forecast") +
  autolayer(test, series = "Πραγματικά")

# Η auto.arima δοκιμάζει αυτόματα συνδυασμούς (p,d,q)(P,D,Q)
# και επιλέγει αυτόν με το χαμηλότερο AIC
fit_arima <- auto.arima(train, lambda = 0)  # lambda=0 → log transformation
summary(fit_arima)
## Series: train 
## ARIMA(2,0,0)(1,1,0)[4] with drift 
## Box Cox transformation: lambda= 0 
## 
## Coefficients:
##          ar1     ar2     sar1   drift
##       0.3131  0.2432  -0.2970  0.0386
## s.e.  0.1244  0.1300   0.1285  0.0046
## 
## sigma^2 = 0.008377:  log likelihood = 71.78
## AIC=-133.56   AICc=-132.65   BIC=-122.18
## 
## Training set error measures:
##                       ME      RMSE       MAE      MPE     MAPE      MASE
## Training set 0.001523642 0.3596867 0.2419193 -0.16328 6.770657 0.4085899
##                    ACF1
## Training set -0.1186641
#ARIMA chooses the best but not always. here, test is slightly better
fc_arima <- forecast(fit_arima, h = 8)
autoplot(fc_arima) +
  ggtitle("ARIMA Forecast") +
  autolayer(test, series = "Πραγματικά")

summary(fit_snaive)
## 
## Forecast method: Seasonal naive method
## 
## Model Information:
## Call: snaive(y = train, h = 8) 
## 
## Residual sd: 0.8214 
## 
## Error measures:
##                     ME      RMSE       MAE      MPE     MAPE MASE      ACF1
## Training set 0.5884722 0.8214427 0.5920833 14.27463 14.77554    1 0.6642405
## 
## Forecasts:
##         Point Forecast     Lo 80     Hi 80     Lo 95    Hi 95
## 1979 Q1          11.88 10.827279 12.932721 10.270002 13.49000
## 1979 Q2          12.06 11.007279 13.112721 10.450002 13.67000
## 1979 Q3          12.15 11.097279 13.202721 10.540002 13.76000
## 1979 Q4           8.91  7.857279  9.962721  7.300002 10.52000
## 1980 Q1          11.88 10.391227 13.368773  9.603119 14.15688
## 1980 Q2          12.06 10.571227 13.548773  9.783119 14.33688
## 1980 Q3          12.15 10.661227 13.638773  9.873119 14.42688
## 1980 Q4           8.91  7.421227 10.398773  6.633119 11.18688
summary(fit_hw)
## 
## Forecast method: Holt-Winters' multiplicative method
## 
## Model Information:
## Holt-Winters' multiplicative method 
## 
## Call:
## hw(y = train, h = 8, seasonal = "multiplicative")
## 
##   Smoothing parameters:
##     alpha = 0.197 
##     beta  = 0.1082 
##     gamma = 1e-04 
## 
##   Initial states:
##     l = 0.5902 
##     b = 0.0072 
##     s = 0.8267 1.0468 1.0827 1.0439
## 
##   sigma:  0.1337
## 
##      AIC     AICc      BIC 
## 174.6172 177.3444 195.5938 
## 
## Error measures:
##                     ME      RMSE       MAE       MPE     MAPE      MASE
## Training set 0.0420402 0.3595992 0.2602222 0.5285725 9.289055 0.4395027
##                   ACF1
## Training set 0.1282904
## 
## Forecasts:
##         Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 1979 Q1       12.83495 10.636472 15.03343  9.472669 16.19723
## 1979 Q2       13.76326 11.303396 16.22312 10.001224 17.52529
## 1979 Q3       13.74580 11.122117 16.36949  9.733221 17.75839
## 1979 Q4       11.19950  8.872544 13.52645  7.640730 14.75826
## 1980 Q1       14.57307 11.235132 17.91102  9.468132 19.67802
## 1980 Q2       15.56606 11.610776 19.52135  9.516974 21.61515
## 1980 Q3       15.48923 11.116368 19.86209  8.801514 22.17695
## 1980 Q4       12.57631  8.637829 16.51479  6.552923 18.59970
summary(fc_arima)
## 
## Forecast method: ARIMA(2,0,0)(1,1,0)[4] with drift
## 
## Model Information:
## Series: train 
## ARIMA(2,0,0)(1,1,0)[4] with drift 
## Box Cox transformation: lambda= 0 
## 
## Coefficients:
##          ar1     ar2     sar1   drift
##       0.3131  0.2432  -0.2970  0.0386
## s.e.  0.1244  0.1300   0.1285  0.0046
## 
## sigma^2 = 0.008377:  log likelihood = 71.78
## AIC=-133.56   AICc=-132.65   BIC=-122.18
## 
## Error measures:
##                       ME      RMSE       MAE      MPE     MAPE      MASE
## Training set 0.001523642 0.3596867 0.2419193 -0.16328 6.770657 0.4085899
##                    ACF1
## Training set -0.1186641
## 
## Forecasts:
##         Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 1979 Q1       13.41999 11.934690 15.09014 11.216169 16.05684
## 1979 Q2       13.62550 12.049624 15.40748 11.290582 16.44329
## 1979 Q3       13.64196 11.987789 15.52440 11.194934 16.62387
## 1979 Q4       10.69875  9.384836 12.19661  8.755931 13.07264
## 1980 Q1       15.70957 13.331032 18.51249 12.221360 20.19339
## 1980 Q2       15.97826 13.505712 18.90346 12.355698 20.66291
## 1980 Q3       16.05462 13.520363 19.06390 12.345005 20.87896
## 1980 Q4       12.35441 10.392318 14.68695  9.483133 16.09504

TODO 10:

checkresiduals(fc_arima)

## 
##  Ljung-Box test
## 
## data:  Residuals from ARIMA(2,0,0)(1,1,0)[4] with drift
## Q* = 3.7985, df = 5, p-value = 0.5788
## 
## Model df: 3.   Total lags used: 8

Ο έλεγχος Ljung–Box έδωσε p-value = 0.5788, το οποίο είναι σημαντικά μεγαλύτερο από το επίπεδο σημαντικότητας α = 0.05. Επομένως, δεν απορρίπτεται η μηδενική υπόθεση ότι τα residuals δεν παρουσιάζουν αυτοσυσχέτιση. Συνεπώς, τα κατάλοιπα μπορούν να θεωρηθούν ως λευκός θόρυβος (white noise), γεγονός που υποδηλώνει ότι το μοντέλο ARIMA(2,0,0)(1,1,0)[4] με drift έχει καταγράψει ικανοποιητικά τη δομή της χρονοσειράς και δεν αφήνει σημαντική πληροφορία στα residuals.

TODO 11:

# Όλες οι προβλέψεις σε ένα plot
autoplot(train, series = "Training") +
  autolayer(test,           series = "Πραγματικά") +
  autolayer(fit_snaive$mean, series = "Seasonal Naïve") +
  autolayer(fit_hw$mean,     series = "Holt-Winters") +
  autolayer(fc_arima$mean,   series = "ARIMA") +
  ggtitle("Σύγκριση μοντέλων στο test set") +
  ylab("Επιβάτες") +
  theme_minimal() +
  guides(colour = guide_legend(title = "Μοντέλο"))

TODO 12:

accuracy(fit_snaive, test)
##                     ME      RMSE       MAE      MPE     MAPE     MASE
## Training set 0.5884722 0.8214427 0.5920833 14.27463 14.77554 1.000000
## Test set     2.5425000 2.7765401 2.5425000 17.89911 17.89911 4.294159
##                    ACF1 Theil's U
## Training set  0.6642405        NA
## Test set     -0.2050122 0.7697759
accuracy(fit_hw,     test)#kalytero sto test
##                      ME      RMSE       MAE        MPE     MAPE      MASE
## Training set 0.04204020 0.3595992 0.2602222  0.5285725 9.289055 0.4395027
## Test set     0.07397684 1.0865532 1.0427583 -0.4202121 7.763851 1.7611681
##                    ACF1 Theil's U
## Training set  0.1282904        NA
## Test set     -0.8122651  0.290191
accuracy(fc_arima,   test)#kalytero sto train
##                        ME      RMSE       MAE       MPE     MAPE      MASE
## Training set  0.001523642 0.3596867 0.2419193 -0.163280 6.770657 0.4085899
## Test set     -0.142883118 0.8136629 0.7225012 -1.524645 5.419212 1.2202695
##                    ACF1 Theil's U
## Training set -0.1186641        NA
## Test set     -0.6150056 0.1989989

Το μοντέλο ARIMA παρουσίασε τις μικρότερες τιμές σε όλα τα κριτήρια (RMSE = 0.814, MAE = 0.723, MAPE = 5.42%), γεγονός που υποδηλώνει την υψηλότερη ακρίβεια πρόβλεψης. Το Holt-Winters κατέλαβε τη δεύτερη θέση, ενώ το Seasonal Naive είχε τη χαμηλότερη απόδοση. Επομένως, το ARIMA αποτελεί το καταλληλότερο μοντέλο για την πρόβλεψη της συγκεκριμένης χρονοσειράς.

TODO 13:

final_model <- auto.arima(jj, lambda = 0)
final_forecast <- forecast(final_model, h = 12)  # 3 χρόνια μπροστά

autoplot(final_forecast) +
  ggtitle("Πρόβλεψη 1978-1979") +
  ylab("Κέρδη") +
  theme_minimal()

Bonus

TODO 14:

start_value <- as.numeric(train[1])
end_value   <- as.numeric(tail(train, 1))

years <- length(train)/4

hist_growth <- (end_value/start_value)^(1/years) - 1
hist_growth
## [1] 0.1424102
first_fc <- as.numeric(fc_arima$mean[1])
last_fc  <- as.numeric(tail(fc_arima$mean, 1))

forecast_growth <- (last_fc/first_fc)^(1/2) - 1
forecast_growth
## [1] -0.04052239

Ο ιστορικός μέσος ετήσιος ρυθμός ανάπτυξης της εταιρείας ήταν περίπου 14.2%, ενώ το μοντέλο προβλέπει αρνητικό ρυθμό ανάπτυξης της τάξης του -4.1% για την περίοδο πρόβλεψης. Η πρόβλεψη αυτή διαφέρει σημαντικά από την ιστορική συμπεριφορά της χρονοσειράς και ενδέχεται να θεωρηθεί μη ρεαλιστική, δεδομένης της μακροχρόνιας ανοδικής πορείας των κερδών. Πιθανόν το μοντέλο να επηρεάζεται από τις τελευταίες παρατηρήσεις του δείγματος εκπαίδευσης ή από τη βραχυχρόνια μεταβλητότητα της σειράς.

TODO 15 (BONUS):

fit_ets <- ets(train)

summary(fit_ets)
## ETS(M,A,A) 
## 
## Call:
## ets(y = train)
## 
##   Smoothing parameters:
##     alpha = 0.16 
##     beta  = 0.1018 
##     gamma = 0.3989 
## 
##   Initial states:
##     l = 0.6253 
##     b = 4e-04 
##     s = -0.1882 0.1782 -0.0081 0.0181
## 
##   sigma:  0.092
## 
##      AIC     AICc      BIC 
## 117.2365 119.9638 138.2131 
## 
## Training set error measures:
##                     ME     RMSE       MAE      MPE     MAPE      MASE
## Training set 0.0492013 0.418255 0.2614132 1.321354 7.079831 0.4415143
##                    ACF1
## Training set 0.02747311
fc_ets <- forecast(fit_ets, h = 8)

accuracy(fc_ets, test)
##                     ME     RMSE       MAE       MPE     MAPE      MASE
## Training set 0.0492013 0.418255 0.2614132 1.3213542 7.079831 0.4415143
## Test set     0.1983617 1.167089 1.0991595 0.2785665 8.185848 1.8564271
##                     ACF1 Theil's U
## Training set  0.02747311        NA
## Test set     -0.81522498  0.316464
accuracy(fit_hw, test)
##                      ME      RMSE       MAE        MPE     MAPE      MASE
## Training set 0.04204020 0.3595992 0.2602222  0.5285725 9.289055 0.4395027
## Test set     0.07397684 1.0865532 1.0427583 -0.4202121 7.763851 1.7611681
##                    ACF1 Theil's U
## Training set  0.1282904        NA
## Test set     -0.8122651  0.290191
accuracy(fc_ets, test)
##                     ME     RMSE       MAE       MPE     MAPE      MASE
## Training set 0.0492013 0.418255 0.2614132 1.3213542 7.079831 0.4415143
## Test set     0.1983617 1.167089 1.0991595 0.2785665 8.185848 1.8564271
##                     ACF1 Theil's U
## Training set  0.02747311        NA
## Test set     -0.81522498  0.316464

Το μοντέλο που διάλεξε είναι το ETS(M, A, A), ενώ τα 3 γράμματα σημαίνουν:

  • M (Multiplicative error) → το σφάλμα είναι πολλαπλασιαστικό

  • A (Additive trend) → η τάση είναι προσθετική (γραμμική)

  • A (Additive seasonality) → η εποχικότητα είναι προσθετική

Το HW μοντέλο μας νίκησε, σύμφωνα με τα κριτήρια RMSE, MAE, MAPE.

**ETS:**

```         
 1.167089 1.0991595 8.185848
```

**HW:**

```         
1.0427583 -0.4202121 1.7611681 
```

Συμπεράσματα

✅ Μέρος Α - Να απαντήσετε στις παρακάτω ερωτήσεις

  1. 📈 Τι παρατηρείτε για την τάση της J&J; Είναι γραμμική ή εκθετική;

    Η τάση είναι εκθετική, υποδηλώνοντας συνεχή αύξηση των κερδών της εταιρείας κατά τη διάρκεια του τριμήνου.

  2. 🔁 Σε ποιο τρίμηνο εμφανίζουν οι κερδοφορίες την ισχυρότερη εποχική ώθηση; Δώστε μια πιθανή επιχειρηματική εξήγηση.

    Η ισχυρότερη εποχική ώθηση εμφανίζεται στο 3ο τρίμηνο (περίοδος ανάμεσα από Q2 και Q3) πιθανόν λόγω του ότι η καμπύλη των κερδών ακολουθεί ένα συγκεκριμένο αυξητικό “κανάλι” / τάση, μέσα στο οποίο συνήθως ισχύει ότι μόλις οι τιμές / κέρδη φτάσουν κοντά σε μία συγκεκριμένη τιμή κατώφλι του καναλιού, αν δεν υπάρξει διάσπαση, τότε σχεδόν πάντα παρατηρείται αύξησή τους μέχρι να παγιωθούν και να πέσουν πάλι, συνεχίζοντας τον “κύκλο”.

    #(Το έγραψα με κάποιους όρους που έμαθα από τα μαθήματα του καθηγητή Δασίλα Απόστολου, ελπίζω να βγάζει νόημα)!

  3. Multiplicative ή additive; Τεκμηριώστε την απάντηση με βάση τα plots.

    Η σειρά έχει μια ισχυρή ανοδική τάση με την πάροδο του χρόνου. Οι εποχιακές διακυμάνσεις μεγαλώνουν καθώς το επίπεδο αυξάνεται. Το μοντέλο είναι multiplicative λόγω του ότι το εποχικό πλάτος αυξάνεται αναλογικά με το επίπεδο της σειράς. Αντίθετα, σε ένα additive μοντέλο, το εποχικό πλάτος παραμένει περίπου σταθερό με την πάροδο του χρόνου.

✅ Μέρος Β - Να απαντήσετε στις παρακάτω ερωτήσεις

  1. 🏆 Ποιο μοντέλο νίκησε στο test set; Με πόση διαφορά από το baseline (Seasonal Naïve);

    Νίκησε το μοντέλο ARIMA με σκορ κριτηρίων:

    0.8136629 0.7225012 -1.524645 5.419212

    Το Seasonal Naive βγήκε τελευταίο, μετά και το Holt-Winters, καθώς εμφάνισε τις μεγαλύτερες τιμές σε όλα τα κριτήρια:

    2.7765401 2.5425000 17.89911 17.89911 4.294159
  2. 🔍 Τι μοντέλο διάλεξε η auto.arima(); Ερμηνεύστε τα (p,d,q)(P,D,Q)₌.

    Το auto.arima() επέλεξε το μοντέλο ARIMA(0,1,1)(0,1,1)[4].

    Το μη εποχικό μέρος (0,1,1) σημαίνει ότι η σειρά χρειάζεται μία διαφορά για στασιμότητα και ότι η δυναμική της περιγράφεται από έναν moving average όρο. Το εποχικό μέρος (0,1,1)[4] δείχνει ότι υπάρχει ετήσια εποχικότητα (4 τρίμηνα), η οποία αφαιρείται με εποχική διαφορά και μοντελοποιείται επίσης με moving average όρο.

    Μη εποχικό μέρος (0,1,1): p = 0 → δεν υπάρχει AR όρος (δεν χρησιμοποιεί προηγούμενες τιμές άμεσα). d = 1 → 1η διαφορά (για να γίνει η σειρά στάσιμη). q = 1 → 1 moving average όρος Άρα: το μοντέλο βασίζεται κυρίως σε σφάλματα (MA) και όχι σε autoregression.

    Εποχικό μέρος (0,1,1)[4]: P = 0 → δεν υπάρχει εποχικό AR. D = 1 → 1 εποχική διαφορά (αφαιρεί την εποχικότητα). Q = 1 → εποχικό moving average όρος. [4] → εποχικότητα κάθε 4 περιόδους. Εδώ η σειρά είναι τριμηνιαία (quarterly), άρα: 4 τρίμηνα = 1 έτος.

  3. 📊 Συμπεριφέρονται ως white noise τα residuals; Τι σημαίνει αυτό;

    Ο έλεγχος Ljung–Box έδωσε p-value = 0.5788, το οποίο είναι σημαντικά μεγαλύτερο από το επίπεδο σημαντικότητας α = 0.05. Οπότε τα residuals συμπεριφέρονται ως λευκός θόρυβος (white noise). Η μεγάλη διαφορά του p-value από το α υποδηλώνει ότι το μοντέλο ARIMA έχει καταγράψει ικανοποιητικά τη δομή της χρονοσειράς και δεν αφήνει σημαντική πληροφορία στα residuals.

  4. 📈 Πόσο μεγαλώνει το 95% prediction interval για το 1ο τρίμηνο vs το 12ο; Τι σας λέει αυτό για την αβεβαιότητα;

    Το 95% prediction interval είναι αρκετά στενότερο στο 1ο τρίμηνο και γίνεται αισθητά ευρύτερο στο 12ο τρίμηνο. Αυτό δείχνει ότι η αβεβαιότητα των προβλέψεων αυξάνεται όσο αυξάνεται ο χρονικός ορίζοντας πρόβλεψης. Ο λόγος είναι ότι σε πολυβηματικές προβλέψεις τα σφάλματα συσσωρεύονται και το μοντέλο βασίζεται ολοένα και περισσότερο σε προηγούμενες εκτιμήσεις αντί για πραγματικές παρατηρήσεις, με αποτέλεσμα να αυξάνεται η διασπορά των πιθανών τιμών. Όσο πιο μακριά στο μέλλον προβλέπουμε, τόσο περισσότερη σωρευτική αβεβαιότητα υπάρχει στο μοντέλο.

  5. 💼 Σύσταση προς τον portfolio manager: βάση των προβλέψεών σας, θα συστήνατε long ή short θέση στη μετοχή; Τεκμηριώστε.

    Σύμφωνα με όλα τα συμπεράσματα που αναδείξαμε, καθαρά από στατιστική σκοπιά και χωρίς να εισάγουμε εξωτερικούς παράγοντες αγοράς, η προβλεπόμενη δυναμική υποστηρίζει μια θετική πορεία της μετοχής στο βραχυπρόθεσμο ορίζοντα, κάτι που θα ευνοούσε περισσότερο μια long θέση έναντι μιας short. Ωστόσο, η αυξανόμενη αβεβαιότητα στο μέλλον σημαίνει ότι η εμπιστοσύνη μειώνεται σε μεγαλύτερα horizons, οπότε η σύσταση θα ήταν πιο ισχυρή για short-term long παρά για μακροπρόθεσμη τοποθέτηση.

    Η τελική μου σύσταση θα ήταν, με βάση τις προβλέψεις του ARIMA μοντέλου, την ισχυρή ανοδική τάση της σειράς και την απουσία δομικών ενδείξεων αντιστροφής (residuals ≈ white noise), η μετοχή εμφανίζει πιθανότητα συνέχισης της ανόδου στο άμεσο μέλλον. Παρότι η αβεβαιότητα αυξάνεται σε μεγαλύτερους χρονικούς ορίζοντες, τα αποτελέσματα στηρίζουν μια long θέση στρατηγικής, κυρίως σεέναν βραχυπρόθεσμο ορίζοντα.

Final Fin