Indeks Harga Saham Gabungan (IHSG) merupakan salah satu indeks pasar saham yang digunakan oleh Bursa Efek Indonesia. Setiap hari IHSG mengalami fluktuasi secara tidak pasti dan menjadikan kegiatan perdagangan saham beresiko tinggi. Fluktuasi yang tinggi pada data IHSG kemungkinan besar akan memiliki nilai pencilan. Pada beberapa hari terakhir, terdapat kebijakan pemerintah yang ramai dan menimbulkan sentimen negative sehingga membuat saham-saham di Indonesia menjadi anjlok termasuk IHSG. Kebijakan pemerintah tersebut adalah pengesahan RUU TNI yang disahkan pada tanggal 20 Maret 2025. Semenjak RUU TNI disahkan, nilai IHSG mengalami penurunan dan pada awal bulan April 2025 mengalami penurunan yang sangat tinggi. Berdasarkan karakteristik dari data IHSG yang selalu mengalami perubahan perlu dilakukan peramalan. Peramalan pada data close price IHSG dapat membantu investor dalam mengambil keputusan dalam berinvestasi.
Berdasarkan permasalahan pada data IHSG terdapat beberapa pertanyaan yang ditetapkan adalah
1. Model deret waktu manakah yang sesuai untuk permasalahan tersebut?
2.  Bagaiman kemampuan model deret waktu yang ditetapkan dalam memodelkan data IHSG?
3.  Bagaimana hasil peramalan dengan model deret waktu pada kasus data IHSG?
Data_IHSG <- read_excel("C:/Users/IKHSAN/Downloads/Data IHSG.xlsx")
harga <- Data_IHSG$`Harga Saham`
tanggal <- Data_IHSG$Tanggal
plot(tanggal, harga, type = "o", col = "blue", lwd = 2,
main = "Plot Harga Saham Harian IHSG",
xlab = "Tanggal", ylab = "Harga Saham")
outlier <- c(tanggal[137], tanggal[277], tanggal[289], tanggal[297])
abline(v = outlier , col = "red", lty = 3, lwd = 1.5)
Pembahasan: Data IHSG menunjukkan fluktuasi signifikan sepanjang periode pengamatan. Penurunan tajam terjadi pada titik-titik tertentu yang diasumsikan sebagai outlier akibat sentimen negatif pasar.
BoxCox.lambda(harga)
## [1] 1.999924
harga_trans <- harga^2
BoxCox.lambda(harga_trans)
## [1] 1.980826
adf.test(harga, k = 1)
##
## Augmented Dickey-Fuller Test
##
## data: harga
## Dickey-Fuller = -0.78673, Lag order = 1, p-value = 0.9621
## alternative hypothesis: stationary
diff_harga <- diff(harga)
adf.test(diff_harga)
## Warning in adf.test(diff_harga): p-value smaller than printed p-value
##
## Augmented Dickey-Fuller Test
##
## data: diff_harga
## Dickey-Fuller = -7.5443, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
Pembahasan: Transformasi Box-Cox menghasilkan lambda mendekati 2, menandakan ketidakstasioneran terhadap ragam. Uji ADF menunjukkan bahwa data asli tidak stasioner, namun menjadi stasioner setelah differencing satu kali.
acf(diff_harga)
pacf(diff_harga)
Pembahasan: Plot ACF dan PACF menunjukkan pola signifikan pada lag ke-1 dan ke-2. Model kandidat yang diuji adalah ARIMA(1,1,1) dan ARIMA(2,1,2).
arima1 <- arima(harga, order = c(1,1,1))
arima2 <- arima(harga, order = c(2,1,2))
coeftest(arima1)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 -0.65360 0.23356 -2.7984 0.005136 **
## ma1 0.70835 0.21561 3.2854 0.001019 **
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
coeftest(arima2)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.841665 0.034149 24.647 < 2.2e-16 ***
## ar2 -0.911340 0.030544 -29.837 < 2.2e-16 ***
## ma1 -0.956037 0.023423 -40.816 < 2.2e-16 ***
## ma2 0.993144 0.042041 23.623 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Pembahasan: Model ARIMA(2,1,2) memberikan hasil estimasi parameter yang signifikan dan lebih stabil dibandingkan ARIMA(1,1,1).
resid1 <- residuals(arima1)
resid2 <- residuals(arima2)
Box.test(resid1, lag = 2, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: resid1
## X-squared = 3.2697, df = 2, p-value = 0.195
Box.test(resid2, lag = 2, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: resid2
## X-squared = 3.0242, df = 2, p-value = 0.2204
jarque.bera.test(resid1)
##
## Jarque Bera Test
##
## data: resid1
## X-squared = 648.83, df = 2, p-value < 2.2e-16
jarque.bera.test(resid2)
##
## Jarque Bera Test
##
## data: resid2
## X-squared = 437.53, df = 2, p-value < 2.2e-16
Pembahasan: Hasil uji Ljung-Box menunjukkan tidak ada autokorelasi pada sisaan. Namun, uji Jarque-Bera menolak normalitas sisaan. Karena ARIMA tidak mensyaratkan normalitas, model tetap dapat digunakan.
AIC(arima1)
## [1] 3418.922
AIC(arima2)
## [1] 3406.847
Pembahasan: Model ARIMA(2,1,2) dipilih karena memiliki nilai AIC yang lebih kecil.
prediksi <- fitted(arima2)
outlier_arima <- tso(prediksi, types = c("AO", "IO", "IS", "TC"))
plot(outlier_arima$effects)
n <- length(harga)
xreg_outlier <- matrix(0, nrow = n, ncol = 4)
colnames(xreg_outlier) <- c("TC138", "AO278", "IO290", "AO298")
xreg_outlier[138, "TC138"] <- 1
xreg_outlier[278, "AO278"] <- 1
xreg_outlier[290, "IO290"] <- 1
xreg_outlier[298, "AO298"] <- 1
arima_outlier <- Arima(harga, order = c(2,1,2),
xreg = xreg_outlier,
method = "ML", include.mean = TRUE)
summary(arima_outlier)
## Series: harga
## Regression with ARIMA(2,1,2) errors
##
## Coefficients:
## ar1 ar2 ma1 ma2 TC138 AO278 IO290 AO298
## 0.6809 -0.9478 -0.7394 0.8961 -6.8997 207.0423 -22.7585 -4.4131
## s.e. 0.0508 0.0432 0.0611 0.0566 52.3483 53.1546 53.0738 77.2646
##
## sigma^2 = 5350: log likelihood = -1692.59
## AIC=3403.18 AICc=3403.81 BIC=3436.42
##
## Training set error measures:
## ME RMSE MAE MPE MAPE MASE
## Training set -4.67011 72.02947 53.17007 -0.07620864 0.7530909 0.9708515
## ACF1
## Training set 0.1031748
coeftest(arima_outlier)
##
## z test of coefficients:
##
## Estimate Std. Error z value Pr(>|z|)
## ar1 0.680920 0.050757 13.4153 < 2.2e-16 ***
## ar2 -0.947795 0.043220 -21.9294 < 2.2e-16 ***
## ma1 -0.739390 0.061059 -12.1095 < 2.2e-16 ***
## ma2 0.896059 0.056594 15.8331 < 2.2e-16 ***
## TC138 -6.899677 52.348294 -0.1318 0.8951
## AO278 207.042260 53.154575 3.8951 9.816e-05 ***
## IO290 -22.758546 53.073808 -0.4288 0.6681
## AO298 -4.413109 77.264634 -0.0571 0.9545
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Pembahasan: Outlier yang terdeteksi dimasukkan sebagai variabel dummy ke dalam model. Hanya AO pada titik 278 yang signifikan. Model ARIMA outlier memberikan penyesuaian yang lebih baik.
resid_outlier <- residuals(arima_outlier)
Box.test(resid_outlier, lag = 2, type = "Ljung-Box")
##
## Box-Ljung test
##
## data: resid_outlier
## X-squared = 3.4408, df = 2, p-value = 0.179
jarque.bera.test(resid_outlier)
##
## Jarque Bera Test
##
## data: resid_outlier
## X-squared = 413.89, df = 2, p-value < 2.2e-16
Pembahasan: Hasil uji menunjukkan bahwa sisaan dari model ARIMA outlier tidak memiliki autokorelasi, namun tidak berdistribusi normal. Namun model tetap valid.
prediksi_outlier <- harga - resid_outlier
plot(tanggal, harga, type = "l", col = "blue", lwd = 2)
lines(tanggal, prediksi, col = "red", lwd = 2)
lines(tanggal, prediksi_outlier, col = "green", lwd = 2)
legend("topright", legend = c("Harga Saham Aktual", "Prediksi ARIMA", "Prediksi ARIMA Outlier"),
col = c("blue", "red", "green"), lty = 1)
Pembahasan: Model ARIMA dengan outlier mengikuti pola data aktual lebih akurat dibanding model ARIMA biasa.
xreg_future <- matrix(0, nrow = 31, ncol = 4)
colnames(xreg_future) <- c("TC138", "AO278", "IO290", "AO298")
forecast_result <- forecast(arima_outlier, xreg = xreg_future, h = 31)
plot(forecast_result)
Pembahasan: Hasil peramalan 31 hari menunjukkan pola harga saham yang cenderung stabil. Model menunjukkan performa baik untuk prediksi jangka pendek.
Kesimpulan: 1. Data IHSG awalnya tidak stasioner, tetapi menjadi stasioner setelah differencing. 2. Model terbaik berdasarkan AIC dan signifikansi parameter adalah ARIMA(2,1,2). 3. Penambahan variabel outlier meningkatkan akurasi prediksi.
Saran: - Gunakan analisis ARIMA dengan deteksi outlier untuk data pasar modal. - Kombinasikan analisis teknikal dengan faktor fundamental agar hasil peramalan lebih akurat.