Η παρούσα αναφορά συντάχθηκε για τον Portfolio Manager του fund με σκοπό την αξιολόγηση και την τριετή πρόβλεψη (12 τρίμηνα) των κερδών ανά μετοχή (EPS) της εταιρείας Johnson & Johnson, βασιζόμενη σε ιστορικά δεδομένα 84 τριμηνιαίων παρατηρήσεων (1960–1980).
Ως Financial Analysts, στόχος μας είναι η ανάλυση της χρονοσειράς, η σύγκριση εναλλακτικών μοντέλων πρόβλεψης (Seasonal Naïve, Holt-Winters, SARIMA) σε δεδομένα εκτός δείγματος (Test Set) και ο προσδιορισμός των διαστημάτων εμπιστοσύνης. Η τελική εισήγηση θα καθορίσει την επενδυτική στρατηγική του fund (Long ή Short θέση) στη συγκεκριμένη μετοχή, ελαχιστοποιώντας το επενδυτικό ρίσκο.
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(ggplot2)
library(gridExtra)
set.seed(42)
# --- Φόρτωση δεδομένων ---
data("JohnsonJohnson")
jj <- JohnsonJohnson
class(jj) # έλεγχος: είναι ήδη ts object;## [1] "ts"
## [1] 1960 1
## [1] 1980 4
## [1] 4
## [1] 84
## 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
Δημιουργούμε το αρχικό διάγραμμα της χρονοσειράς με την
autoplot() για να εξετάσουμε οπτικά την τάση, την
εποχικότητα και τη διακύμανση των κερδών (EPS).
autoplot(jj) +
ggtitle("Τριμηνιαία Κέρδη ανά Μετοχή (EPS) της Johnson & Johnson (1960–1980)") +
xlab("Έτος") +
ylab("EPS (USD)") +
theme_minimal()Τάση: Η χρονοσειρά παρουσιάζει μια ισχυρή, συνεχή και ξεκάθαρα εκθετική ανοδική τάση, με την κερδοφορία να επιταχύνεται μετά το 1970.
Εποχικότητα: Υπάρχει ένα έντονο, σταθερά επαναλαμβανόμενο εποχικό μοτίβο σε ετήσια βάση (ανά τέσσερα τρίμηνα).
Διακύμανση: Το εύρος των εποχικών διακυμάνσεων διευρύνεται όσο αυξάνεται το επίπεδο της σειράς, γεγονός που υποδηλώνει πολλαπλασιαστική συμπεριφορά.
Δημιουργούμε τα διαγράμματα ggseasonplot() και
ggsubseriesplot() για να απομονώσουμε την τριμηνιαία
συμπεριφορά και να εντοπίσουμε ποιο τρίμηνο παρουσιάζει συστηματικά τη
μεγαλύτερη κερδοφορία.
# Εποχικό διάγραμμα ανά έτος
ggseasonplot(jj, year.labels = TRUE) +
ggtitle("Seasonal Plot: Johnson & Johnson EPS") +
theme_minimal()Ισχυρότερα Τρίμηνα: Το 1ο (Q1) και το 3ο τρίμηνο (Q3) είναι τα δύο ισχυρότερα. Η κερδοφορία ξεκινάει πολύ ψηλά στο Q1, σημειώνει μια ξεκάθαρη βουτιά στο Q2, κάνει κορυφή στο Q3, και μετά πέφτει.
Ασθενέστερα Τρίμηνα: Το 4ο τρίμηνο (Q4) είναι σταθερά το πιο αδύναμο από όλα, με το 2ο τρίμηνο (Q2) να ακολουθεί ως η δεύτερη χαμηλότερη περίοδος της χρονιάς.
# Διάγραμμα μεταβολής ανά τρίμηνο
ggsubseriesplot(jj) +
ggtitle("Subseries Plot: Μεταβολή ανά Τρίμηνο") +
theme_minimal()Ισχυρότερο Τρίμηνο: Το 3ο τρίμηνο (Q3) έχει τον υψηλότερο μέσο όρο, ακολουθούμενο πολύ στενά από το 2ο (Q2) και το 1ο τρίμηνο (Q1).
Ασθενέστερο Τρίμηνο: Το 4ο τρίμηνο (Q4) έχει με διαφορά τον χαμηλότερο μέσο όρο κερδοφορίας διαχρονικά.
Ανάπτυξη: Η εκθετική καμπύλη μέσα σε κάθε τρίμηνο επιβεβαιώνει ότι η J&J αναπτύσσεται ραγδαία και με τον ίδιο ακριβώς ρυθμό σε όλες τις περιόδους του έτους.
Η εποχικότητα είναι ξεκάθαρα πολλαπλασιαστική.
Παρατηρώντας το αρχικό διάγραμμα της χρονοσειράς και το Seasonal Plot, το πλάτος των εποχικών διακυμάνσεων δεν παραμένει σταθερό. Αντίθετα, όσο αυξάνεται το επίπεδο της σειράς και η τάση ανεβαίνει (ειδικά μετά το 1970), οι διακυμάνσεις μεγαλώνουν ανάλογα.
Στις αρχές της δεκαετίας του ’60, με χαμηλά κέρδη, οι διακυμάνσεις είναι μικρές σε απόλυτα μεγέθη, ενώ στα τέλη της δεκαετίας του ’70 γίνονται πολύ μεγαλύτερες. Αυτή η ανάλογη αύξηση της διακύμανσης με την τάση αποτελεί την κλασική ένδειξη multiplicative μοντέλου.
Εφαρμόζουμε τη συνάρτηση decompose() με τύπο
type = "multiplicative" για να διαχωρίσουμε τη χρονοσειρά
στα βασικά της συστατικά: την τάση, την εποχικότητα και το τυχαίο
σφάλμα.
# Εκτέλεση πολλαπλασιαστικής αποσύνθεσης
dec_mult <- decompose(jj, type = "multiplicative")
# Οπτικοποίηση των συστατικών
autoplot(dec_mult) +
ggtitle("Multiplicative Decomposition — Johnson & Johnson EPS") +
theme_minimal()Trend (Τάση): Η μακροπρόθεσμη τάση είναι ξεκάθαρα καμπυλωτή και όχι ευθύγραμμη. Παρουσιάζει μια ομαλή, εκθετικά επιταχυνόμενη ανοδική τροχιά, επιβεβαιώνοντας τη γεωμετρική ανάπτυξη της εταιρείας.
Seasonal (Εποχικότητα): Το εποχικό συστατικό απομονώνει το τριμηνιαίο μοτίβο. Επειδή η αποσύνθεση είναι πολλαπλασιαστική, οι δείκτες κυμαίνονται σταθερά γύρω από τη μονάδα σε όλο το μήκος του άξονα του χρόνου.
Remainder (Κατάλοιπα): Δείχνει το τυχαίο σφάλμα (θόρυβο) αφού αφαιρεθεί η τάση και η εποχικότητα. Κινείται γύρω από το 1.0, παρουσιάζοντας κάποιες μεμονωμένες έντονες αστάθειες, αλλά παραμένει γενικά ελεγχόμενο.
Εφαρμόζουμε τον λογαριθμικό μετασχηματισμό log() στη
σειρά και σχεδιάζουμε το αρχικό και το λογαριθμικό διάγραμμα δίπλα-δίπλα
με την grid.arrange() για να συγκρίνουμε τη συμπεριφορά της
τάσης και της διακύμανσης.
# Εφαρμογή λογαρίθμου
jj_log <- log(jj)
# Δημιουργία των δύο plots
p1 <- autoplot(jj) + ggtitle("Αρχική Σειρά") + theme_minimal()
p2 <- autoplot(jj_log) + ggtitle("Λογαριθμική Σειρά") + theme_minimal()
# Εμφάνιση δίπλα-δίπλα
grid.arrange(p1, p2, ncol = 2)Γραμμικοποίηση της Τάσης: Η αρχική εκθετική τάση μετατρέπεται πλέον σε μια σχεδόν γραμμική ανοδική πορεία, γεγονός που διευκολύνει τη στατιστική μοντελοποίηση.
Σταθεροποίηση της Διακύμανσης: Το εύρος των εποχικών διακυμάνσεων έχει πλέον σταθεροποιηθεί σε όλο το μήκος του χρόνου. Δεν μεγαλώνει όσο ανεβαίνει η σειρά, μετατρέποντας τη συμπεριφορά από multiplicative σε additive.
Διαχωρίζουμε τη χρονοσειρά χρονολογικά σε δύο σύνολα.
Το σύνολο εκπαίδευσης (Train set: 1960 Q1 – 1978 Q4, 76 παρατηρήσεις) για την προσαρμογή των μοντέλων και το σύνολο ελέγχου (Test set: 1979 Q1 – 1980 Q4, 8 παρατηρήσεις) για την αξιολόγηση των προβλέψεων εκτός δείγματος.
# Χρονολογικός διαχωρισμός με τη window()
train <- window(jj, end = c(1978, 4))
test <- window(jj, start = c(1979, 1))
# Έλεγχος των συνόλων
length(train)## [1] 76
## [1] 8
Ελέγχουμε αν η αρχική σειρά εκπαίδευσης (train) είναι
στάσιμη χρησιμοποιώντας τη δοκιμασία Augmented Dickey-Fuller
(adf.test()).
## Warning in adf.test(train): p-value greater than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: train
## Dickey-Fuller = 0.85296, Lag order = 4, p-value = 0.99
## alternative hypothesis: stationary
p-value: \(0.99\) (μεγαλύτερο από το κρίσιμο επίπεδο σημαντικότητας \(\alpha = 0.05\)).
Απόφαση: Αποτυγχάνουμε να απορρίψουμε την μηδενική υπόθεση (\(H_0\): η σειρά έχει μοναδιαία ρίζα / δεν είναι στάσιμη).
Συμπέρασμα: Η αρχική σειρά train
είναι μη στάσιμη. Αυτό είναι απόλυτα αναμενόμενο, καθώς
η σειρά κυριαρχείται από την ισχυρή εκθετική ανοδική τάση και την έντονη
εποχικότητα που είδαμε στο Μέρος Α.
Επειδή η σειρά δεν είναι στάσιμη, εφαρμόζουμε πρώτα τις κατάλληλες
διαφορές και στη συνέχεια σχεδιάζουμε τα διαγράμματα Αυτοσυσχέτισης
(ggAcf()) και Μερικής Αυτοσυσχέτισης
(ggPacf()) δίπλα-δίπλα για να αναγνωρίσουμε τις παραμέτρους
ενός πιθανού μοντέλου ARIMA.
# Παράδειγμα για πρώτη και εποχική διαφορά στη λογαριθμική σειρά
jj_diff <- diff(diff(log(train), lag = 4))
# Δημιουργία των ACF και PACF plots
p_acf <- ggAcf(jj_diff) + ggtitle("ACF") + theme_minimal()
p_pacf <- ggPacf(jj_diff) + ggtitle("PACF") + theme_minimal()
# Εμφάνιση δίπλα-δίπλα
grid.arrange(p_acf, p_pacf, ncol = 2)ACF:
Lag 1: Παρουσιάζει μια πολύ ισχυρή, αρνητική και στατιστικά σημαντική τιμή (~ -0.38), ξεπερνώντας κατά πολύ το κάτω μπλε διακεκομμένο όριο.
Lag 4: Δείχνει επίσης μια σημαντική αρνητική τιμή που οριακά ξεπερνά το όριο.
Lag 7: Εμφανίζει μια σημαντική θετική τιμή που ξεπερνά το πάνω όριο σημαντικότητας.
Τα υπόλοιπα lags (όπως το 11) βρίσκονται οριακά πάνω ή μέσα στα όρια.
PACF:
Lag 1: Δείχνει μια έντονη, στατιστικά σημαντική αρνητική τιμή (~ -0.38).
Lag 4: Παρουσιάζει μια εξίσου ισχυρή αρνητική κορυφή (~ -0.33) που ξεπερνά καθαρά το κάτω όριο.
Κανένα άλλο lag στο PACF δεν ξεπερνά τα μπλε διακεκομμένα όρια σταθερότητας.
Εκπαιδεύουμε τρία διαφορετικά μοντέλα στο σύνολο εκπαίδευσης
(train) για να προβλέψουμε τα επόμενα 8 τρίμηνα (2 έτη),
όσο δηλαδή είναι και το μέγεθος του test set.
Στο μοντέλο Holt-Winters χρησιμοποιούμε
seasonal = "multiplicative", καθώς στο Μέρος Α τεκμηριώσαμε
ότι η διακύμανση αυξάνεται μαζί με την τάση.
Στο ARIMA χρησιμοποιούμε lambda = 0 (λογαριθμικός
μετασχηματισμός) μέσα στην auto.arima() για να
σταθεροποιήσουμε τη διακύμανση και να γραμμικοποιήσουμε την
τάση.
library(forecast)
# (α) Seasonal Naïve
fit_snaive <- snaive(train, h = 8)
# (β) Holt-Winters (Πολλαπλασιαστικό)
fit_hw <- hw(train, h = 8, seasonal = "multiplicative")
# (γ) ARIMA (με αυτόματο λογάριθμο μέσω lambda=0)
fit_arima_model <- auto.arima(train, lambda = 0)
fit_arima <- forecast(fit_arima_model, h = 8)
# Εμφάνιση των summary
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
##
## 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
## 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
Seasonal Naïve (Baseline): Έχει τη χειρότερη προσαρμογή με RMSE = 0.8214 και MAPE = 14.78%, καθώς αδυνατεί να ακολουθήσει την έντονη ανοδική τάση της σειράς.
Holt-Winters (Multiplicative): Εξαιρετική βελτίωση με RMSE = 0.3596 και MAPE = 9.29%. Το \(\gamma = 1e-04\) δείχνει ότι το εποχικό μοτίβο είναι απόλυτα σταθερό διαχρονικά.
ARIMA(2,0,0)(1,1,0)[4] με drift (λ = 0): Το
κορυφαίο μοντέλο στο training set με το χαμηλότερο MAPE =
6.77% (RMSE = 0.3597). Ο λογάριθμος (\(\lambda=0\)) σταθεροποίησε τη διακύμανση,
ενώ το drift αποτυπώνει με ακρίβεια την τάση.
Εφαρμόζουμε τη συνάρτηση checkresiduals() στο καλύτερο
μοντέλο μας (ARIMA) για να ελέγξουμε αν τα κατάλοιπα (residuals)
συμπεριφέρονται ως λευκός θόρυβος (white noise), δηλαδή αν είναι
ασυσχέτιστα, με μηδενικό μέσο όρο και σταθερή διακύμανση.
##
## 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\), το οποίο είναι κατά πολύ μεγαλύτερο από το κρίσιμο επίπεδο \(\alpha = 0.05\). Συνεπώς, αποδεχόμαστε τη μηδενική υπόθεση ότι τα κατάλοιπα είναι ανεξάρτητα και ασυσχέτιστα.
Διάγραμμα ACF καταλοίπων: Όλες οι ράβδοι αυτοσυσχέτισης των σφαλμάτων βρίσκονται εντός των μπλε διακεκομμένων ορίων σημαντικότητας, γεγονός που επιβεβαιώνει την απουσία εναπομένουσας συσχέτισης.
Ιστόγραμμα: Η κατανομή των καταλοίπων είναι καμπυλωτή, συμμετρική και ακολουθεί ικανοποιητικά την κανονική κατανομή (πορτοκαλί γραμμή) με μέσο όρο πολύ κοντά στο μηδέν.
Συμπέρασμα: Τα κατάλοιπα του ARIMA μοντέλου αποτελούν λευκό θόρυβο (white noise). Αυτό σημαίνει ότι το μοντέλο έχει εξαγάγει όλη τη διαθέσιμη πληροφορία από τα δεδομένα και οι προβλέψεις του είναι έγκυρες.
Σχεδιάζουμε την αρχική σειρά εκπαίδευσης (train) και
προσθέτουμε πάνω στο ίδιο γράφημα ως ξεχωριστά επίπεδα
(autolayer) τις πραγματικές τιμές ελέγχου
(test), καθώς και τις μέσες προβλέψεις (mean)
και των τριών μοντέλων που εκπαιδεύσαμε, ώστε να συγκρίνουμε οπτικά την
ακρίβειά τους.
# Οπτικοποίηση όλων των προβλέψεων μαζί με το Test set
autoplot(train) +
autolayer(test, series = "Πραγματικά", lwd = 0.8) +
autolayer(fit_snaive$mean, series = "Seasonal Naïve", lwd = 0.8) +
autolayer(fit_hw$mean, series = "Holt-Winters", lwd = 0.8) +
autolayer(fit_arima$mean, series = "ARIMA", lwd = 0.8) +
ggtitle("Σύγκριση Προβλέψεων Μοντέλων vs Πραγματικά Δεδομένα") +
xlab("Έτος") + ylab("EPS") +
theme_minimal() +
scale_colour_manual(values=c("Πραγματικά"="black", "Seasonal Naïve"="red",
"Holt-Winters"="blue", "ARIMA"="green4"))Seasonal Naïve (Κόκκινη): Αποτυγχάνει πλήρως. Υποτιμά τη σειρά γιατί επαναλαμβάνει το παρελθόν χωρίς να βλέπει την ανοδική τάση.
Holt-Winters (Μπλε) & ARIMA (Πράσινη): Εξαιρετική πρόβλεψη. Ακολουθούν πιστά και την ανοδική τάση και τις έντονες τριμηνιαίες διακυμάνσεις των πραγματικών δεδομένων (Μαύρη γραμμή).
Συμπέρασμα: ARIMA και Holt-Winters δίνουν «μάχη στήθος με στήθος», με το ARIMA να αποτυπώνει οριακά καλύτερα τις ακραίες κορυφές του test set.
Υπολογίζουμε τους δείκτες ακρίβειας των τριών μοντέλων εκτός
δείγματος (out-of-sample) χρησιμοποιώντας τη συνάρτηση
accuracy() σε συνδυασμό με το test set, ώστε
να αναδείξουμε τον τελικό νικητή βάσει των σφαλμάτων RMSE, MAE και
MAPE.
# Υπολογισμός σφαλμάτων στο test set
acc_snaive <- accuracy(fit_snaive, test)[2, c("RMSE", "MAE", "MAPE")]
acc_hw <- accuracy(fit_hw, test)[2, c("RMSE", "MAE", "MAPE")]
acc_arima <- accuracy(fit_arima, test)[2, c("RMSE", "MAE", "MAPE")]
# Συγκέντρωση των αποτελεσμάτων
metrics_summary <- rbind(
"Seasonal Naive" = acc_snaive,
"Holt-Winters" = acc_hw,
"ARIMA" = acc_arima
)
metrics_summary## RMSE MAE MAPE
## Seasonal Naive 2.7765401 2.5425000 17.899110
## Holt-Winters 1.0865532 1.0427583 7.763851
## ARIMA 0.8136629 0.7225012 5.419212
Seasonal Naïve: Το χειρότερο μοντέλο με RMSE = 2.78 και MAPE = 17.90%, λόγω αδυναμίας προσαρμογής στην τάση.
Holt-Winters: Πολύ καλή επίδοση, μειώνοντας το σφάλμα σε RMSE = 1.09 και MAPE = 7.76%.
Τελικός Νικητής (ARIMA): Το μοντέλο ARIMA(2,0,0)(1,1,0)[4] με drift κυριαρχεί σε όλους τους δείκτες με το χαμηλότερο RMSE = 0.81 και MAPE = 5.42%.
Συμπέρασμα: Ο αυτόματος λογάριθμος (\(\lambda = 0\)) και η στοχαστική δομή του ARIMA αποτύπωσαν άριστα τη δυναμική της σειράς, δίνοντας την ακριβέστερη πρόβλεψη εκτός δείγματος.
Επανεκπαιδεύουμε το νικητήριο μοντέλο (ARIMA) στο πλήρες
σύνολο δεδομένων (jj), ενσωματώνοντας και τις τελευταίες
παρατηρήσεις του test set ώστε να αξιοποιήσουμε όλη τη διαθέσιμη
πληροφορία. Στη συνέχεια, πραγματοποιούμε πρόβλεψη για τα επόμενα 12
τρίμηνα (3 χρόνια μπροστά) για τις ανάγκες του Portfolio Manager.
# Επανεκπαίδευση του νικητήριου ARIMA στο πλήρες dataset
final_arima_model <- auto.arima(jj, lambda = 0)
# Πρόβλεψη για 12 τρίμηνα (3 έτη) μπροστά
final_forecast <- forecast(final_arima_model, h = 12)
# Εμφάνιση των αριθμητικών προβλέψεων
print(final_forecast)## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## 1981 Q1 18.51527 16.53479 20.73297 15.57364 22.01253
## 1981 Q2 17.06041 15.17457 19.18062 14.26218 20.40766
## 1981 Q3 18.88704 16.68561 21.37892 15.62610 22.82850
## 1981 Q4 13.46536 11.87766 15.26528 11.11443 16.31355
## 1982 Q1 21.59675 18.40188 25.34630 16.90664 27.58795
## 1982 Q2 19.83398 16.84548 23.35265 15.45032 25.46140
## 1982 Q3 21.89227 18.51659 25.88334 16.94573 28.28271
## 1982 Q4 15.68610 13.25288 18.56606 12.12155 20.29887
## 1983 Q1 25.12898 20.58554 30.67519 18.52304 34.09080
## 1983 Q2 23.10456 18.87243 28.28574 16.95557 31.48350
## 1983 Q3 25.52715 20.77142 31.37172 18.62382 34.98935
## 1983 Q4 18.26814 14.84986 22.47328 13.30742 25.07811
# Οπτικοποίηση με διακριτά διαστήματα εμπιστοσύνης (80% και 95%)
autoplot(final_forecast) +
ggtitle("Τελική Πρόβλεψη EPS για τα Επόμενα 3 Έτη (ARIMA)") +
xlab("Έτος") + ylab("EPS") +
theme_minimal()Πορεία: Το ARIMA συνεχίζει ιδανικά την εκθετική ανοδική τάση και το έντονο εποχικό μοτίβο της σειράς για την τριετία 1981–1983.
Αβεβαιότητα: Τα διαστήματα εμπιστοσύνης διευρύνονται φυσιολογικά όσο μακραίνει ο ορίζοντας πρόβλεψης, αποτυπώνοντας το ρίσκο για τον Portfolio Manager.
Επενδυτικό Συμπέρασμα: Η μετοχή δείχνει ισχυρή αναπτυξιακή δυναμική. Οι ιστορικές κορυφές των ~16 μονάδων αναμένεται να ξεπεραστούν, με τις νέες αιχμές να προσεγγίζουν τις 25 μονάδες EPS στα τρίμηνα αιχμής.
Για να αξιολογήσουμε αν οι προβλέψεις του ARIMA για την τριετία 1981–1983 είναι ρεαλιστικές, υπολογίζουμε και συγκρίνουμε τον Μέσο Ετήσιο Ρυθμό Ανάπτυξης (CAGR) των κερδών ανά μετοχή (EPS) μεταξύ της ιστορικής περιόδου και της περιόδου πρόβλεψης.
Χρησιμοποιούμε τον τύπο του CAGR:
$$CAGR = \left( \frac{\text{Τελική Τιμή}}{\text{Αρχική Τιμή}} \right)^{\frac{1}{n}} - 1$$
# 1. Ιστορικό Growth Rate (1960 vs 1980 - Χρήση μέσων όρων έτους)
historical_1960 <- mean(window(jj, start = c(1960, 1), end = c(1960, 4)))
historical_1980 <- mean(window(jj, start = c(1980, 1), end = c(1980, 4)))
cagr_historical <- (historical_1980 / historical_1960)^(1 / 20) - 1
# 2. Προβλεπόμενο Growth Rate (1980 vs 1983)
forecast_1983 <- mean(window(final_forecast$mean, start = c(1981, 1), end = c(1983, 4)))
# Σημείωση: Χρησιμοποιούμε το mean του 1983 ως τελικό έτος πρόβλεψης (3 έτη μετά το 1980)
cagr_forecast <- (forecast_1983 / historical_1980)^(1 / 3) - 1
# Εκτύπωση αποτελεσμάτων σε ποσοστό
cat("Ισтоρικό CAGR (1960-1980):", round(cagr_historical * 100, 2), "%\n")## Ισтоρικό CAGR (1960-1980): 16.78 %
## Προβλεπόμενο CAGR (1980-1983): 10.84 %
Σύγκριση: Το ιστορικό CAGR είναι 16.78%, ενώ το προβλεπόμενο υποχωρεί ελαφρώς στο 10.84%.
Ρεαλισμός: Ναι, είναι απόλυτα ρεαλιστικό. Το μοντέλο αποφεύγει την παγίδα της απεριόριστης εκρηκτικής ανάπτυξης και προτείνει μια πιο ώριμη, συντηρητική πορεία.
Συμπέρασμα: Η πρόβλεψη είναι ασφαλής για τον Portfolio Manager, δείχνοντας ότι η εταιρεία διατηρεί ισχυρή, διψήφια αναπτυξιακή δυναμική παρά το μεγάλο μέγεθός της.
## 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
# Σύγκριση ακρίβειας στο test set
accuracy(forecast(fit_ets, h = 8), test)[2, c("RMSE", "MAE", "MAPE")]## RMSE MAE MAPE
## 1.167089 1.099160 8.185848
Μοντέλο: Επιλέχθηκε το ETS(M,A,A).
Ερμηνεία (M,A,A): Multiplicative σφάλμα, Additive τάση, Additive εποχικότητα.
Σύγκριση: Δεν νικάει το
Holt-Winters. Το hw() υπερέχει στο test set με
MAPE = 7.76% (έναντι 8.19% του
ETS).
Συμπέρασμα: Η προσθετική εποχικότητα του ETS περιόρισε την ακρίβειά του εκτός δείγματος, δικαιώνοντας την επιλογή μας για πολλαπλασιαστική δομή. Το ARIMA παραμένει ο απόλυτος νικητής (5.42%).
Τι παρατηρείτε για την τάση της J&J; Είναι γραμμική ή εκθετική;
Η τάση είναι εκθετική. Ο ρυθμός ανάπτυξης επιταχύνεται ραγδαία όσο πλησιάζουμε προς το 1980, με την καμπύλη να αποκτά όλο και μεγαλύτερη κλίση προς τα πάνω.
Σε ποιο τρίμηνο εμφανίζουν οι κερδοφορίες την ισχυρότερη εποχική ώθηση; Δώστε μια πιθανή επιχειρηματική εξήγηση.
Η κορύφωση συμβαίνει στο 2ο τρίμηνο (Q2). Οφείλεται στην αυξημένη ζήτηση για καταναλωτικά προϊόντα υγείας/φροντίδας (π.χ. αντηλιακά, προϊόντα περιποίησης) ενόψει καλοκαιριού, σε αντίθεση με το Q4 όπου οι φαρμακαποθήκες μειώνουν τα αποθέματά τους για το κλείσιμο του έτους.
Multiplicative ή additive; Τεκμηριώστε την απάντηση με βάση τα plots. Είναι Multiplicative. Καθώς το επίπεδο (trend) της σειράς ανεβαίνει, το εύρος της εποχικής διακύμανσης μεγαλώνει. Η απόσταση μεταξύ κορυφών και πυθμένων αυξάνεται συνεχώς, αποδεικνύοντας ότι η εποχικότητα λειτουργεί ως ποσοστό και όχι ως σταθερό ποσό.
Μοντέλο: ARIMA(2,0,0)(1,1,0)[4] με drift.
Διαφορά από Baseline: Τεράστια υπεροχή. Το ARIMA πέτυχε MAPE = 5.42% έναντι 17.90% του Seasonal Naïve, μειώνοντας το ποσοστιαίο σφάλμα κατά 12.48%.
Επιλέχθηκε το μοντέλο ARIMA(2,0,0)(1,1,0)[4] με drift με μετασχηματισμό \(\lambda = 0\) (λογάριθμος).
Συμπεριφορά: Ναι, συμπεριφέρονται ως λευκός θόρυβος (White Noise), καθώς δεν έχουν συστηματική δομή και οι αυτοσυσχετίσεις τους (ACF) είναι εντός των ορίων σημαντικότητας.
Σημασία: Σημαίνει ότι το μοντέλο «απορρόφησε» όλη τη διαθέσιμη πληροφορία και το μοτίβο των δεδομένων. Ό,τι απέμεινε είναι καθαρά τυχαίο σφάλμα που δεν μπορεί να προβλεφθεί περαιτέρω.
Παρατήρηση: Το εύρος του διαστήματος (ανοιχτό μπλε) στο 12ο τρίμηνο είναι σχεδόν διπλάσιο σε σχέση με το 1ο τρίμηνο πρόβλεψης.
Ερμηνεία για Αβεβαιότητα: Δείχνει ότι η αβεβαιότητα αυξάνεται σωρευτικά όσο απομακρυνόμαστε από το παρόν. Η πρόβλεψη για το άμεσο μέλλον είναι πιο σίγουρη, ενώ για το τέλος της 3ετίας το ρίσκο μεγαλώνει λόγω αστάθμητων παραγόντων.
Σύσταση: Long θέση (Αγορά).
Τεκμηρίωση: Η μετοχή παρουσιάζει ισχυρή και υγιή εκθετική τάση. Ακόμη και στο πιο συντηρητικό επιχειρηματικό σενάριο (CAGR = 10.84%), η κερδοφορία (EPS) προβλέπεται να σπάσει το ιστορικό φράγμα των ~16 μονάδων και να αγγίξει νέες κορυφές κοντά στις 25 μονάδες στα τρίμηνα αιχμής της επόμενης τριετίας.