Memuat library yang diperlukan

library(forecast)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(readxl)
library(tseries)

Membaca data saham Microsoft dan Pastikan format kolom tanggal dan harga saham

file_path <- "C:/metode peramalan/microsoft2.xlsx"
data <- read_excel(file_path)
data$Date <- as.Date(data$Date, format = "%d/%m/%Y") 
data$Close <- as.numeric(data$Close) 

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