Tugas 1 Praktikum Metode Peramalan - Penerapan Analisis Deret Waktu terhadap Data IHSG: Dari Eksplorasi hingga Peramalan

Felix Martin Sihotang

30/04/2025

1 Library yang Dibutuhkan

> library(rmarkdown)
> library(readxl)
> library(xts)
> library(tseries)
> library(lmtest)
> library(forecast)

2 Import Data

Dataset yang digunakan dalam analisis ini memuat data historis Indeks Harga Saham Gabungan (IHSG) Indonesia dari Januari 2024 hingga April 2025. Data ini mencerminkan dinamika pasar modal nasional melalui variabel kuantitatif seperti harga penutupan harian IHSG yang dapat digunakan dalam analisis statistik deret waktu. Tujuan utama dari penggunaan dataset ini adalah untuk mengidentifikasi pola, tren, dan karakteristik musiman dalam pergerakan IHSG serta membangun model peramalan yang akurat untuk mendukung pengambilan keputusan di bidang keuangan dan investasi.

> # Import Data
> Data_IHSG <- read_excel("C:/Main Storage/Data/Data IHSG.xlsx")
> paged_table(Data_IHSG)

3 Eksplorasi Data

Langkah pertama sebelum melakukan analisis deret waktu adalah mengeksplorasi data untuk mengidentifikasi pola yang ada dalam data tersebut.

> # Definisi Variabel
> Data_IHSG$Tanggal <- as.Date(Data_IHSG$Tanggal)
> IHSG <- xts(Data_IHSG$`Harga Saham`, order.by = Data_IHSG$Tanggal)
> head(IHSG)
              [,1]
2024-01-02 7323.59
2024-01-03 7279.09
2024-01-04 7359.76
2024-01-05 7350.62
2024-01-08 7283.58
2024-01-09 7200.20
> 
> # Plot Data
> plot(IHSG, main = "Pergerakan IHSG", ylab = "Nilai IHSG", xlab = "Tanggal", col = "blue", major.ticks = "months", grid.ticks.on = "months")

Berdasarkan plot pergerakan IHSG dari 2 Januari 2024 hingga 9 April 2025, terlihat bahwa indeks mengalami fluktuasi yang cukup signifikan dengan pola yang mencerminkan volatilitas pasar. Terdapat tren penurunan yang jelas mulai sekitar pertengahan September 2024 hingga April 2025, menandakan adanya tekanan jual atau sentimen negatif yang kuat dalam periode tersebut. Seperti pada contoh kasus pengesahan RUU TNI pada tanggal 20 Maret 2025, pergerakan IHSG mengindikasikan adanya penurunan. Oleh karena itu akan dibuat model untuk dilakukan peramalan terhadap data IHSG untuk membantu investor dalam mengambil keputusan dalam berinvestasi.

4 Uji Stasioneritas

4.1 Uji Stasioneritas Terhadap Ragam

> # Uji Stasioneritas Terhadap Ragam
> IHSG_ujiragam <- min(IHSG)+1
> BoxCox.lambda(IHSG_ujiragam)
[1] 1

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

4.2 Uji 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.

> # Uji Stasioneritas Terhadap Rata-rata
> adf.test(IHSG, k = 1)

    Augmented Dickey-Fuller Test

data:  IHSG
Dickey-Fuller = -0.78673, Lag order = 1, p-value = 0.9621
alternative hypothesis: stationary

Hasil uji Dickey Fuller pada data IHSG didapatkan nilai-p sebesar \(0,9621\) yang di mana lebih dari \(\alpha=0,05\) sehingga menghasilkan keputusan gagal menolak \(H_0\). Dengan demikian, dilakukan langkah lebih lanjut yaitu differencing data untuk mencapai stasioneritas.

> # Differencing Pertama
> IHSG_1 <- diff(IHSG)
> adf.test(na.omit(IHSG_1), k = 1)

    Augmented Dickey-Fuller Test

data:  na.omit(IHSG_1)
Dickey-Fuller = -13.487, Lag order = 1, p-value = 0.01
alternative hypothesis: stationary

Hasil uji Dickey Fuller pada data IHSG didapatkan nilai-p sebesar \(0,01\) yang di mana kurang dari \(\alpha=0,05\) sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, data IHSG differencing pertama telah stasioner terhadap rata-rata.

5 Identifikasi Model

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.

> # Identifikasi Model
> IHSG_baru <- na.omit(IHSG_1)
> acf(IHSG_baru)

> pacf(IHSG_baru)

Berdasarkan hasil analisis plot ACF dan PACF terhadap data IHSG yang telah melalui differencing satu kali, ditemukan bahwa lag ke-2, 10, dan 19 menunjukkan signifikansi pada kedua plot, sedangkan lag ke-7 hanya signifikan pada ACF. Hal ini mengindikasikan bahwa lag ke-2, 10, dan 19 lebih tepat dimasukkan ke dalam komponen autoregressive (AR), sementara lag ke-7 lebih sesuai untuk dimasukkan ke dalam komponen moving average (MA). Pola keterkaitan antar lag yang tidak berurutan ini menunjukkan bahwa model ARIMA yang digunakan sebaiknya merupakan model terbatas (restricted), yang hanya memasukkan lag-lag tertentu yang signifikan. Dengan demikian, dua model yang dapat dipertimbangkan adalah ARIMA([2,10,19],1,0) jika komponen AR lebih dominan, dan ARIMA(0,1,[2,7,10,19]) jika komponen MA lebih berpengaruh. Pemilihan model terbaik didasarkan pada nilai AIC/BIC serta pengujian terhadap residual.

6 Pendugaan Parameter dan Uji Signifikansi

> # Pendugaan Parameter dan Uji Signifikansi
> arima.1 <- arima(IHSG_baru, order = c(19,1,0),
+                   fixed = c(0, NA, rep(0, 7), NA, rep(0, 8), NA),
+                   method = "ML", include.mean = TRUE)
> coeftest(arima.1)

z test of coefficients:

      Estimate Std. Error z value  Pr(>|z|)    
ar2  -0.137257   0.059806 -2.2950  0.021731 *  
ar10  0.245824   0.062317  3.9447 7.988e-05 ***
ar19 -0.196354   0.063377 -3.0982  0.001947 ** 
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> arima.2 <- arima(IHSG_baru, order = c(0,1,19),
+                  fixed = c(0, NA, rep(0,4), NA, rep(0,2), NA, rep(0,8), NA),
+                  method = "ML", include.mean = TRUE)
> coeftest(arima.2)

z test of coefficients:

      Estimate Std. Error z value Pr(>|z|)   
ma2  -0.108537   0.056120 -1.9340  0.05311 . 
ma7  -0.121449   0.061971 -1.9598  0.05002 . 
ma10  0.121351   0.064878  1.8705  0.06142 . 
ma19 -0.197159   0.068835 -2.8642  0.00418 **
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan hasil pendugaan parameter dari kedua model ARIMA tersebut, dapat diketahui bahwa seluruh parameter dari model ARIMA([2,10,19],1,0) signifikan sehingga model tersebut lebih baik daripada model ARIMA(0,1,[2,7,10,19]) yang hanya signifikan pada parameter ma19, namun untuk menentukan model terbaik perlu dilakukan diagnostik residual dan perbandingan nilai AIC/BIC.

7 Pengujian Asumsi

Langkah selanjutnya adalah melakukan pengujian asumsi sisaan yaitu autokorelasi sisaan dan normalitas sisaan.

7.1 Uji Autokorelasi 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

> # Uji Autokorelasi Sisaan
> resid.arima1 <- residuals(arima.1)
> resid.arima2 <- residuals(arima.2)
> 
> Box.test(resid.arima1, lag=24, type = c('Ljung-Box'))

    Box-Ljung test

data:  resid.arima1
X-squared = 93.958, df = 24, p-value = 3.158e-10
> 
> Box.test(resid.arima2, lag=24, type = c('Ljung-Box'))

    Box-Ljung test

data:  resid.arima2
X-squared = 99.338, df = 24, p-value = 3.895e-11

Berasarkan hasil uji autokorelasi sisaan model tentatif ARIMA dengan Ljung-Box dapat diperoleh informasi bahwa nilai-p yang didapatkan \(<0,05\) sehingga menghasilkan keputusan tolak \(H_0\). Menunjukkan bahwa sisaan model tentatif ARIMA terdapat autokorelasi.

7.2 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

> # Uji Normalitas Sisaan
> jarque.bera.test(resid.arima1)

    Jarque Bera Test

data:  resid.arima1
X-squared = 106.43, df = 2, p-value < 2.2e-16
> jarque.bera.test(resid.arima2)

    Jarque Bera Test

data:  resid.arima2
X-squared = 129.84, 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 \(<0,05\), sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, dapat dinyatakan bahwa sisaan model tentatif ARIMA tidak menyebar normal.

8 Pemilihan Model Terbaik

> # Perbandingan AIC Model
> arima.1$aic
[1] 3585.97
> arima.2$aic
[1] 3593.877

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

9 Evaluasi Model

Namun karena model tersebut memiliki sisaan yang autokorelasi dan tidak menyebar normal, maka tidak dapat digunakan sebagai alat untuk meramalkan data, oleh karena itu dicari model lain yang lebih optimal menggunakan fungsi \(auto.arima()\)

9.1 Identifikasi Model

> # Evaluasi Model
> auto.arima(IHSG, seasonal = FALSE)
Series: IHSG 
ARIMA(0,1,0) 

sigma^2 = 5758:  log likelihood = -1707.19
AIC=3416.38   AICc=3416.4   BIC=3420.08

Berdasarkan output tersebut, didapat model yang dapat digunakan adalah ARIMA(0,1,0).

9.2 Pendugaan Parameter

> arima.terbaik <- Arima(IHSG, order = c(0,1,0), include.drift = TRUE, method = "ML")
> summary(arima.terbaik)
Series: IHSG 
ARIMA(0,1,0) with drift 

Coefficients:
        drift
      -4.5489
s.e.   4.3952

sigma^2 = 5757:  log likelihood = -1706.66
AIC=3417.32   AICc=3417.36   BIC=3424.7

Training set error measures:
                     ME     RMSE      MAE         MPE      MAPE      MASE
Training set 0.02459106 75.61983 54.74815 -0.01114481 0.7776856 0.9996663
                     ACF1
Training set -0.006300541

Model ini merupakan model random walk dengan drift, yang berarti perubahan nilai IHSG tidak sepenuhnya acak, melainkan memiliki kecenderungan rata-rata perubahan sebesar -4.5489 setiap periode waktu.

9.3 Uji Asumsi Sisaan

> resid.arima.T <- residuals(arima.terbaik)
> Box.test(resid.arima.T, lag=2, type = c('Ljung-Box'))

    Box-Ljung test

data:  resid.arima.T
X-squared = 4.4736, df = 2, p-value = 0.1068

Berasarkan hasil uji autokorelasi sisaan model ARIMA dengan Ljung-Box dapat diperoleh informasi bahwa nilai-p yang didapatkan \(>0,05\) sehingga menghasilkan keputusan gagal tolak \(H_0\). Menunjukkan bahwa sisaan model tentatif ARIMA tidak terdapat autokorelasi.

> jarque.bera.test(resid.arima.T)

    Jarque Bera Test

data:  resid.arima.T
X-squared = 676.99, 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 \(<0.05\), sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, dapat dinyatakan bahwa sisaan model 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.

10 Peramalan

Setelah mendapatkan model ARIMA terbaik, langkah selanjutnya adalah melakukan peramalan hingga akhir bulan Mei 2025. Peramalan dilakukan untuk 37 periode.

> # Peramalan
> peramalan <- forecast(IHSG, model = arima.terbaik, h = 37)
> peramalan$mean
Time Series:
Start = 299 
End = 335 
Frequency = 1 
 [1] 5968.011 5963.462 5958.913 5954.364 5949.815 5945.266 5940.718 5936.169
 [9] 5931.620 5927.071 5922.522 5917.973 5913.424 5908.875 5904.326 5899.777
[17] 5895.228 5890.679 5886.130 5881.582 5877.033 5872.484 5867.935 5863.386
[25] 5858.837 5854.288 5849.739 5845.190 5840.641 5836.092 5831.543 5826.994
[33] 5822.446 5817.897 5813.348 5808.799 5804.250
> # Data Peramalan hingga Akhir Mei 2025
> forecast_values <- as.numeric(peramalan$mean)
> 
> start_date <- as.Date("2025-04-10")
> tanggal_prediksi <- seq(start_date, by = "day", length.out = 100)
> tanggal_prediksi <- tanggal_prediksi[!weekdays(tanggal_prediksi) %in% c("Saturday", "Sunday")]
> tanggal_prediksi <- tanggal_prediksi[1:37]
> 
> hasil <- data.frame(
+   Tanggal = tanggal_prediksi,
+   Forecast = forecast_values
+ )
> 
> paged_table(hasil)

Berdasarkan hasil peramalan, dapat diketahui bahwa prediksi data dengan model ARIMA ini mengikuti pola tren menurun dari data aktual terakhir. Sehingga model ini hanya memprediksi hasil yang menurun dan kemungkinan besar model yang digunakan kurang tepat.