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)
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.
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.
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 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%.
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
λ = 1 , maka H0 diterima.
Dengan tingkat kepercayaan 95% dapat disimpulkan bahwa data tidak memerlukan transformasi Box-cox karena data sudah stasioner terhadap ragam.
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%.
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
p-value < 0,05, maka H0 ditolak.
Dengan tingkat kepercayaan 95% dapat disimpulkan bahwa data stasioner terhadap rata-rata.
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).
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.
\[ 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
p-value (0,08791) > 0,05, maka HO diterima.
p-value (0,0009669) < 0,05, maka H0 ditolak.
\[ 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
p-value < 0,05, maka 𝐻0 ditolak.
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.
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)
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
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.