IMPOR LIBRARY

library(knitr)
library(readxl)
library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(lmtest)
## Loading required package: zoo
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
library(forecast)
library(stats)

IMPOR DATA

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.

library(readxl)
Data_IHSG <- read_excel("C:/Users/LENOVO/Downloads/Data IHSG.xlsx", 
                        sheet = "Sheet1", col_types = c("skip", 
                                                        "date", "numeric"))
head(Data_IHSG)
## # A tibble: 6 × 2
##   Tanggal             `Harga Saham`
##   <dttm>                      <dbl>
## 1 2024-01-02 00:00:00         7324.
## 2 2024-01-03 00:00:00         7279.
## 3 2024-01-04 00:00:00         7360.
## 4 2024-01-05 00:00:00         7351.
## 5 2024-01-08 00:00:00         7284.
## 6 2024-01-09 00:00:00         7200.

EKSPLORASI DATA DERET WAKTU

Statistika Deskriptif

Saham <-Data_IHSG$`Harga Saham`
Tanggal <-Data_IHSG$Tanggal
summary(Saham)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    5973    7080    7235    7197    7351    7905
sd(Saham,na.rm = TRUE)
## [1] 342.6589

Data IHSG menunjukkan bahwa harga saham terendah selama periode pengamatan adalah 5972.56 yang terjadi pada akhir periode 9 April 2025, sedangkan harga saham tertinggi tercatat selama periode pengamatan adalah 7905.39 yang terjadi pada pertengahan periode yaitu 19 September 2024. Rata-rata harga saham dalam periode tersebut adalah 7197 yang menunjukkan bahwa secara umum, harga saham berada di kisaran menengah antara nilai minimum dan maksimum. Nilai standar deviasi sebesar 342.6589 menunjukkan bahwa fluktuasi harga saham tidak terlalu tinggi, masih relatif stabil yaitu sekitar ±4,7% dari rata-rata.

Visualisasi Data

plot(Data_IHSG, type = "o", col = "blue", lwd = 2)

Grafik pergerakan harga saham IHSG dari Januari 2024 hingga April 2025 menunjukkan pola fluktuatif dengan tren umum yang menurun di akhir periode. Pada awal 2024, harga saham relatif stabil di kisaran 7200–7400, kemudian sempat mengalami penurunan pada pertengahan tahun sebelum naik tajam hingga mencapai puncaknya di atas 7900 sekitar September 2024. Setelah itu, terjadi penurunan bertahap yang berlanjut hingga awal 2025, diikuti oleh penurunan tajam menjelang April 2025, di mana harga saham mencapai titik terendah sekitar 5972.56. Pola ini menggambarkan adanya gejolak pasar yang meningkat menjelang akhir periode pengamatan, yang juga tercermin dalam nilai standar deviasi yang masih relatif stabil.

UJI STASIONERITAS

Stasioneritas terhadap Ragam

Uji stasioneritas terhadap ragam dapat dilakukan dengan menggunakan uji Box-Cox. Data deret waktu dikatakan stasioner terhadap ragam jika nilai parameter λ mendekati nilai 1 atau bernilai 1 pada selang kepercayaan 95%.

Hipotesis :

H0 : λ = 1 atau mendekati satu (data tidak memerlukan transformasi artinya data sudah stasioner terhadap ragam) vs

H1 : λ ≠ 1 atau tidak mendekati satu (data memerlukan transformasi artinya data belum stasioner terhadap ragam)

lambda<-BoxCox.lambda(Data_IHSG)
print(lambda)
## [1] 1

Keputusan :

λ = 1 , maka H0 diterima.

Kesimpulan :

Dengan tingkat kepercayaan 95% dapat disimpulkan bahwa data tidak memerlukan transformasi Box-cox karena data sudah stasioner terhadap ragam.

Stasioneritas terhadap Rata-rata

Uji stasioneritas terhadap rata-rata dapat dilakukan dengan menggunakan uji Augmented Dickey-Fuller (ADF). Data deret waktu dikatakan stasioner terhadap rata-rata jika p-value < 0,05 pada selang kepercayaan 95%.

Hipotesis:

H0: Data tidak stasioner terhadap rata-rata vs

H1: Data stasioner terhadap rata-rata

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

Didapatkan p-value masih lebih besar dari 0.05, maka perlu dilakukan diferensiasi data

differenced_data<-diff(Data_IHSG$`Harga Saham`)
print(differenced_data)
##   [1]  -44.50   80.67   -9.14  -67.04  -83.38   27.10   -7.34   21.18  -17.14
##  [10]   18.79  -42.16   52.34  -25.57   20.53    8.30  -28.41  -49.78  -40.95
##  [19]   20.08   35.05   15.72   -6.24   37.09  -40.17   48.79  -12.26   62.52
##  [28]  -87.93   93.54   32.26  -38.84   55.90   -3.58   -9.38  -44.54  -11.28
##  [37]    1.50   43.32  -12.53   -4.20  -35.16  -29.29   82.34   44.16    7.95
##  [46]   39.30   12.10 -105.26  -25.60   34.30   -5.62    7.22   11.80   27.61
##  [55]  -12.10  -55.57  -21.28  -83.75   31.92  -70.14   87.56   32.48 -122.07
##  [64]  -33.97   35.97  -79.49  -13.50   36.99   63.72  -19.24 -119.21  119.70
##  [73]   78.42    0.00 -116.78   17.30    1.17  -12.28  -34.82   10.47  -15.50
##  [82]   96.07   66.87   70.54  -50.55  -80.65   36.34  -45.96   77.21 -113.40
##  [91] -106.09  -63.40   65.45   63.12 -151.64   27.23  -76.95   23.60  -65.86
## [100]   -5.59  -18.54  -96.73   -7.91   92.40   60.66    9.19   -6.47   22.94
## [109]   62.31   95.63   76.05  -14.49   71.61   24.14   32.48   -2.39   18.82
## [118]   17.24   13.37   27.17  -48.72  -54.57   -0.07   96.85  -26.57   27.48
## [127]   -8.12  -51.10  -22.48   47.89    0.73  -47.04   13.90   70.22  -17.86
## [136] -248.47   69.56   82.92  -17.01   61.88   40.63   59.01   79.40  -26.54
## [145]   22.59   34.74   67.15   20.61  -65.91   55.62   61.89   -8.31   61.00
## [154]  -31.28   43.13   23.80  -78.01   56.38    8.14   40.81  -19.11   58.65
## [163]   -0.43   37.19   13.98   19.65   -2.65   76.26 -162.39   32.73    2.76
## [172]  -37.59    3.62  -47.60 -168.99  114.20  -78.87  -19.43  -47.74    8.04
## [181]   53.01  -55.85  -21.21   40.52   39.05   67.30   21.99   86.10   25.02
## [190]   12.54   16.38   -1.42  -71.01  -21.89  -60.03  -28.03  -36.75    4.17
## [199]  -68.76  -25.76   12.43 -108.06 -140.01   43.33  -20.73   55.53  -13.32
## [208]  -94.11  -53.30  -26.98   61.43  -15.38  -39.42   54.65  118.55  -68.22
## [217]  -45.73  -85.89  -67.28  149.03  130.74  -13.45   69.48   54.94   15.56
## [226]   11.46  -70.51  -69.45  -66.16 -100.90  -49.85 -130.64    6.63  112.57
## [235]  -30.69  -29.18   43.33   83.31    1.22  -83.96    2.81   -2.93  -15.76
## [244]   24.28  -71.99  -60.21  122.89   27.96   47.14   16.08   11.08   75.31
## [253]  -24.49  -66.58  -92.58   35.72  -79.14   43.40  -49.23 -148.69 -132.96
## [262]  -94.44 -116.15  113.79  -32.21   24.89  192.42   42.67  -78.68   -6.83
## [271]   14.96  -53.40 -162.51   19.09 -120.73 -214.85  249.06 -139.26  151.00
## [280]   86.45   18.15  -37.79  -52.36  119.19  -17.62 -131.79  -43.68 -248.56
## [289]   88.27   70.01 -123.49  -96.96   74.40  236.74   38.26 -514.48  -23.58
adf.test(differenced_data, k=1)
## Warning in adf.test(differenced_data, k = 1): p-value smaller than printed
## p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  differenced_data
## Dickey-Fuller = -13.487, Lag order = 1, p-value = 0.01
## alternative hypothesis: stationary

Keputusan :

p-value < 0,05, maka H0 ditolak.

Kesimpulan :

Dengan tingkat kepercayaan 95% dapat disimpulkan bahwa data stasioner terhadap rata-rata.

IDENTIFIKASI MODEL

Berdasarkan hasil uji sebelumnya yang menunjukkan bahwa data telah bersifat stasioner baik itu terhadap ragam dan rata-rata, dilanjutkan dengan melakukan 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.

acf(differenced_data)

pacf(differenced_data)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 1, sehingga jika plot PACF dianggap tails off, maka model tentatifnya adalah ARIMA (0,1,1) sedangkan untuk plot PACF terlihat bahwa cenderung cuts off pada lag ke 2, sehingga jika plot ACF dianggap tails off, maka model tentatifnya adalah ARIMA (2,1,0).

PENDUGAAN PARAMETER DAN UJI SIGNIFIKANSI

Setelah dilakukan proses identifikasi model dan didapatkan model tentatif maka langkah selanjutnya dapat dilakukan pendugaan parameter.

arima1 <- arima(differenced_data, order = c(0,1,1), method = 'ML', include.mean = TRUE)
coeftest(arima1)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.989753   0.012451 -79.493 < 2.2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
arima2 <- arima(differenced_data, order = c(2,1,0), method = 'ML', include.mean = TRUE)
coeftest(arima2)
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value  Pr(>|z|)    
## ar1 -0.645656   0.053773 -12.0072 < 2.2e-16 ***
## ar2 -0.426538   0.056411  -7.5612 3.992e-14 ***
## ---
## 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 kedua model ARIMA tersebut signifikan sehingga model tersebut dapat digunakan.

UJI ASUMSI

Autokorelasi Residual

Hipotesis :

\[ H0 : ρ_1=ρ_2=⋯=ρ_k=0 \hspace{0.1cm}(tidak \hspace{0.1cm}terdapat \hspace{0.1cm}autokorelasi \hspace{0.1cm}pada \hspace{0.1cm}sisaan) \\H1 : minimal \hspace{0.1cm}terdapat \hspace{0.1cm}satu \hspace{0.1cm}ρ_k≠0 \hspace{0.1cm}( terdapat \hspace{0.1cm}autokorelasi \hspace{0.1cm}pada \hspace{0.1cm}sisaan)\ \\α : 0,05 \]

resid.arima1 <- residuals(arima1)
resid.arima2 <- residuals(arima2)
Box.test(resid.arima1, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arima1
## X-squared = 4.8628, df = 2, p-value = 0.08791
Box.test(resid.arima2, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arima2
## X-squared = 13.883, df = 2, p-value = 0.0009669

Keputusan:

p-value (0,08791) > 0,05, maka HO diterima.

p-value (0,0009669) < 0,05, maka H0 ditolak.

Kesimpulan:

  • Dengan tingkat kepercayaan sebesar 95% dapat disimpulkan bahwa model ARIMA (0,1,1) tidak terdapat autokorelasi sisaan sehingga dapat dilanjutkan ke tahap selanjutnya yaitu uji normalitas sisaan.
  • Dengan tingkat kepercayaan sebesar 95% dapat disimpulkan bahwa model ARIMA (2,1,0) terdapat autokorelasi sisaan sehingga tidak perlu dilanjutkan dilakukan ke tahap selanjutnya yaitu uji normalitas sisaan.

Normalitas Sisaan

Hipotesis :

\[ H0 : ϵ_i~N(0,σ_e^2) \hspace{0.1cm}(sisaan \hspace{0.1cm}menyebar \hspace{0.1cm}normal) \hspace{0.1cm}vs \\H1 : ε≁N(0,σ_e^2) \hspace{0.1cm}(sisaan \hspace{0.1cm}tidak \hspace{0.1cm}menyebar \hspace{0.1cm}normal) \\α : 0,05 \]

jarque.bera.test(resid.arima1)
## 
##  Jarque Bera Test
## 
## data:  resid.arima1
## X-squared = 629.71, df = 2, p-value < 2.2e-16

Keputusan :

p-value < 0,05, maka 𝐻0 ditolak.

Kesimpulan :

Dengan tingkat kepercayaan sebesar 95% dapat disimpulkan bahwa sisaan model tentatif ARIMA tidak menyebar normal. Akan tetapi, pada pemodelan deret waktu asumsi normalitas tidak wajib terpenuhi, sehingga model tetap layak digunakan.

PEMILIHAN MODEL TERBAIK

arima1$aic
## [1] 3412.169
arima2$aic
## [1] 3492.835

Berdasarkan nilai AIC dari kedua model tentatif, dapat disimpulkan informasi bahwa model dengan nilai AIC terkecil adalah ARIMA(0,1,1). Maka model terbaik untuk peramalan yaitu model ARIMA (0,1,1)

PERAMALAN

Setelah mendapatkan model ARIMA terbaik, langkah selanjutnya adalah melakukan peramalan data untuk 30 hari ke depan.

peramalan <- forecast(Data_IHSG$`Harga Saham`, model = arima1, h=30)
peramalan$mean
## Time Series:
## Start = 299 
## End = 328 
## Frequency = 1 
##  [1] 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646
##  [9] 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646
## [17] 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646
## [25] 7040.646 7040.646 7040.646 7040.646 7040.646 7040.646

EVALUASI PREDIKSI

prediksi.arima <- Saham[1:297]-resid.arima1
plot(Tanggal, Saham, type = "o", col = "blue", lwd = 2)
lines(Tanggal[1:297], prediksi.arima, type = "o", col = "red", lwd = 2)
legend("bottomleft", legend = c("Saham Aktual", "Saham Hasil Prediksi ARIMA(0,1,1)"), col = c("blue", "red"), lty = 1, cex = 0.7)

Berdasarkan evaluasi secara grafis, dapat diketahui bahwa prediksi data dengan model ARIMA (0,0,1) mampu mengikuti pola fluktuasi pada keseluruhan periode dengan baik.