1 Impor Library Yang Dibutuhkan

library(tseries)
## Warning: package 'tseries' was built under R version 4.4.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(FSA)
## Warning: package 'FSA' was built under R version 4.4.3
## ## FSA v0.9.6. See citation('FSA') if used in publication.
## ## Run fishR() for related website and fishR('IFAR') for related book.
library(FinTS)
## Warning: package 'FinTS' was built under R version 4.4.3
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(TSA)
## Warning: package 'TSA' was built under R version 4.4.2
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
library(lmtest)
library(forecast)
## Warning: package 'forecast' was built under R version 4.4.3
## Registered S3 methods overwritten by 'forecast':
##   method       from
##   fitted.Arima TSA 
##   plot.Arima   TSA
## 
## Attaching package: 'forecast'
## The following object is masked from 'package:FinTS':
## 
##     Acf
library(MLmetrics)
## Warning: package 'MLmetrics' was built under R version 4.4.3
## 
## Attaching package: 'MLmetrics'
## The following object is masked from 'package:base':
## 
##     Recall
library(xts)
## Warning: package 'xts' was built under R version 4.4.3
library(readxl)
## Warning: package 'readxl' was built under R version 4.4.3
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.4.3
library(ggrepel)
## Warning: package 'ggrepel' was built under R version 4.4.3
library(MASS)
library(tsoutliers)
## Warning: package 'tsoutliers' was built under R version 4.4.3
library(zoo)
library(dplyr)
## Warning: package 'dplyr' was built under R version 4.4.3
## 
## ######################### Warning from 'xts' package ##########################
## #                                                                             #
## # The dplyr lag() function breaks how base R's lag() function is supposed to  #
## # work, which breaks lag(my_xts). Calls to lag(my_xts) that you type or       #
## # source() into this session won't work correctly.                            #
## #                                                                             #
## # Use stats::lag() to make sure you're not using dplyr::lag(), or you can add #
## # conflictRules('dplyr', exclude = 'lag') to your .Rprofile to stop           #
## # dplyr from breaking base R's lag() function.                                #
## #                                                                             #
## # Code in packages is not affected. It's protected by R's namespace mechanism #
## # Set `options(xts.warn_dplyr_breaks_lag = FALSE)` to suppress this warning.  #
## #                                                                             #
## ###############################################################################
## 
## Attaching package: 'dplyr'
## The following object is masked from 'package:MASS':
## 
##     select
## The following objects are masked from 'package:xts':
## 
##     first, last
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(DT)
## Warning: package 'DT' was built under R version 4.4.3

2 Impor Data yang Dibutuhkan

Data yang digunakan dalam penerapan model ARIMA Outlier adalah data harga saham harian IHSG dari tanggal 1 Februari 2024 hingga 4 September 2025. Harga saham IHSG dipengaruhi oleh berbagai faktor ekonomi, seperti kondisi pasar domestik, situasi politik, pergerakan pasar global, serta peristiwa besar seperti ketidakstabilan ekonomi pasca-pandemi COVID-19, ketegangan geopolitik, dan perubahan kebijakan moneter. Faktor-faktor tersebut dapat menyebabkan fluktuasi harga yang tajam dan munculnya nilai ekstrem (outlier) dalam pergerakan IHSG. Karena model ARIMA konvensional memiliki keterbatasan dalam menangani data dengan pola fluktuasi ekstrem, analisis ini menggunakan pendekatan model ARIMA Outlier untuk mendeteksi dan mengakomodasi nilai-nilai ekstrem, serta ARIMA Intervensi untuk menangkap dampak peristiwa khusus terhadap pergerakan harga saham. Pendekatan ini diharapkan menghasilkan model peramalan yang lebih akurat dan sesuai dengan karakteristik data IHSG.

#Impor Data
Data_Saham <- read_excel("C:/Users/Shella Mitha/Downloads/Data IHSG (1).xlsx")
Saham <- as.numeric(Data_Saham$'Harga Saham')
Data_Saham$Tanggal <- as.Date(Data_Saham$'Tanggal')
Tanggal <- Data_Saham$Tanggal

#Format kolom tanggal
Data_Saham <- Data_Saham %>%
  mutate(Tanggal = format(as.Date(Tanggal), "%d %B %Y"))

#Tampilkan tanpa kolom No
datatable(head(Data_Saham), 
          options = list(pageLength = 6), 
          rownames = FALSE,
          caption = "Tabel 1. Data Harga Saham IHSG")

3 Visualisasi Data Saham

#Convert to Time Series
ts_Saham <- ts(Saham, frequency = 252)

#Visualisasi Data Saham
plot(Tanggal, Saham, type = "o", col = "blue", lwd = 2)
abline(v = Tanggal[64], col = "red", lty = 3, lwd = 1.5)

Pada plot deret waktu tersebut, dapat diketahui bahwa nilai Indeks Harga Saham Gabungan (IHSG) mengalami fluktuasi cukup tinggi sepanjang periode Januari 2024 hingga April 2025. Secara umum, IHSG sempat bergerak stabil di awal tahun 2024, lalu mengalami penurunan hingga pertengahan tahun 2024. Setelah itu, IHSG menunjukkan kenaikan yang cukup signifikan hingga mencapai puncaknya pada akhir tahun 2024. Namun, mulai awal tahun 2025, terjadi penurunan bertahap yang kemudian diikuti oleh penurunan yang sangat tajam pada awal April 2025.

Pergerakan IHSG ini menunjukkan karakteristik deret waktu yang tidak stasioner, dengan fluktuasi yang cukup besar dan adanya tren yang berubah-ubah, sehingga perlu dilakukan pemodelan deret waktu untuk memahami pola pergerakan dan melakukan peramalan. Fluktuasi yang tinggi juga memungkinkan adanya nilai pencilan (outlier) pada data IHSG.

4 Uji Stasioneritas (Sebelum Differencing)

4.1 Stationeritas terhadap ragam

BoxCox.lambda(Saham)
## [1] 1.999924

Hasil dari pemeriksaan stasioneritas terhadap ragam menggunakan Box-cox dapat diketahui bahwa nilai \(\lambda=1.999924\) sehingga dapat dinyatakan bahwa data saham tidak stasioner terhadap ragam.

4.2 Stasioneritas terhadap rata-rata

Data deret waktu yang digunakan untuk pemodelan ARIMA harus stasioner terhadap rata-rata. Pengujian hipotesis stasioneritas terhadap rata-rata dapat menggunakan statistik uji Dickey Fuller dengan hipotesis sebagai berikut.
\(H_0\) : \(\phi=1\) (data tidak stasioner terhadap rata-rata) vs
\(H_1\) : \(\phi<1\) (data stasioner terhadap rata-rata)
Taraf nyata: \(\alpha=0,05\)
Daerah penolakan: apabila nilai-p kurang dari 0,05 maka \(H_0\) ditolak yang artinya data stasioner terhadap rata-rata

adf.test(Saham, k=1)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  Saham
## Dickey-Fuller = -0.78673, Lag order = 1, p-value = 0.9621
## alternative hypothesis: stationary

Hasil uji Dickey Fuller pada data Saham harian didapatkan nilai-p sebesar \(0,9621\) yang di mana lebih dari \(\alpha=0,05\) sehingga menghasilkan keputusan terima \(H_0\). Dengan demikian, dapat dinyatakan bahwa data saham hasil pembedaan pertama tidak stasioner terhadap rata-rata.

4.3 Box-COx Transformasi

#Box-Cox Transformasi
lambda <- BoxCox.lambda(Saham)
Saham.bc <- BoxCox(Saham, lambda = lambda)
ts_Saham.bc <- ts(Saham.bc, frequency = 252)

4.4 Differencing

#Differencing 
diff_Saham.bc <- diff(ts_Saham.bc)
tanggal_diff <- Tanggal[-1] 
#Visualisasi Setelah Differencing
ggplot(data.frame(tanggal_diff, diff_Saham.bc), aes(x = tanggal_diff, y = diff_Saham.bc)) + 
  geom_line(color = "blue", size = 1.2) + 
  geom_point(color = "blue", size = 2) +
  labs(title = "Saham Setelah Transformasi dan Differencing", x = "Tanggal", y = "Diff Saham") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5)) +
  geom_vline(xintercept = as.numeric(tanggal_diff[63]), linetype = "dashed", color = "red", size = 1.2)
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
## Don't know how to automatically pick scale for object of type <ts>. Defaulting
## to continuous.

Plot di atas menunjukkan hasil differencing pertama pada data IHSG (yaitu selisih nilai IHSG antar hari), yang bertujuan untuk menghilangkan tren dan membuat data menjadi stasioner. Berdasarkan plot tersebut, terlihat bahwa fluktuasi data menjadi lebih stabil secara rata-rata (berkisar di sekitar nilai nol), meskipun masih terdapat variasi yang tinggi, terutama di bagian akhir grafik (sekitar Maret–April 2025), di mana terjadi penurunan yang sangat tajam (outlier negatif) yang mengindikasikan adanya kejadian ekstrem dalam pasar saham.

Secara keseluruhan, pola ini menunjukkan bahwa data IHSG setelah differencing cenderung stasioner dalam ragam dan rata-rata, namun masih memiliki nilai pencilan (outlier) pada periode tertentu. Ini sesuai dengan karakteristik pasar saham yang volatil dan terpengaruh oleh berbagai sentimen atau kebijakan. Oleh karena itu, data ini layak untuk dilakukan pemodelan dengan pendekatan deret waktu seperti ARIMA, karena asumsi kestasioneran (stationarity) telah lebih mendekati terpenuhi setelah proses differencing.

4.5 Pemeriksaan stasioneritas terhadap ragam setelah differencing

BoxCox.lambda(diff_Saham.bc)
## [1] 1

Hasil dari pemeriksaan stasioneritas terhadap ragam menggunakan Box-cox dapat diketahui bahwa nilai \(\lambda=1\) sehingga dapat dinyatakan bahwa data saham stasioner terhadap ragam.

4.6 Stasioneritas terhadap rata-rata setelah differencing

Data deret waktu yang digunakan untuk pemodelan ARIMA harus stasioner terhadap rata-rata. Pengujian hipotesis stasioneritas terhadap rata-rata dapat menggunakan statistik uji Dickey Fuller dengan hipotesis sebagai berikut.
\(H_0\) : \(\phi=1\) (data tidak stasioner terhadap rata-rata) vs
\(H_1\) : \(\phi<1\) (data stasioner terhadap rata-rata)
Taraf nyata: \(\alpha=0,05\)
Daerah penolakan: apabila nilai-p kurang dari 0,05 maka \(H_0\) ditolak yang artinya data stasioner terhadap rata-rata

adf.test(diff_Saham.bc, k = 1)
## Warning in adf.test(diff_Saham.bc, k = 1): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  diff_Saham.bc
## Dickey-Fuller = -13.307, Lag order = 1, p-value = 0.01
## alternative hypothesis: stationary

Hasil uji Dickey Fuller pada data Saham harian didapatkan nilai-p sebesar \(0,01\) yang di mana kurang dari \(\alpha=0,05\) sehinggamenghasilkan keputusan tolak \(H_0\). Dengan demikian, data mengandung akar unit (non-stasioner), dan menerima hipotesis alternatif bahwa data sudah stasioner.Dengan demikian, dapat disimpulkan bahwa data differencing IHSG (diff_Saham) sudah stasioner terhadap rata-rata, artinya nilai perubahan harian IHSG sudah berfluktuasi secara acak di sekitar nilai rata-rata nol dan tidak lagi membentuk pola tren.

5 Identifikasi Model ARIMA

Identifikasi model ARIMA dapat menggunakan plot ACF dan PACF. Nilai ACF dan PACF bertujuan untuk memilih orde \(p\) dan \(q\) pada model ARIMA. Pemeriksaan ACF dan PACF dilakukan pada data yang telah stasioner.

acf(diff_Saham.bc)

pacf(diff_Saham.bc)

Hasil analisis terhadap grafik Autocorrelation Function (ACF) dan Partial Autocorrelation Function (PACF) setelah dilakukan transformasi Box-Cox dan differencing pada data saham menunjukkan indikasi yang sesuai untuk pendekatan model ARIMA. Berdasarkan plot di atas, dua kandidat model yang dianggap paling sesuai untuk dianalisis lebih lanjut adalah ARIMA(0,1,0) sebagai model dasar tanpa komponen moving average, serta ARIMA(0,1,1) yang menambahkan elemen moving average pada struktur model. Pemilihan ini dilakukan untuk menangkap dinamika residual yang mungkin masih tersisa setelah diferensiasi pertama.

5.1 Pendugaan Parameter Model ARIMA

# Model ARIMA (order = 0, 1, 0)
arima.m1 <- arima(ts_Saham.bc, order = c(0,1,0))
# Model ARIMA (order = 0, 1, 1)
arima.m2 <- arima(ts_Saham.bc, order = c(0,1,1))
coeftest(arima.m2)
## 
## z test of coefficients:
## 
##        Estimate  Std. Error z value Pr(>|z|)
## ma1 -7.3202e-05  6.5242e-02 -0.0011   0.9991

Model ARIMA(0,1,0) tidak memiliki komponen AR maupun MA, sehingga sepenuhnya mengandalkan proses differencing untuk mencapai stasioneritas. Karena tidak ada parameter yang diestimasi, uji signifikansi (coeftest) tidak dapat dilakukan.Sebaliknya, model ARIMA(0,1,1) memiliki satu parameter MA(1), namun hasil uji menunjukkan p-value sebesar 0.9991, jauh di atas taraf signifikansi 0,05. Ini berarti parameter tersebut tidak signifikan secara statistik.Maka, model ARIMA(0,1,0) dipilih karena lebih sederhana dan parameter pada ARIMA(0,1,1) tidak memberikan kontribusi yang signifikan.

6 Pengujian Asumsi Sisaan

Langkah selanjutnya adalah melakukan pengujian asumsi sisaan yaitu autokorelasi sisaan dan normalitas sisaan. Hipotesis untuk uji autokorelasi sisaan
\(H_0\) : \(\rho_1=\rho_2=...=\rho_k=0\) (tidak terdapat autokorelasi pada sisaan) vs
\(H_1\) : minimal terdapat satu \(\rho_k \neq 0\) ( terdapat autokorelasi pada sisaan)
Taraf nyata: 0,05

Box.test(residuals(arima.m1), lag = 2, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(arima.m1)
## X-squared = 3.4973, df = 2, p-value = 0.174
Box.test(residuals(arima.m2), lag = 2, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(arima.m2)
## X-squared = 3.4971, df = 2, p-value = 0.174

Berasarkan hasil uji autokorelasi sisaan model tentatif ARIMA dengan Ljung-Box dapat diperoleh informasi bahwa nilai-p yang didapatkan \(>0,05\) sehingga \(H_0\) diterima. Dengan demikian, dapat dinyatakan bahwa tidak terdapat autokorelasi sisaan sehingga dapat dilakukan ke tahap selanjutnya yaitu uji normalitas sisaan. Uji normalitas sisaan menggunakan uji Jarque Bera dengan hipotesis sebagai berikut.
\(H_0\) : \(\epsilon_i\sim N(0, \sigma_e^{2})\) (sisaan menyebar normal) vs
\(H_1\) : \(\varepsilon\not\sim N(0, \sigma_e^2)\) (sisaan tidak menyebar normal)
Taraf nyata: 0,05

jarque.bera.test(residuals(arima.m1))
## 
##  Jarque Bera Test
## 
## data:  residuals(arima.m1)
## X-squared = 309.43, df = 2, p-value < 2.2e-16
jarque.bera.test(residuals(arima.m2))
## 
##  Jarque Bera Test
## 
## data:  residuals(arima.m2)
## X-squared = 309.42, df = 2, p-value < 2.2e-16

Pada hasil uji normalitas sisaan dengan jarque bera,dapat diketahui bahwa nilai-p yang didapatkan dari sisaan kedua model tersebut kurang dari 0,05, sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, dapat dinyatakan bahwa sisaan model tentatif ARIMA tidak menyebar normal. Akan tetapi, pada pemodelan deret waktu asumsi normalitas tidak wajib terpenuhi, sehingga model tetap layak digunakan. Berdasarkan hasil uji asumsi sisaan model, dapat diperoleh informasi bahwa kedua model ARIMA layak untuk digunakan. Setelah seluruh asumsi terpenuhi, maka dapat dilanjutkan pemilihan model terbaik dengan AIC.

7 Pemilihan Model Terbaik

arima.m1$aic
## [1] 8663.477
arima.m2$aic
## [1] 8665.477

Berdasarhan nilai AIC dari kedua model tentatif, dapat diperoleh informasi bahwa model dengan nilai AIC terkecil adalah ARIMA(0,1,0).

8 Deteksi Outlier

Berdasarkan plot data IHSG, dapat diperoleh informasi bahwa terdapat titik ekstrim pada data sehingga pada saat dilakukan pemodelan ARIMA akan terdapat outlier. Untuk mendeteksi outlier pada model ARIMA yang terpilih dapat menggunakan deteksi Additive Outlier, Innovative Outlier, Level Shif.

prediksi.arima <- ts_Saham.bc - residuals(arima.m1)
outlier <- tso(prediksi.arima, types = c("AO", "IO", "IS", "TC"))
outlier
## Series: prediksi.arima 
## Regression with ARIMA(0,1,0) errors 
## 
## Coefficients:
##            TC138       AO278       AO298
##       -1831870.2  -1480561.8  -3215109.3
## s.e.    421702.3    323427.7    458602.4
## 
## sigma^2 = 2.12e+11:  log likelihood = -4292.8
## AIC=8593.6   AICc=8593.74   BIC=8608.38
## 
## Outliers:
##   type ind  time  coefhat  tstat
## 1   TC 138 1:138 -1831870 -4.344
## 2   AO 278  2:26 -1480562 -4.578
## 3   AO 298  2:46 -3215109 -7.011
plot(outlier$effects)

Grafik di atas menampilkan hasil deteksi outlier dari fungsi tso(), yang menggambarkan seberapa besar pengaruh masing-masing jenis outlier terhadap data deret waktu saham. Sebagian besar titik memiliki efek mendekati nol, menandakan bahwa data tersebut tidak tergolong outlier dan tidak memengaruhi pola utama deret waktu.

Namun, beberapa titik menunjukkan lonjakan atau penurunan yang mencolok, mencerminkan adanya outlier signifikan seperti Additive Outlier (AO), Innovational Outlier (IO), atau Temporary Change (TC), yang dapat memengaruhi analisis jika tidak ditangani.

9 Pemodelan ARIMA dengan Outlier

xreg.outlier <- outlier$effects
arima.tc <- arima(ts_Saham.bc, order = c(0,1,0), xreg = xreg.outlier, 
                  method = "ML", include.mean = TRUE, transform.pars = FALSE)
coeftest(arima.tc)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)
## xreg -0.19021    0.12038   -1.58   0.1141

Berdasarkan hasil pemodelan ARIMA Outlier dapat diperoleh informasi bahwa terdapat salah satu parameter yang tidak signifikan namun model masih dapat digunakan karena terdapat efek outlier.

10 Uji Asumsi Model ARIMA dengan Outlier

Langkah selanjutnya adalah melakukan pengujian asumsi model ARIMA yaitu autokorelasi sisaan dan normalitas sisaan. Hipotesis untuk uji autokorelasi sisaan
\(H_0\) : \(\rho_1=\rho_2=...=\rho_k=0\) (tidak terdapat autokorelasi pada sisaan) vs
\(H_1\) : minimal terdapat satu \(\rho_k \neq 0\) ( terdapat autokorelasi pada sisaan)
Taraf nyata: 0,05

Box.test(residuals(arima.tc), lag = 2, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  residuals(arima.tc)
## X-squared = 4.4337, df = 2, p-value = 0.109

Berasarkan hasil uji autokorelasi sisaan model ARIMA Outlier LS dengan Ljung-Box dapat diperoleh informasi bahwa nilai-p yang didapatkan \(>0,05\) sehingga \(H_0\) diterima. Dengan demikian, dapat dinyatakan bahwa tidak terdapat autokorelasi sisaan sehingga dapat dilakukan ke tahap selanjutnya yaitu uji normalitas sisaan. Uji normalitas sisaan menggunakan uji Jarque Bera dengan hipotesis sebagai berikut.
\(H_0\) : \(\epsilon_i\sim N(0, \sigma_e^{2})\) (sisaan menyebar normal) vs
\(H_1\) : \(\varepsilon\not\sim N(0, \sigma_e^2)\) (sisaan tidak menyebar normal)
Taraf nyata: 0,05

jarque.bera.test(residuals(arima.tc))
## 
##  Jarque Bera Test
## 
## data:  residuals(arima.tc)
## X-squared = 307.14, df = 2, p-value < 2.2e-16

Pada hasil uji normalitas sisaan dengan jarque bera,dapat diketahui bahwa nilai-p yang didapatkan dari sisaan kedua model tersebut kurang dari 0,05, sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, dapat dinyatakan bahwa sisaan model tentatif ARIMA tidak menyebar normal. Akan tetapi, pada pemodelan deret waktu asumsi normalitas tidak wajib terpenuhi, sehingga model tetap layak digunakan. Berdasarkan hasil uji asumsi sisaan model, dapat diperoleh informasi bahwa kedua model ARIMA LS layak untuk digunakan.

11 Evaluasi Prediksi Model ARIMA dan ARIMA dengan Outlier

prediksi.arimatc <- ts_Saham.bc - residuals(arima.tc)

ggplot() + 
  geom_line(data = data.frame(Tanggal, Saham.bc), aes(x = Tanggal, y = Saham.bc), color = "blue", size = 1.2) +
  geom_line(data = data.frame(Tanggal, prediksi.arima), aes(x = Tanggal, y = prediksi.arima), color = "red", size = 1.2) +
  geom_line(data = data.frame(Tanggal, prediksi.arimatc), aes(x = Tanggal, y = prediksi.arimatc), color = "green", size = 1.2) +
  labs(title = "Plot Data dan Prediksi", x = "Tanggal", y = "Harga Saham") +
  theme_minimal()

Plot ini menunjukkan perbandingan antara data asli IHSG dan hasil prediksi dari dua jenis model ARIMA satu tanpa penyesuaian outlier, dan satu lagi yang telah disempurnakan dengan mempertimbangkan pengaruh outlier.

Dalam grafik, garis biru mewakili data IHSG sebenarnya, garis merah menunjukkan hasil prediksi dari model ARIMA standar, dan garis hijau menunjukkan hasil prediksi dari model ARIMA yang sudah disesuaikan dengan outlier. Terlihat bahwa garis merah sering menyimpang dari data asli, terutama pada saat terjadi lonjakan atau penurunan tajam. Hal ini menunjukkan bahwa model awal belum cukup akurat dalam menangkap perubahan mendadak pada data.

Sementara itu, garis hijau tampak mengikuti pergerakan data asli dengan lebih baik. Ini menunjukkan bahwa menambahkan informasi tentang outlier ke dalam model membantu meningkatkan akurasi prediksi. Dengan demikian, penyesuaian terhadap outlier terbukti memberikan dampak positif dan membuat model lebih andal dalam memprediksi pergerakan IHSG.

12 Peramalan

Setelah mendapatkan model ARIMA terbaik, langkah selanjutnya adalah melakukan peramalan. Peramalan dilakukan untuk 30 periode.

peramalan <- forecast(ts_Saham.bc, model = arima.m1, h = 30)

# Fungsi Invers Transformasi Box-Cox
inv_BoxCox <- function(x, lambda) {
  if (lambda == 0) exp(x) else (lambda * x + 1)^(1/lambda)
}

peramalan$mean <- inv_BoxCox(peramalan$mean, lambda)
peramalan$lower <- inv_BoxCox(peramalan$lower, lambda)
peramalan$upper <- inv_BoxCox(peramalan$upper, lambda)

# Data untuk Plot Peramalan
df <- data.frame(Hari = 1:(length(Saham) + 30), 
                 Saham = c(Saham, peramalan$mean))

ribbon <- data.frame(Hari = (length(Saham) + 1):(length(Saham) + 30), 
                     lower = peramalan$lower[,2], 
                     upper = peramalan$upper[,2])

# Plot Forecast Saham 
ggplot() + 
  # Plot Data Saham Aktual
  geom_line(data = df, aes(x = Hari, y = Saham), color = "black", size = 1.5, alpha = 0.8) + 
  
  # Plot Interval Prediksi
  geom_ribbon(data = ribbon, aes(x = Hari, ymin = lower, ymax = upper), 
              fill = "#4682B4", alpha = 0.2) +  # Gunakan warna biru yang lebih elegan
  
  # Garis Tren (Forecast Mean)
  geom_line(data = df, aes(x = Hari, y = Saham), color = "#FF6347", size = 1.5, alpha = 1) +  # Garis Tren berwarna merah
  
  # Titik Data Prediksi
  geom_point(data = df, aes(x = Hari, y = Saham), color = "#FF6347", size = 3, alpha = 0.6) + 
  
  # Labels dan Judul
  labs(title = "Peramalan Harga Saham (30 Hari Ke Depan)", 
       x = "Hari ke-", 
       y = "Harga Saham",
       subtitle = "Interval Prediksi dengan Confidence Interval 95%") +
  
  # Tema dan Tampilan
  theme_minimal(base_size = 14) + 
  theme(
    plot.title = element_text(hjust = 0.5, size = 18, face = "bold", color = "#2F4F4F"),  # Warna dan ukuran judul
    plot.subtitle = element_text(hjust = 0.5, size = 12, color = "#2F4F4F"),
    axis.title = element_text(size = 14, face = "bold", color = "#2F4F4F"),
    axis.text = element_text(size = 12, color = "#2F4F4F"),
    panel.grid.major = element_line(color = "#D3D3D3", size = 0.5),  # Grid utama berwarna abu-abu
    panel.grid.minor = element_line(color = "#E8E8E8", size = 0.3),  # Grid minor lebih halus
    legend.position = "none"
  ) +
  
  # Tambahkan garis vertikal untuk memperjelas perbedaan antara data aktual dan prediksi
  geom_vline(xintercept = length(Saham), linetype = "dashed", color = "#2F4F4F", size = 1.2) + 
  annotate("text", x = length(Saham) + 3, y = max(df$Saham) * 0.95, label = "Forecast Period", color = "#2F4F4F", size = 4)
## Warning: The `size` argument of `element_line()` is deprecated as of ggplot2 3.4.0.
## ℹ Please use the `linewidth` argument instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.

Plot yang ditampilkan menggambarkan hasil peramalan Indeks Harga Saham Gabungan (IHSG) untuk 30 hari ke depan menggunakan model ARIMA berdasarkan data historis. Garis merah menunjukkan data IHSG aktual hingga hari ke-298, sedangkan area berwarna biru muda menggambarkan hasil prediksi beserta rentang ketidakpastian (interval kepercayaan 95%).

Menjelang akhir periode data historis, IHSG terlihat mengalami penurunan secara bertahap. Setelah itu, hasil prediksi menunjukkan bahwa pergerakan IHSG cenderung stabil atau sedikit menurun. Garis tengah (mean forecast) menggambarkan tren yang mendatar, tanpa perubahan tajam. Sementara itu, interval kepercayaan yang semakin melebar ke depan menandakan bahwa ketidakpastian prediksi meningkat seiring bertambahnya waktu.

Secara keseluruhan, IHSG diperkirakan akan bergerak di kisaran 5800 hingga 6400, dengan nilai rata-rata mendekati 6100. Hal ini mencerminkan kondisi pasar yang relatif stabil dalam jangka pendek, tanpa indikasi perubahan besar.