Memuat library yang diperlukan
library(forecast)
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(readxl)
library(tseries)
Konversi ke time series dengan frekuensi bulanan (12)
s_data <- ts(data$Close, frequency = 12, start = c(as.numeric(format(min(data$Date), "%Y")),
as.numeric(format(min(data$Date), "%m"))))
Plot data
ts.plot(s_data, main = "Data Saham Microsoft", ylab = "Harga Saham", col = "blue")

Plot musiman untuk data saham
seasonplot(s_data,
main = "Seasonal Plot of Microsoft Stock Data",
xlab = "Bulan",
ylab = "Harga Saham",
year.labels = TRUE,
col = rainbow(12))

Uji stasioneritas menggunakan ADF Test
adf_test <- adf.test(s_data, alternative = "stationary")
cat("\nHasil Uji Stasioneritas (ADF Test):\n")
##
## Hasil Uji Stasioneritas (ADF Test):
print(adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: s_data
## Dickey-Fuller = -2.6299, Lag order = 4, p-value = 0.315
## alternative hypothesis: stationary
Melakukan Differencing jika karena data belum stasioneritas
ts_Close_diff <- diff(s_data, differences = ifelse(adf_test$p.value > 0.05, 1, 0))
Uji stasioneritas lagi
adf_test <- adf.test(ts_Close_diff, alternative = "stationary")
## Warning in adf.test(ts_Close_diff, alternative = "stationary"): p-value smaller
## than printed p-value
cat("\nHasil Uji Stasioneritas (ADF Test):\n")
##
## Hasil Uji Stasioneritas (ADF Test):
print (adf_test)
##
## Augmented Dickey-Fuller Test
##
## data: ts_Close_diff
## Dickey-Fuller = -4.5367, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary
Plot differenced data jika ada
ts.plot(s_data, main = "Data Saham Setelah Differencing", ylab = "Harga Saham", col = "red")

Untuk Membuat model ARIMA secara otomatis
auto.arima(s_data)
## Series: s_data
## ARIMA(0,1,0) with drift
##
## Coefficients:
## drift
## 3.3361
## s.e. 1.2276
##
## sigma^2 = 180.9: log likelihood = -477.61
## AIC=959.23 AICc=959.33 BIC=964.79
Membuat model ARIMA secara manual dengan order (0,1,0)
manual_arima <- Arima(s_data, order = c(0, 1, 0),include.drift=TRUE)
cat("\nRingkasan Model ARIMA (0,1,0):\n")
##
## Ringkasan Model ARIMA (0,1,0):
print(summary(manual_arima))
## Series: s_data
## ARIMA(0,1,0) with drift
##
## Coefficients:
## drift
## 3.3361
## s.e. 1.2276
##
## sigma^2 = 180.9: log likelihood = -477.61
## AIC=959.23 AICc=959.33 BIC=964.79
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set 0.0003088661 13.33565 9.289399 -1.115038 5.037654 0.1831376
## ACF1
## Training set -0.0933492
Prediksi saham 5 bulan ke depan
forecast_manual_arima <- forecast(manual_arima, h = 5)
print(forecast_manual_arima)
## Point Forecast Lo 80 Hi 80 Lo 95 Hi 95
## Jan 2025 440.7261 423.4915 457.9606 414.3681 467.0840
## Feb 2025 444.0621 419.6888 468.4354 406.7863 481.3379
## Mar 2025 447.3982 417.5470 477.2493 401.7448 493.0515
## Apr 2025 450.7342 416.2651 485.2033 398.0183 503.4501
## May 2025 454.0703 415.5326 492.6079 395.1321 513.0084
# Plot hasil prediksi
plot(forecast_manual_arima, main = "Prediksi ARIMA (0,1,0) 5 Bulan ke Depan", ylab = "Harga Saham", xlab = "Bulan", col = "blue")

Cek residuals model untuk validasi
cat("\nAnalisis Residuals Model ARIMA (0,1,0):\n")
##
## Analisis Residuals Model ARIMA (0,1,0):
checkresiduals(manual_arima)

##
## Ljung-Box test
##
## data: Residuals from ARIMA(0,1,0) with drift
## Q* = 27.325, df = 24, p-value = 0.2895
##
## Model df: 0. Total lags used: 24