Memanggil Library

Sebelum melakukan analisis data dengan \(\textit R-studio\) perlu memanggil \(\textit library\) yang diperlukan yaitu sebagai berikut.

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(tseries)
library(TSA)
## Warning: package 'TSA' was built under R version 4.4.1
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
library(lmtest)
## Warning: package 'lmtest' was built under R version 4.4.2
library(forecast)
## Warning: package 'forecast' was built under R version 4.4.2
## 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)
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

Impor Data

Data yang digunakan dalam studi ini adalah data harian harga penutupan Indeks Harga Saham Gabungan (IHSG) dari tanggal 2 Januari 2024 hingga 9 April 2025. Nilainya berubah-ubah setiap hari dan sangat sensitif terhadap perkembangan ekonomi, kebijakan pemerintah, serta sentimen pelaku pasar. Perubahan harga yang tajam dari waktu ke waktu bisa menimbulkan lonjakan ekstrem yang dikenal sebagai pencilan. Salah satu contoh kondisi yang menyebabkan gejolak tersebut adalah saat RUU TNI disahkan pada 20 Maret 2025. Setelah kebijakan ini diumumkan, IHSG mengalami penurunan tajam yang terus berlanjut hingga awal April. Melihat sifat IHSG yang sangat dinamis, dibutuhkan metode peramalan yang mampu menangkap pola-pola yang tersembunyi dalam data. Peramalan ini penting untuk membantu investor membuat keputusan secara lebih terarah dan berbasis data.

#Impor Data
data <- read_excel("D:/6th sem/Metode Peramalan/Praktikum/Tugas1/Data IHSG.xlsx",
                   col_types = c("numeric", "date", "numeric"))
head(data) 
## # A tibble: 6 × 3
##      No Tanggal             `Harga Saham`
##   <dbl> <dttm>                      <dbl>
## 1     1 2024-01-02 00:00:00         7324.
## 2     2 2024-01-03 00:00:00         7279.
## 3     3 2024-01-04 00:00:00         7360.
## 4     4 2024-01-05 00:00:00         7351.
## 5     5 2024-01-08 00:00:00         7284.
## 6     6 2024-01-09 00:00:00         7200.

Eksplorasi Data

Eksplorasi data deret waktu dilakukan untuk mengetahui pola dari data IHSG.

# Konversi tanggal dan buat time series
data$Tanggal <- as.Date(data$Tanggal, format="%m/%d/%Y")
ts_ihsg <- xts(data$`Harga Saham`, order.by = data$Tanggal)

# Plot time series
plot(ts_ihsg, main="Plot Deret Waktu IHSG", ylab="Harga Saham", xlab="Tanggal")

Pada plot deret waktu di atas, terlihat bahwa harga IHSG relatif stabil dari awal hingga pertengahan tahun 2024, kemudian mengalami kenaikan pada periode Juli hingga Oktober 2024. Memasuki kuartal akhir 2024 hingga awal tahun 2025, harga mulai menurun, dan penurunan tersebut semakin tajam setelah pertengahan Maret 2025. Penurunan ini bertepatan dengan pengesahan RUU TNI yang memicu sentimen negatif di pasar. Dengan demikian, dapat dinyatakan bahwa terdapat intervensi pada periode tersebut sehingga dapat diterapkan pemodelan ARIMA Intervensi dan tambahan ARIMA Outlier untuk perbandingan. Sesuai fokus permasalahan yang menyoroti pengaruh RUU TNI, pemodelan ARIMA intervensi dapat dilakukan dengan menggunakan data sebelum intervensi, yaitu dari 2 Januari 2024 hingga 19 Maret 2025.

Uji Stasioneritas Data

Stasioneritas terhadap ragam

lambda1 <- BoxCox.lambda(ts_ihsg)
lambda1
## [1] 1.999924

Hasil pemeriksaan stasioneritas terhadap ragam menggunakan fungsi BoxCox.lambda() menunjukkan bahwa nilai \(\lambda = 1.999924\). Nilai lambda yang sangat mendekati 2 mengindikasikan bahwa data belum stasioner terhadap ragam, sehingga perlu dilakukan transformasi pertama menggunakan metode Box-Cox.

transformed1 <- BoxCox(ts_ihsg, lambda1)
# Uji Stasioneritas terhadap Ragam Kedua
lambda2 <- BoxCox.lambda(transformed1)
lambda2
## [1] 1.980901

Transformasi Box-Cox pertama menghasilkan nilai \(\lambda = 1.980901\). Meskipun terdapat sedikit penurunan nilai lambda, angka ini masih sangat dekat dengan 2, yang berarti ragam data belum stasioner terhadap ragam. Oleh karena itu, transformasi kedua diperlukan.

transformed2 <- BoxCox(transformed1, lambda2)
# Uji Stasioneritas terhadap Ragam Ketiga
lambda3 <- BoxCox.lambda(transformed2)
lambda3
## [1] 0.9980468

Transformasi Box-Cox kedua menghasilkan nilai \(\lambda = 0.9980468\), yang sangat dekat dengan 1. Hal ini menunjukkan bahwa data IHSG sudah stasioner terhadap ragam setelah ditrasnformasi dua kali.

Stasioneritas 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(transformed2)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  transformed2
## Dickey-Fuller = -1.0779, Lag order = 6, p-value = 0.9248
## alternative hypothesis: stationary

Hasil uji Dickey-Fuller pada data hasil transformasi Box-Cox kedua menunjukkan nilai-p sebesar \(0.9248\), yang lebih besar dari \(\alpha=0.05\). Dengan demikian, keputusan yang diambil adalah tolak ketidakstasioneran (terima \(H_0\)), sehingga dapat disimpulkan bahwa data belum stasioner terhadap rata-rata. Untuk mengatasi permasalahan ini, data perlu dilakukan differencing (pembedaan) orde pertama guna menghilangkan komponen non-stasioner tersebut dan mencapai kestasioneran terhadap rata-rata.

# Differencing orde 1
diff1 <- diff(transformed2, differences = 1)
# Visualisasi hasil differencing
plot(diff1, main = "Differencing Orde 1", ylab = "Nilai Berbeda", xlab = "Tanggal")
## Warning in merge.xts(temp_xts, xts_object, fill = na.locf, join = "right", :
## NAs introduced by coercion to integer range

# Uji ADF setelah differencing
adf.test(na.omit(diff1))
## Warning in adf.test(na.omit(diff1)): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  na.omit(diff1)
## Dickey-Fuller = -7.2371, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

Hasil uji Dickey-Fuller pada data hasil differencing pertama menunjukkan nilai-p sebesar \(0.01\) yang kurang dari \(\alpha=0.05\), sehingga menghasilkan keputusan tolak \(H_0\). Dengan demikian, dapat dinyatakan bahwa data hasil differencing pertama telah stasioner terhadap rata-rata.

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.

Penentuan Model Tentatif dari Plot ACF dan PACF

#Data IHSG yang Sudah Stasioner
data_stasioner <- na.omit(scale(diff1))
plot(data_stasioner, main = "Data IHSG Setelah Stasioner",
     ylab = "Nilai Terdifferensi dan Distandarisasi", xlab = "Tanggal")

head(data_stasioner)
##                   [,1]
## 2024-01-03 -0.62527996
## 2024-01-04  1.29182361
## 2024-01-05 -0.08933211
## 2024-01-08 -0.97542805
## 2024-01-09 -1.18757200
## 2024-01-10  0.45165108
acf(data_stasioner)

pacf(data_stasioner)

Berdasarkan nilai pada plot ACF dan PACF, dapat diketahui bahwa ACF signifikan pada lag ke-7 dan 19, sedangkan PACF signifikan pada lag ke-7, 10, dan 19. Karena data yang dipakai sudah distasionerkan melalui pembedaan satu kali, maka orde d = 0. Pada kasus ACF dan PACF yang hanya signifikan pada lag tertentu, dapat digunakan model ARIMA restricted. Model ARIMA restricted adalah model ARIMA yang menduga parameter hanya untuk lag tertentu saja.

Maka, model-model ARIMA yang mungkin sesuai adalah model ARIMA([7,10,19], 0, 0) dan ARIMA(0, 0, [7,19]).

Pendugaan Parameter Model Tentatif ARIMA

# Model 1: ARIMA([7,10,19], 0, 0)
m1 <- arima(data_stasioner, order=c(19, 0, 0), 
            fixed = c(rep(0, 6), NA, rep(0, 2), NA, rep(0,8), NA, NA), 
            transform.pars = FALSE)
coeftest(m1)
## 
## z test of coefficients:
## 
##             Estimate Std. Error z value Pr(>|z|)   
## ar7       -0.1613276  0.0593033 -2.7204 0.006521 **
## ar10       0.1284326  0.0598495  2.1459 0.031879 * 
## ar19      -0.1758729  0.0599745 -2.9325 0.003363 **
## intercept  0.0024461  0.0467723  0.0523 0.958292   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model 2: ARIMA(0, 0, [7,19])
m2 <- arima(data_stasioner, order=c(0,0,19), 
            fixed = c(rep(0, 6), NA, rep(0, 11), NA, NA))
coeftest(m2)
## 
## z test of coefficients:
## 
##             Estimate Std. Error z value Pr(>|z|)   
## ma7       -0.1398797  0.0556145 -2.5152 0.011898 * 
## ma19      -0.1833573  0.0605664 -3.0274 0.002467 **
## intercept  0.0058951  0.0391597  0.1505 0.880340   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Model 3: ARIMA(0,0,0) - Model white noise (hanya noise)
m6 <- arima(data_stasioner, order = c(0, 0, 0),
            method = "ML", include.mean = FALSE)


ekstrak_koef <- function(model, nama_model) {
  hasil <- coeftest(model)
  data.frame(
    Model = nama_model,
    Parameter = rownames(hasil),
    Estimate = round(hasil[, 1], 4),
    p_value = round(hasil[, 4], 4),
    row.names = NULL
  )
}

# Buat tabel ringkasan
tabel_m1 <- ekstrak_koef(m1, "ARIMA([7,10,19], 0, 0)")
tabel_m2 <- ekstrak_koef(m2, "Model 2: ARIMA(0, 0, [7,19])")

# Gabungkan semua tabel
tabel_ringkas <- rbind(
  tabel_m1, tabel_m2
  )

# Tampilkan hasil ringkasan
print(tabel_ringkas)
##                          Model Parameter Estimate p_value
## 1       ARIMA([7,10,19], 0, 0)       ar7  -0.1613  0.0065
## 2       ARIMA([7,10,19], 0, 0)      ar10   0.1284  0.0319
## 3       ARIMA([7,10,19], 0, 0)      ar19  -0.1759  0.0034
## 4       ARIMA([7,10,19], 0, 0) intercept   0.0024  0.9583
## 5 Model 2: ARIMA(0, 0, [7,19])       ma7  -0.1399  0.0119
## 6 Model 2: ARIMA(0, 0, [7,19])      ma19  -0.1834  0.0025
## 7 Model 2: ARIMA(0, 0, [7,19]) intercept   0.0059  0.8803

Berdasarkan hasil pendugaan parameter dari kedua model tentatif ARIMA di atas, dapat dilihat bahwa seluruh parameter dari kedua model ARIMA signifikan sehingga kedua model dapat digunakan.

Uji Asumsi Sisaan

Langkah selanjutnya adalah melakukan pengujian asumsi sisaan yaitu autokorelasi sisaan dan normalitas sisaan dari 2 model ARIMA dengan parameter signifikan. 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

resid.arima1 <- residuals(m1)
resid.arima2 <- residuals(m2)

Box.test(resid.arima1, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arima1
## X-squared = 1.5255, df = 2, p-value = 0.4664
Box.test(resid.arima2, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arima2
## X-squared = 2.2812, df = 2, p-value = 0.3196

Berasarkan hasil uji autokorelasi sisaan dari 2 model tentatif ARIMA dengan Ljung-Box dapat diperoleh informasi bahwa nilai-p yang didapatkan \(>0,05\) sehingga \(H_0\) diterima untuk kedua model. Dengan demikian, dapat dinyatakan bahwa tidak terdapat autokorelasi sisaan sehingga dapat dilanjutkan ke tahap 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(resid.arima1)
## 
##  Jarque Bera Test
## 
## data:  resid.arima1
## X-squared = 33.916, df = 2, p-value = 4.318e-08
jarque.bera.test(resid.arima2)
## 
##  Jarque Bera Test
## 
## data:  resid.arima2
## X-squared = 35.045, df = 2, p-value = 2.455e-08

Berdasarkan hasil uji normalitas sisaan menggunakan uji Jarque-Bera, diperoleh nilai-p yang lebih kecil dari 0.05 pada kedua model, sehingga hipotesis nol ditolak. Artinya, sisaan dari model tentatif ARIMA tidak berdistribusi normal. Meskipun demikian, dalam analisis deret waktu, normalitas bukan merupakan asumsi yang wajib dipenuhi, sehingga model tetap dapat digunakan. Dari hasil pengujian asumsi sisaan, disimpulkan bahwa 2 model ARIMA masih layak digunakan. Setelah semua asumsi terpenuhi, proses selanjutnya adalah memilih model terbaik berdasarkan nilai AIC.

Pemilihan Model Terbaik

m1$aic
## [1] 830.8977
m2$aic
## [1] 833.8334

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

Pemodelan ARIMA Outlier

Deteksi Outlier

Berdasarkan plot data deret waktu IHSG, terlihat adanya fluktuasi tajam pada banyak titik yang mengindikasikan kemungkinan keberadaan titik ekstrim (outlier) dalam data. Oleh karena itu, saat dilakukan pemodelan ARIMA, perlu dilakukan deteksi outlier. Deteksi ini dapat mencakup Additive Outlier (AO), Innovative Outlier (IO), dan Level Shift (LS).

prediksi.arima <- data_stasioner-resid.arima1
## Warning: Incompatible methods ("Ops.xts", "Ops.ts") for "-"
outlier <- tso(prediksi.arima, types = c('AO','IO','IS','TC'))
print(outlier)
## Series: prediksi.arima 
## Regression with ARIMA(0,0,0) errors 
## 
## Coefficients:
##         AO286
##       -0.9542
## s.e.   0.2392
## 
## sigma^2 = 0.05743:  log likelihood = 3.38
## AIC=-2.75   AICc=-2.71   BIC=4.64
## 
## Outliers:
##   type ind time coefhat  tstat
## 1   AO 286  286 -0.9542 -3.988

Pada hasil deteksi Additive Outlier (AO), Innovative Outlier (IO), Level Shift (LS), dan Transitory Change (TC), ditemukan bahwa terdapat satu outlier pada data deret waktu IHSG, yaitu outlier bertipe Additive Outlier (AO) pada periode ke-286. Hal ini mengindikasikan bahwa fluktuasi tajam bersifat tambahan (AO) yang memengaruhi nilai deret secara mendadak. Berdasarkan hasil deteksi ini, maka model ARIMA yang digunakan perlu mempertimbangkan keberadaan jenis outlier tersebut untuk meningkatkan keakuratan model. Untuk melihat pengaruh dari outlier tersebut terhadap model, dapat dilakukan visualisasi terhadap data dan sisaannya.

# Visualisasi efek outlier AO
plot(outlier$effects, main = "Efek Outlier terhadap Data", ylab = "Nilai Efek", xlab = "Waktu")

# Menyimpan efek outlier sebagai variabel eksternal
xreg.outlier <- outlier$effects
xreg.outlier
## Time Series:
## Start = 1 
## End = 297 
## Frequency = 1 
##              [,1]
##   [1,]  0.0000000
##   [2,]  0.0000000
##   [3,]  0.0000000
##   [4,]  0.0000000
##   [5,]  0.0000000
##   [6,]  0.0000000
##   [7,]  0.0000000
##   [8,]  0.0000000
##   [9,]  0.0000000
##  [10,]  0.0000000
##  [11,]  0.0000000
##  [12,]  0.0000000
##  [13,]  0.0000000
##  [14,]  0.0000000
##  [15,]  0.0000000
##  [16,]  0.0000000
##  [17,]  0.0000000
##  [18,]  0.0000000
##  [19,]  0.0000000
##  [20,]  0.0000000
##  [21,]  0.0000000
##  [22,]  0.0000000
##  [23,]  0.0000000
##  [24,]  0.0000000
##  [25,]  0.0000000
##  [26,]  0.0000000
##  [27,]  0.0000000
##  [28,]  0.0000000
##  [29,]  0.0000000
##  [30,]  0.0000000
##  [31,]  0.0000000
##  [32,]  0.0000000
##  [33,]  0.0000000
##  [34,]  0.0000000
##  [35,]  0.0000000
##  [36,]  0.0000000
##  [37,]  0.0000000
##  [38,]  0.0000000
##  [39,]  0.0000000
##  [40,]  0.0000000
##  [41,]  0.0000000
##  [42,]  0.0000000
##  [43,]  0.0000000
##  [44,]  0.0000000
##  [45,]  0.0000000
##  [46,]  0.0000000
##  [47,]  0.0000000
##  [48,]  0.0000000
##  [49,]  0.0000000
##  [50,]  0.0000000
##  [51,]  0.0000000
##  [52,]  0.0000000
##  [53,]  0.0000000
##  [54,]  0.0000000
##  [55,]  0.0000000
##  [56,]  0.0000000
##  [57,]  0.0000000
##  [58,]  0.0000000
##  [59,]  0.0000000
##  [60,]  0.0000000
##  [61,]  0.0000000
##  [62,]  0.0000000
##  [63,]  0.0000000
##  [64,]  0.0000000
##  [65,]  0.0000000
##  [66,]  0.0000000
##  [67,]  0.0000000
##  [68,]  0.0000000
##  [69,]  0.0000000
##  [70,]  0.0000000
##  [71,]  0.0000000
##  [72,]  0.0000000
##  [73,]  0.0000000
##  [74,]  0.0000000
##  [75,]  0.0000000
##  [76,]  0.0000000
##  [77,]  0.0000000
##  [78,]  0.0000000
##  [79,]  0.0000000
##  [80,]  0.0000000
##  [81,]  0.0000000
##  [82,]  0.0000000
##  [83,]  0.0000000
##  [84,]  0.0000000
##  [85,]  0.0000000
##  [86,]  0.0000000
##  [87,]  0.0000000
##  [88,]  0.0000000
##  [89,]  0.0000000
##  [90,]  0.0000000
##  [91,]  0.0000000
##  [92,]  0.0000000
##  [93,]  0.0000000
##  [94,]  0.0000000
##  [95,]  0.0000000
##  [96,]  0.0000000
##  [97,]  0.0000000
##  [98,]  0.0000000
##  [99,]  0.0000000
## [100,]  0.0000000
## [101,]  0.0000000
## [102,]  0.0000000
## [103,]  0.0000000
## [104,]  0.0000000
## [105,]  0.0000000
## [106,]  0.0000000
## [107,]  0.0000000
## [108,]  0.0000000
## [109,]  0.0000000
## [110,]  0.0000000
## [111,]  0.0000000
## [112,]  0.0000000
## [113,]  0.0000000
## [114,]  0.0000000
## [115,]  0.0000000
## [116,]  0.0000000
## [117,]  0.0000000
## [118,]  0.0000000
## [119,]  0.0000000
## [120,]  0.0000000
## [121,]  0.0000000
## [122,]  0.0000000
## [123,]  0.0000000
## [124,]  0.0000000
## [125,]  0.0000000
## [126,]  0.0000000
## [127,]  0.0000000
## [128,]  0.0000000
## [129,]  0.0000000
## [130,]  0.0000000
## [131,]  0.0000000
## [132,]  0.0000000
## [133,]  0.0000000
## [134,]  0.0000000
## [135,]  0.0000000
## [136,]  0.0000000
## [137,]  0.0000000
## [138,]  0.0000000
## [139,]  0.0000000
## [140,]  0.0000000
## [141,]  0.0000000
## [142,]  0.0000000
## [143,]  0.0000000
## [144,]  0.0000000
## [145,]  0.0000000
## [146,]  0.0000000
## [147,]  0.0000000
## [148,]  0.0000000
## [149,]  0.0000000
## [150,]  0.0000000
## [151,]  0.0000000
## [152,]  0.0000000
## [153,]  0.0000000
## [154,]  0.0000000
## [155,]  0.0000000
## [156,]  0.0000000
## [157,]  0.0000000
## [158,]  0.0000000
## [159,]  0.0000000
## [160,]  0.0000000
## [161,]  0.0000000
## [162,]  0.0000000
## [163,]  0.0000000
## [164,]  0.0000000
## [165,]  0.0000000
## [166,]  0.0000000
## [167,]  0.0000000
## [168,]  0.0000000
## [169,]  0.0000000
## [170,]  0.0000000
## [171,]  0.0000000
## [172,]  0.0000000
## [173,]  0.0000000
## [174,]  0.0000000
## [175,]  0.0000000
## [176,]  0.0000000
## [177,]  0.0000000
## [178,]  0.0000000
## [179,]  0.0000000
## [180,]  0.0000000
## [181,]  0.0000000
## [182,]  0.0000000
## [183,]  0.0000000
## [184,]  0.0000000
## [185,]  0.0000000
## [186,]  0.0000000
## [187,]  0.0000000
## [188,]  0.0000000
## [189,]  0.0000000
## [190,]  0.0000000
## [191,]  0.0000000
## [192,]  0.0000000
## [193,]  0.0000000
## [194,]  0.0000000
## [195,]  0.0000000
## [196,]  0.0000000
## [197,]  0.0000000
## [198,]  0.0000000
## [199,]  0.0000000
## [200,]  0.0000000
## [201,]  0.0000000
## [202,]  0.0000000
## [203,]  0.0000000
## [204,]  0.0000000
## [205,]  0.0000000
## [206,]  0.0000000
## [207,]  0.0000000
## [208,]  0.0000000
## [209,]  0.0000000
## [210,]  0.0000000
## [211,]  0.0000000
## [212,]  0.0000000
## [213,]  0.0000000
## [214,]  0.0000000
## [215,]  0.0000000
## [216,]  0.0000000
## [217,]  0.0000000
## [218,]  0.0000000
## [219,]  0.0000000
## [220,]  0.0000000
## [221,]  0.0000000
## [222,]  0.0000000
## [223,]  0.0000000
## [224,]  0.0000000
## [225,]  0.0000000
## [226,]  0.0000000
## [227,]  0.0000000
## [228,]  0.0000000
## [229,]  0.0000000
## [230,]  0.0000000
## [231,]  0.0000000
## [232,]  0.0000000
## [233,]  0.0000000
## [234,]  0.0000000
## [235,]  0.0000000
## [236,]  0.0000000
## [237,]  0.0000000
## [238,]  0.0000000
## [239,]  0.0000000
## [240,]  0.0000000
## [241,]  0.0000000
## [242,]  0.0000000
## [243,]  0.0000000
## [244,]  0.0000000
## [245,]  0.0000000
## [246,]  0.0000000
## [247,]  0.0000000
## [248,]  0.0000000
## [249,]  0.0000000
## [250,]  0.0000000
## [251,]  0.0000000
## [252,]  0.0000000
## [253,]  0.0000000
## [254,]  0.0000000
## [255,]  0.0000000
## [256,]  0.0000000
## [257,]  0.0000000
## [258,]  0.0000000
## [259,]  0.0000000
## [260,]  0.0000000
## [261,]  0.0000000
## [262,]  0.0000000
## [263,]  0.0000000
## [264,]  0.0000000
## [265,]  0.0000000
## [266,]  0.0000000
## [267,]  0.0000000
## [268,]  0.0000000
## [269,]  0.0000000
## [270,]  0.0000000
## [271,]  0.0000000
## [272,]  0.0000000
## [273,]  0.0000000
## [274,]  0.0000000
## [275,]  0.0000000
## [276,]  0.0000000
## [277,]  0.0000000
## [278,]  0.0000000
## [279,]  0.0000000
## [280,]  0.0000000
## [281,]  0.0000000
## [282,]  0.0000000
## [283,]  0.0000000
## [284,]  0.0000000
## [285,]  0.0000000
## [286,] -0.9541505
## [287,]  0.0000000
## [288,]  0.0000000
## [289,]  0.0000000
## [290,]  0.0000000
## [291,]  0.0000000
## [292,]  0.0000000
## [293,]  0.0000000
## [294,]  0.0000000
## [295,]  0.0000000
## [296,]  0.0000000
## [297,]  0.0000000
## attr(,"index")
##   [1] 1704240000 1704326400 1704412800 1704672000 1704758400 1704844800
##   [7] 1704931200 1705017600 1705276800 1705363200 1705449600 1705536000
##  [13] 1705622400 1705881600 1705968000 1706054400 1706140800 1706227200
##  [19] 1706486400 1706572800 1706659200 1706745600 1706832000 1707091200
##  [25] 1707177600 1707264000 1707696000 1707782400 1707955200 1708041600
##  [31] 1708300800 1708387200 1708473600 1708560000 1708646400 1708905600
##  [37] 1708992000 1709078400 1709164800 1709251200 1709510400 1709596800
##  [43] 1709683200 1709769600 1709856000 1710288000 1710374400 1710460800
##  [49] 1710720000 1710806400 1710892800 1710979200 1711065600 1711324800
##  [55] 1711411200 1711497600 1711584000 1711929600 1712016000 1712102400
##  [61] 1712188800 1712275200 1713225600 1713312000 1713398400 1713484800
##  [67] 1713744000 1713830400 1713916800 1714003200 1714089600 1714348800
##  [73] 1714435200 1714521600 1714608000 1714694400 1714953600 1715040000
##  [79] 1715126400 1715558400 1715644800 1715731200 1715817600 1715904000
##  [85] 1716163200 1716249600 1716336000 1716768000 1716854400 1716940800
##  [91] 1717027200 1717113600 1717372800 1717459200 1717545600 1717632000
##  [97] 1717718400 1717977600 1718064000 1718150400 1718236800 1718323200
## [103] 1718755200 1718841600 1718928000 1719187200 1719273600 1719360000
## [109] 1719446400 1719532800 1719792000 1719878400 1719964800 1720051200
## [115] 1720137600 1720396800 1720483200 1720569600 1720656000 1720742400
## [121] 1721001600 1721088000 1721174400 1721260800 1721347200 1721606400
## [127] 1721692800 1721779200 1721865600 1721952000 1722211200 1722297600
## [133] 1722384000 1722470400 1722556800 1722816000 1722902400 1722988800
## [139] 1723075200 1723161600 1723420800 1723507200 1723593600 1723680000
## [145] 1723766400 1724025600 1724112000 1724198400 1724284800 1724371200
## [151] 1724630400 1724716800 1724803200 1724889600 1724976000 1725235200
## [157] 1725321600 1725408000 1725494400 1725580800 1725840000 1725926400
## [163] 1726012800 1726099200 1726185600 1726531200 1726617600 1726704000
## [169] 1726790400 1727049600 1727136000 1727222400 1727308800 1727395200
## [175] 1727654400 1727740800 1727827200 1727913600 1728000000 1728259200
## [181] 1728345600 1728432000 1728518400 1728604800 1728864000 1728950400
## [187] 1729036800 1729123200 1729209600 1729468800 1729555200 1729641600
## [193] 1729728000 1729814400 1730073600 1730160000 1730246400 1730332800
## [199] 1730419200 1730678400 1730764800 1730851200 1730937600 1731024000
## [205] 1731283200 1731369600 1731456000 1731542400 1731628800 1731888000
## [211] 1731974400 1732060800 1732147200 1732233600 1732492800 1732579200
## [217] 1732752000 1732838400 1733097600 1733184000 1733270400 1733356800
## [223] 1733443200 1733702400 1733788800 1733875200 1733961600 1734048000
## [229] 1734307200 1734393600 1734480000 1734566400 1734652800 1734912000
## [235] 1734998400 1735257600 1735516800 1735776000 1735862400 1736121600
## [241] 1736208000 1736294400 1736380800 1736467200 1736726400 1736812800
## [247] 1736899200 1736985600 1737072000 1737331200 1737417600 1737504000
## [253] 1737590400 1737676800 1738195200 1738281600 1738540800 1738627200
## [259] 1738713600 1738800000 1738886400 1739145600 1739232000 1739318400
## [265] 1739404800 1739491200 1739750400 1739836800 1739923200 1740009600
## [271] 1740096000 1740355200 1740441600 1740528000 1740614400 1740700800
## [277] 1740960000 1741046400 1741132800 1741219200 1741305600 1741564800
## [283] 1741651200 1741737600 1741824000 1741910400 1742169600 1742256000
## [289] 1742342400 1742428800 1742515200 1742774400 1742860800 1742947200
## [295] 1743033600 1744070400 1744156800
## attr(,"index")attr(,"tzone")
## [1] UTC
## attr(,"index")attr(,"tclass")
## [1] Date
## attr(,"lambda")
## [1] 1.980901
## attr(,"scaled:center")
## [1] -488045874287
## attr(,"scaled:scale")
## [1] 9.198323e+12

Pemodelan ARIMA Outlier

# Pemodelan ARIMA([7,10,19], 0, 0) dengan mempertimbangkan efek outlier AO 
arima.outlier <- arima(data_stasioner, order=c(19, 0, 0), 
                       fixed = c(rep(0, 6), NA, rep(0, 2), NA, rep(0,8), NA, NA), 
                       transform.pars = FALSE,
                       xreg = xreg.outlier,  
                       method = 'ML', 
                       include.mean = FALSE)
coeftest(arima.outlier)
## 
## z test of coefficients:
## 
##       Estimate Std. Error z value Pr(>|z|)   
## ar7  -0.162982   0.059911 -2.7204 0.006520 **
## ar10  0.132954   0.064443  2.0631 0.039100 * 
## ar19 -0.177143   0.060379 -2.9338 0.003348 **
## xreg -0.199221   1.083768 -0.1838 0.854153   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# Uji signifikansi parameter model
coeftest(arima.outlier)
## 
## z test of coefficients:
## 
##       Estimate Std. Error z value Pr(>|z|)   
## ar7  -0.162982   0.059911 -2.7204 0.006520 **
## ar10  0.132954   0.064443  2.0631 0.039100 * 
## ar19 -0.177143   0.060379 -2.9338 0.003348 **
## xreg -0.199221   1.083768 -0.1838 0.854153   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan hasil pemodelan ARIMA dengan mempertimbangkan efek outlier, dapat diperoleh informasi bahwa sebagian besar parameter model signifikan, yaitu koefisien AR ke-7, AR ke-10, dan AR ke-19 dengan nilai p-value masing-masing di bawah 0.05. Hal ini menunjukkan bahwa ketiga parameter tersebut berkontribusi signifikan dalam menjelaskan variasi data. Namun demikian, parameter untuk variabel eksternal (outlier effect) tidak signifikan secara statistik karena memiliki p-value sebesar 0.854. Meskipun demikian, model tetap dapat digunakan karena pemodelan ini mempertimbangkan keberadaan outlier yang secara visual atau struktural sudah teridentifikasi memengaruhi data, sehingga tetap dapat dipertimbangkan untuk dipakai untuk dibandingkan dengan model tanpa mempertimbangkan efek outlier.

Uji Asumsi Sisaan Model Outlier

Hipotesis untuk uji autokorelasi sisaan sebagai berikut.
\(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

resid.arima.outlier <- residuals(arima.outlier)
Box.test(resid.arima.outlier, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arima.outlier
## X-squared = 1.4699, df = 2, p-value = 0.4795

Berdasarkan hasil uji autokorelasi sisaan pada model ARIMA Outlier AO menggunakan uji Ljung-Box, diperoleh nilai-p yang lebih besar dari 0.05. Hal ini menunjukkan bahwa hipotesis nol diterima, sehingga dapat disimpulkan bahwa tidak terdapat autokorelasi pada sisaan model. Oleh karena itu, analisis dapat dilanjutkan ke tahap berikutnya, yaitu uji normalitas sisaan yang dilakukan 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(resid.arima.outlier)
## 
##  Jarque Bera Test
## 
## data:  resid.arima.outlier
## X-squared = 32.438, df = 2, p-value = 9.042e-08

Hasil uji normalitas sisaan menggunakan uji Jarque-Bera menunjukkan bahwa nilai p model ARIMA Outlier AO berada di bawah 0.05. Dengan demikian, hipotesis nol ditolak dan dapat disimpulkan bahwa sisaan dari model tersebut tidak mengikuti distribusi normal. Meskipun begitu, dalam pemodelan deret waktu, asumsi normalitas bukanlah syarat mutlak, sehingga model tetap dapat dianggap layak digunakan. Berdasarkan hasil uji asumsi terhadap sisaan, model ARIMA Outlier AO dapat dinyatakan sesuai untuk dianalisis lebih lanjut.

Evaluasi Grafis ARIMA vs. ARIMA AO

prediksi.arima1 <- as.numeric(prediksi.arima)
prediksi.arima.outlier <- as.numeric(data_stasioner) - as.numeric(resid.arima.outlier)

# Plot hasil
plot(as.numeric(data_stasioner), type = "l", col = "darkblue", lwd = 1,
     ylab = "Nilai", xlab = "", main = "Perbandingan Prediksi Model")
lines(prediksi.arima1, type = "l", col = "darkred", lwd = 1)
legend("bottomleft", 
       legend = c("Data Asli", "Prediksi ARIMA"),
       col = c("darkblue", "darkred"),
       lty = 1, lwd = 2,
       inset = 0)  

plot(as.numeric(data_stasioner), type = "l", col = "darkblue", lwd = 1,
     ylab = "Nilai", xlab = "", main = "Perbandingan Prediksi Model")
lines(prediksi.arima.outlier, type = "l", col = "darkgreen", lwd = 1)
legend("bottomleft", 
       legend = c("Data Asli", "Prediksi ARIMA Outlier"),
       col = c("darkblue", "darkgreen"),
       lty = 1, lwd = 2,
       inset = 0)  

Berdasarkan hasil evaluasi grafis, terlihat bahwa baik model ARIMA maupun model ARIMA yang mempertimbangkan outlier belum mampu memprediksi pola data asli dengan baik. Kedua model menghasilkan garis prediksi yang relatif datar dan cenderung mengikuti rata-rata data, sementara data asli menunjukkan fluktuasi yang sangat tinggi dan bersifat ekstrim. Hal ini mengindikasikan bahwa baik ARIMA standar maupun ARIMA outlier belum cukup representatif untuk menangkap dinamika dan variasi ekstrem yang terjadi dalam data.

Pemodelan ARIMA Intervensi

Topik permasalahan yang menyoroti RUU TNI sebagai penyebab turunnya IHSG menunjukkan bahwa pemodelan ARIMA intervensi merupakan metode yang sesuai, karena metode ini cocok digunakan ketika terdapat informasi mengenai waktu dan penyebab kejadian yang memengaruhi data. Sebagai pembanding, digunakan terlebih dahulu model ARIMA outlier.

Mengambil Data Pra-Intervensi

Sesuai dengan fokus permasalahan yang menggarisbawahi pengaruh RUU TNI, pemodelan ARIMA intervensi dilakukan dengan menggunakan data sebelum intervensi, yaitu dari 2 Januari 2024 hingga 19 Maret 2025 karena RUU TNI disahkan pada 20 Maret 2025.

pra.intervensi <- data_stasioner[1:289]
pra.intervensi
##            m.c.seq.row..seq.n...seq.col..drop...FALSE.
## 2024-01-03                                 -0.62527996
## 2024-01-04                                  1.29182361
## 2024-01-05                                 -0.08933211
## 2024-01-08                                 -0.97542805
## 2024-01-09                                 -1.18757200
## 2024-01-10                                  0.45165108
## 2024-01-11                                 -0.05533841
## 2024-01-12                                  0.36673153
## 2024-01-15                                 -0.20099322
## 2024-01-16                                  0.33166019
##        ...                                            
## 2025-03-06                                  1.01914623
## 2025-03-07                                  0.26069393
## 2025-03-10                                 -0.37736711
## 2025-03-11                                 -0.53137132
## 2025-03-12                                  1.40364648
## 2025-03-13                                 -0.15116585
## 2025-03-14                                 -1.42437332
## 2025-03-17                                 -0.41749507
## 2025-03-18                                 -2.45098083
## 2025-03-19                                  0.90918764

Uji stasioneritas data

Stasioneritas terhadap ragam

BoxCox.lambda(pra.intervensi)
## Warning in guerrero(x, lower, upper): Guerrero's method for selecting a Box-Cox
## parameter (lambda) is given for strictly positive data.
## [1] 1.182849

Hasil dari pemeriksaan stasioneritas terhadap ragam menggunakan Box-cox dapat diketahui bahwa nilai \(\lambda=1.18\) yang di mana nilai tersebut mendekati satu, sehingga dapat dinyatakan bahwa data IHSG stasioner terhadap ragam.

Stasioneritas 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(pra.intervensi, k=1)
## Warning in adf.test(pra.intervensi, k = 1): p-value smaller than printed
## p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  pra.intervensi
## Dickey-Fuller = -12.244, Lag order = 1, p-value = 0.01
## alternative hypothesis: stationary

Hasil uji Dickey Fuller pada data pra-intervensi didapatkan nilai-p sebesar \(0,01\) yang di mana kurang dari \(\alpha=0,05\) sehingga menghasilkan keputusan terima \(H_0\). Dengan demikian, dapat dinyatakan bahwa data pra intervensi telah stasioner terhadap rata-rata.

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(pra.intervensi)

pacf(pra.intervensi)

Berdasarkan plot di atas, nilai ACF dan PACF signifikan pada lag ke-19. Berdasarkan informasi signifikansi lag data pra-intervensi, model ARIMA(p,d,q) yang dapat dibentuk adalah ARIMA([19],0,0) dan ARIMA(0,0,[19]).

# ARIMA([19],0,0) -> AR order = 19, hanya lag ke-19 yang tidak 0
arima.ar19 <- arima(pra.intervensi, order = c(19, 0, 0), 
                    fixed = c(rep(0, 18), NA, NA), 
                    method = "ML", include.mean = TRUE)
## Warning in stats::arima(x = x, order = order, seasonal = seasonal, xreg = xreg,
## : some AR parameters were fixed: setting transform.pars = FALSE
# ARIMA(0,0,[19]) -> MA order = 19, hanya lag ke-19 yang tidak 0
arima.ma19 <- arima(pra.intervensi, order = c(0, 0, 19), 
                    fixed = c(rep(0, 18), NA, NA), 
                    method = "ML", include.mean = TRUE)

ekstrak_koef2 <- function(model1, nama_model1) {
  hasil2 <- coeftest(model1)
  data.frame(
    Model = nama_model1,
    Parameter = rownames(hasil2),
    Estimate = round(hasil2[, 1], 4),
    p_value = round(hasil2[, 4], 4),
    row.names = NULL
  )
}

# Buat tabel ringkasan
tabel_m11 <- ekstrak_koef2(arima.ar19, "ARIMA([19], 0, 0)")
tabel_m21 <- ekstrak_koef2(arima.ma19, "ARIMA(0, 0, [19])")

# Gabungkan semua tabel
tabel_ringkas2 <- rbind(
  tabel_m11, tabel_m21
  )

# Tampilkan hasil ringkasan
print(tabel_ringkas2)
##               Model Parameter Estimate p_value
## 1 ARIMA([19], 0, 0)      ar19  -0.1290  0.0350
## 2 ARIMA([19], 0, 0) intercept   0.0117  0.8136
## 3 ARIMA(0, 0, [19])      ma19  -0.1290  0.0320
## 4 ARIMA(0, 0, [19]) intercept   0.0121  0.8052

Berdasarkan hasil pendugaan parameter dari kedua model ARIMA tersebut, dapat diketahui bahwa parameter ar19 dari ARIMA([19],0,0) signifikan dan pada model ARIMA(0,0,[19]) parameter ma19 signifikan. Dengan demikian, kedua model dapat digunakan.

Uji Asumsi Sisaan

Hipotesis untuk uji autokorelasi sisaan sebagai berikut.
\(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

resid.arimaar <- residuals(arima.ar19)
resid.arimama <- residuals(arima.ma19)

Box.test(resid.arimaar, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arimaar
## X-squared = 0.23381, df = 2, p-value = 0.8897
Box.test(resid.arimama, lag=2, type = c('Ljung-Box'))
## 
##  Box-Ljung test
## 
## data:  resid.arimama
## X-squared = 0.24933, df = 2, p-value = 0.8828

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(resid.arimaar)
## 
##  Jarque Bera Test
## 
## data:  resid.arimaar
## X-squared = 10.305, df = 2, p-value = 0.005786
jarque.bera.test(resid.arimama)
## 
##  Jarque Bera Test
## 
## data:  resid.arimama
## X-squared = 10.001, df = 2, p-value = 0.006734

Hasil uji normalitas sisaan menggunakan uji Jarque-Bera menunjukkan bahwa nilai-p model ARIMA Pra-Intervensi berada di bawah 0.05. Dengan demikian, hipotesis nol ditolak dan dapat disimpulkan bahwa sisaan dari kedua model tidak mengikuti distribusi normal. Meskipun begitu, dalam pemodelan deret waktu, asumsi normalitas bukanlah syarat mutlak, sehingga model tetap dapat dianggap layak digunakan.

Pemilihan Model Terbaik

arima.ar19$aic
## [1] 791.8177
arima.ma19$aic
## [1] 791.7845

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

Peramalan

Setelah mendapatkan model ARIMA terbaik pada data pra-intervensi, langkah selanjutnya adalah melakukan peramalan sepanjang sisa data yaitu data intervensi dan setelahnya. Peramalan dilakukan untuk 9 periode.

peramalan <- forecast(pra.intervensi, model = arima.ma19, h=9)
peramalan$mean
## Time Series:
## Start = 290 
## End = 298 
## Frequency = 1 
## [1] -0.036669610  0.092498320  0.267837191  0.001049519  0.168630825
## [6]  0.305237134 -0.335575205  0.209097427 -0.167678954

Tahapan setelah melakukan peramalan sepanjang sisa periode yang ada pada data penelitian adalah menghitung sisaan dari model peramalan dengan persamaan berikut. \[e_t = ihsg_t - \hat {ihsg_t}\]

sisaan.peramalan <- data_stasioner[289:297]-peramalan$mean
## Warning: Incompatible methods ("Ops.xts", "Ops.ts") for "-"
sisaan.peramalan
## Time Series:
## Start = 290 
## End = 298 
## Frequency = 1 
##              [,1]
##  [1,]  0.94585725
##  [2,]  0.66528190
##  [3,] -1.44246223
##  [4,] -0.86295057
##  [5,]  0.58271276
##  [6,]  2.13973862
##  [7,]  0.80036506
##  [8,] -5.12057759
##  [9,]  0.02131024
## attr(,"lambda")
## [1] 1.980901
## attr(,"scaled:center")
## [1] -488045874287
## attr(,"scaled:scale")
## [1] 9.198323e+12
## attr(,"index")
## [1] 1742342400 1742428800 1742515200 1742774400 1742860800 1742947200 1743033600
## [8] 1744070400 1744156800
## attr(,"index")attr(,"tzone")
## [1] UTC
## attr(,"index")attr(,"tclass")
## [1] Date

Pemodelan ARIMA Intervensi

Identifikasi Orde B,r,s

Identifikasi model intervensi bertujuan untuk menentukan seberapa lama periode yang dipengaruhi oleh intervensi serta memilih bentuk fungsi intervensi yang sesuai. Selain itu, proses ini juga digunakan untuk menetapkan nilai orde b, r, dan s dalam model intervensi. Teknik identifikasinya dilakukan dengan mengamati pola sisaan pada periode ke-t yang keluar dari batas signifikansi melalui plot. Batas signifikansi ini dihitung berdasarkan \(±3\) Standar Deviasi Sisaan. Standar deviasi sisaan yang digunakan berasal dari sisaan model ARIMA yang telah dibentuk menggunakan data sebelum terjadinya intervensi.

## Identifikasi orde intervensi
error_idintv <- rep(0, 297)
error_idintv[1:297] <- resid.arima1
error_idintv[289:297] <- sisaan.peramalan
plot(error_idintv, type="h", xlab="Waktu (T)", ylab = "Residual", xaxt = "n")
abline(h=c(-3*sd(resid.arimama), 3*sd(resid.arimama)), col="darkblue", lty=2)
abline(v = 290, col = "darkred", lty = 3, lwd = 1.5)

Berdasarkan plot sisaan setelah pemodelan ARIMA intervensi, terlihat bahwa terdapat dua titik waktu yang keluar dari batas signifikansi, yaitu satu sisaan negatif yang mencolok di sekitar pertengahan periode dan satu sisaan positif signifikan pada periode ke-295. Hal ini menunjukkan kemungkinan adanya dua kejadian intervensi yang berdampak pada nilai deret waktu. Namun, pola setelah kedua titik tersebut menunjukkan bahwa sisaan kembali ke dalam batas signifikansi dan tidak menunjukkan efek yang berkelanjutan. Oleh karena itu, fungsi intervensi yang digunakan adalah fungsi pulse, yaitu fungsi yang digunakan ketika dampak dari intervensi hanya terjadi pada satu titik waktu saja. Dengan demikian, untuk dua kejadian tersebut, dapat ditetapkan orde fungsi intervensi sebagai B = 0, s = 1, dan r = 0 untuk masing-masing titik intervensi. ### Pendugaan Parameter Model Intervensi

## Pemodelan Arima Intervensi
intervensi <- c(rep(0,297), 1, rep(0,9))
model.intervensi <- arimax(data_stasioner, order = c(0, 0, 19), 
                    fixed = c(rep(0, 18), NA, NA), 
                    method = "ML")
model.intervensi
## 
## Call:
## arimax(x = data_stasioner, order = c(0, 0, 19), fixed = c(rep(0, 18), NA, NA), 
##     method = "ML")
## 
## Coefficients:
##       ma1  ma2  ma3  ma4  ma5  ma6  ma7  ma8  ma9  ma10  ma11  ma12  ma13  ma14
##         0    0    0    0    0    0    0    0    0     0     0     0     0     0
## s.e.    0    0    0    0    0    0    0    0    0     0     0     0     0     0
##       ma15  ma16  ma17  ma18     ma19  intercept
##          0     0     0     0  -0.1708     0.0028
## s.e.     0     0     0     0   0.0589     0.0480
## 
## sigma^2 estimated as 0.9687:  log likelihood = -416.98,  aic = 837.96
coeftest(model.intervensi)
## 
## z test of coefficients:
## 
##             Estimate Std. Error z value Pr(>|z|)   
## ma19      -0.1708342  0.0588713 -2.9018  0.00371 **
## intercept  0.0028211  0.0480029  0.0588  0.95314   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan hasil pendugaan parameter dan uji signifikansi model ARIMA intervensi dapat diperoleh informasi bahwa hanya parameter intercept saja yang tidak signifikan, sehingga masih dapat dilakukan pemodelan.

Pengujian Asumsi Sisaan

Sama dengan model ARIMA, model intervensi juga perlu melakukan uji asumsi sisaan yaitu autokorelasi sisaan dan normalitas sisaan.

## UJi asumsi
resid.intervensi <- residuals(model.intervensi)
jarque.bera.test(resid.intervensi)
## 
##  Jarque Bera Test
## 
## data:  resid.intervensi
## X-squared = 40.452, df = 2, p-value = 1.644e-09
Box.test(resid.intervensi, lag = 4, type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  resid.intervensi
## X-squared = 3.959, df = 4, p-value = 0.4116

Berdasarkan hasil uji autokorelasi dapat diperoleh informasi bahwa sisaan model intervensi tidak terdapat autokorelasi. Sisaan tidak menyebar normal namun sekali lagi tidak menjadi masalah untuk kasus deret waktu.

Evaluasi Prediksi Grafis

Model ARIMA Intervensi yang telah memenuhi seluruh asumsi, dapat dilakukan evaluasi model dengan perbandingan secara grafis.

prediksi.arima.intervensi <- data_stasioner-resid.intervensi
## Warning: Incompatible methods ("Ops.xts", "Ops.ts") for "-"
prediksiintervensi <- as.numeric(prediksi.arima.intervensi)
plot(as.numeric(data_stasioner), type = "l", col = "darkblue", lwd = 1)
lines(prediksi.arima.intervensi, type = "l", col = "darkred", lwd = 1)
legend("bottomleft", legend = c("IHSG Aktual", "IHSG Hasil Prediksi ARIMAX(0,0,19) dengan intervensi (fungsi pulse)"), col = c("darkblue", "darkred"), lty = 1)

Berdasarkan plot di atas, garis biru menunjukkan data inflasi aktual yang telah distasionerkan, sementara garis merah merupakan hasil prediksi dari model intervensi. Secara umum, garis merah berhasil mengikuti pola pergerakan inflasi aktual, meskipun tidak sepenuhnya menangkap fluktuasi ekstrem. Hal ini menunjukkan bahwa model cukup baik untuk memodelkan pola dasar data, namun mungkin perlu penyesuaian tambahan untuk menangani efek kejutan atau outlier secara lebih akurat.