Indeks Harga Saham Gabungan (IHSG) merupakan salah satu indeks pasar saham yang digunakan oleh Bursa Efek Indonesia sebagai indikator utama pergerakan pasar modal Indonesia. IHSG berfungsi sebagai acuan pengukuran kinerja portofolio investasi, indikator pergerakan pasar modal, serta cerminan kondisi perekonomian secara umum (OCBC, 2023). Beberapa hari terakhir, Indonesia mengalami fenomena pasar modal yang cukup mencengangkan dengan terjadinya apa yang disebut “Black Swan Tuesday” akibat kebijakan pemerintah yang menimbulkan sentimen negatif sehingga membuat saham-saham di Indonesia menjadi anjlok termasuk IHSG. Kebijakan pemerintah tersebut adalah pengesahan RUU TNI yang disahkan pada tanggal 20 Maret 2025, dilanjutkan penurunan 2.14% pada 21 Maret 2025, dan puncaknya, yaitu terjadi keanjlokan di 9.19% pada 8 April 2025 yang memicu penghentian sementara perdagangan (trading halt) di Bursa Efek Indonesia. Hal tersebut menunjukkan dampak yang krusial terhadap pasar modal Indonesia. Berdasarkan karakteristik dari data IHSG yang selalu mengalami perubahan dan terpengaruh oleh kejadian-kejadian khusus, seperti kebijakan pemerintah, perlu dilakukan peramalan menggunakan model yang mampu mengakomodasikan kedua aspek tersebut. Model Autoregressive Integrated Moving Average (ARIMA) telah terbukti efektif dalam meramalkan data time series, termasuk harga saham dan indeks pasar modal. Model ARIMA dapat mengidentifikasi pola dalam data historis dan menghasilkan peramalan berdasarkan pola tersebut. Akan tetapi, model ARIMA standar memiliki keterbatasan dalam menangkap dampak dari kejadian-kejadian eksternal yang tidak terduga. Untuk mengatasi masalah tersebut, analisis intervensi merupakan metode yang tepat karena dirancang khusus untuk mengolah data time series yang dipengaruhi oleh suatu peristiwa yang disebut intervensi. Analisis intervensi adalah pengembangan dari model ARIMA yang dapat mengevaluasi besar dan lamanya efek dari dampak suatu intervensi terhadap data time series. Terdapat dua jenis fungsi dalam model intervensi, yaitu fungsi step untuk efek jangka panjang dan fungsi pulse untuk efek sementara. Dalam konteks pengesahan RUU TNI, analisis intervensi dengan fungsi step dapat digunakan untuk mengukur dampak berkelanjutan dari kebijakan tersebut terhadap IHSG.
Model deret waktu manakah yang sesuai untuk permasalahan tersebut?
Bagaimana kemampuan model deret waktu yang ditetapkan dalam memodelkan data IHSG?
Bagaimana hasil peramalan dengan model deret waktu pada kasus data IHSG?
> #Pemanggilan Data dari Windows ke Environment R
> library(readr)
> library(ggplot2)
> library(dplyr)
> library(tidyr)
> library(tseries)
> library(TSA)
> library(lmtest)
> library(forecast)
> library(readxl)
> library(TSA)
> library(xts)
> library(ggrepel)
> library(MASS)
> library(tsoutliers)
> library(dplyr)
> library(tidyr)
>
> Data_Eth = read_csv("Alphabet A Stock Price History.csv",
+ col_types = cols(Date = col_date(format = "%m/%d/%Y"),
+ `Volue Eth (Yt)` = col_number()))
> Date = as.Date(Data_Eth$Date, format = "%m/%d/%Y")
> Volume_ETH = Data_Eth$`Price Eth (X1t)`
> Price_ETH = Data_Eth$`Price Eth (X1t)`
> Price_GGL = Data_Eth$`Price Google (X2t)`
> datafr.voleth = data.frame("Tanggal" = as.Date(Data_Eth$Date), "Volume Eth" = Volume_ETH)
> ts.eth = ts(datafr.voleth, start = c(2020, 1), end = c(2025, 5),
+ frequency = 12)
> View(Data_Eth)
>
> # Pastikan data sudah urut berdasarkan tanggal
> Data_Eth <- Data_Eth %>% arrange(Date)
>
> # Reshape data ke format long untuk plotting
> library(dplyr)
> library(tidyr)
>
> Data_Eth %>%
+ select(Date, `Volue Eth (Yt)`, `Price Eth (X1t)`, `Price Google (X2t)`) %>%
+ pivot_longer(cols = -Date, names_to = "Variable", values_to = "Value")
FALSE Error in select(., Date, `Volue Eth (Yt)`, `Price Eth (X1t)`, `Price Google (X2t)`): unused arguments (Date, `Volue Eth (Yt)`, `Price Eth (X1t)`, `Price Google (X2t)`)
>
>
> # Alternatif: Plot dalam satu grafik dengan skala berbeda (menggunakan scale_color_manual)
> ggplot(data_long, aes(x = Date, y = Value, color = Variable)) +
+ geom_line() +
+ labs(title = "Weekly Time Series Comparison",
+ x = "Date",
+ y = "Value",
+ color = "Variable") +
+ theme_minimal() +
+ scale_color_manual(values = c("BTC" = "orange", "M2MS" = "blue", "DXY" = "red")) +
+ scale_x_date(date_labels = "%Y-%m", date_breaks = "1 year")
FALSE Error in eval(expr, envir, enclos): object 'data_long' not found
>
> ###Bitcoin
> eth <- log(Data_Eth$`Volue Eth (Yt)`)
>
> #Uji Stationeritas
> ## Stasioneritas Ragam
> BC.Results1 = boxcox(lm(as.vector(c(eth))~1))> BC.Results1$y
FALSE [1] -101.01850 -99.59452 -98.20032 -96.83638 -95.50319 -94.20126
FALSE [7] -92.93105 -91.69300 -90.48752 -89.31499 -88.17576 -87.07014
FALSE [13] -85.99841 -84.96082 -83.95757 -82.98883 -82.05474 -81.15537
FALSE [19] -80.29080 -79.46102 -78.66601 -77.90571 -77.18000 -76.48876
FALSE [25] -75.83180 -75.20890 -74.61984 -74.06432 -73.54204 -73.05266
FALSE [31] -72.59583 -72.17116 -71.77823 -71.41663 -71.08590 -70.78558
FALSE [37] -70.51520 -70.27426 -70.06227 -69.87873 -69.72312 -69.59493
FALSE [43] -69.49363 -69.41871 -69.36964 -69.34592 -69.34701 -69.37243
FALSE [49] -69.42165 -69.49417 -69.58952 -69.70719 -69.84672 -70.00763
FALSE [55] -70.18947 -70.39178 -70.61414 -70.85610 -71.11726 -71.39719
FALSE [61] -71.69552 -72.01184 -72.34578 -72.69698 -73.06508 -73.44973
FALSE [67] -73.85060 -74.26737 -74.69971 -75.14733 -75.60991 -76.08718
FALSE [73] -76.57886 -77.08467 -77.60436 -78.13766 -78.68432 -79.24412
FALSE [79] -79.81682 -80.40218 -81.00000 -81.61005 -82.23214 -82.86606
FALSE [85] -83.51161 -84.16862 -84.83688 -85.51623 -86.20650 -86.90750
FALSE [91] -87.61908 -88.34108 -89.07334 -89.81570 -90.56803 -91.33017
FALSE [97] -92.10198 -92.88333 -93.67408 -94.47410
> lambda.Results = BC.Results1$x[which.max(BC.Results1$y)]
> eth = (eth^(lambda.Results)-1)/lambda.Results
> adf.test(eth)
FALSE
FALSE Augmented Dickey-Fuller Test
FALSE
FALSE data: eth
FALSE Dickey-Fuller = -2.7561, Lag order = 3, p-value = 0.2685
FALSE alternative hypothesis: stationary
> auto.arima(eth, d = 1, trace = T) %>% coeftest()
FALSE
FALSE ARIMA(2,1,2) with drift : Inf
FALSE ARIMA(0,1,0) with drift : -60.46405
FALSE ARIMA(1,1,0) with drift : -59.16768
FALSE ARIMA(0,1,1) with drift : -59.27897
FALSE ARIMA(0,1,0) : -61.0525
FALSE ARIMA(1,1,1) with drift : Inf
FALSE
FALSE Best model: ARIMA(0,1,0)
FALSE Error in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent
>
> arima(eth, order = c(0,1,0)) %>% residuals() %>% jarque.bera.test()
FALSE
FALSE Jarque Bera Test
FALSE
FALSE data: .
FALSE X-squared = 1651.2, df = 2, p-value < 2.2e-16
> arima(eth, order = c(0,1,0)) %>% residuals() %>% Box.test(type = "Ljung-Box")
FALSE
FALSE Box-Ljung test
FALSE
FALSE data: .
FALSE X-squared = 0.34859, df = 1, p-value = 0.5549
>
> arima(eth, order = c(0,1,0)) %>% residuals() %>% checkresiduals()FALSE
FALSE Ljung-Box test
FALSE
FALSE data: Residuals
FALSE Q* = 6.1867, df = 10, p-value = 0.7993
FALSE
FALSE Model df: 0. Total lags used: 10
>
> #### (LANJUT)
> ###M2MS
> Price_ETH <- log(Data_Eth$`Price Eth (X1t)`)
>
> par(mfrow = c(1,1))
> BoxCox.ar(Price_ETH + abs(min(Price_ETH)) + 0.1)
> adf.test(Price_ETH)
FALSE
FALSE Augmented Dickey-Fuller Test
FALSE
FALSE data: Price_ETH
FALSE Dickey-Fuller = -2.2477, Lag order = 3, p-value = 0.4746
FALSE alternative hypothesis: stationary
> adf.test(diff(Price_ETH))
FALSE
FALSE Augmented Dickey-Fuller Test
FALSE
FALSE data: diff(Price_ETH)
FALSE Dickey-Fuller = -3.5678, Lag order = 3, p-value = 0.04314
FALSE alternative hypothesis: stationary
>
> auto.arima(Price_ETH, d=1, trace = T)
FALSE
FALSE ARIMA(2,1,2) with drift : 6.078692
FALSE ARIMA(0,1,0) with drift : 1.310934
FALSE ARIMA(1,1,0) with drift : 3.51413
FALSE ARIMA(0,1,1) with drift : 3.514131
FALSE ARIMA(0,1,0) : 0.6622116
FALSE ARIMA(1,1,1) with drift : 5.390066
FALSE
FALSE Best model: ARIMA(0,1,0)
FALSE Series: Price_ETH
FALSE ARIMA(0,1,0)
FALSE
FALSE sigma^2 = 0.05728: log likelihood = 0.7
FALSE AIC=0.6 AICc=0.66 BIC=2.76
> par(mfrow = c(1,2)) ; acf(diff(Price_ETH)) ; pacf(diff(Price_ETH))> arima(diff(Price_ETH), order = c(0,0,0), include.mean = F) %>% coeftest()
FALSE Error in dimnames(x) <- dn: length of 'dimnames' [2] not equal to array extent
>
> arima(Price_ETH, order = c(0,1,0), include.mean = F) %>% residuals() %>% jarque.bera.test()
FALSE
FALSE Jarque Bera Test
FALSE
FALSE data: .
FALSE X-squared = 0.042288, df = 2, p-value = 0.9791
> arima(Price_ETH, order = c(0,1,0), include.mean = F) %>% residuals() %>% Box.test(type = "Ljung-Box")
FALSE
FALSE Box-Ljung test
FALSE
FALSE data: .
FALSE X-squared = 0.0004158, df = 1, p-value = 0.9837
>
> arima(Price_ETH, order = c(0,1,0), include.mean = F) %>% residuals() %>% checkresiduals()FALSE
FALSE Ljung-Box test
FALSE
FALSE data: Residuals
FALSE Q* = 8.6571, df = 10, p-value = 0.5649
FALSE
FALSE Model df: 0. Total lags used: 10
>
> a_1 <- arima(Price_ETH, order = c(3,1,4), include.mean = F) %>% residuals()
> b_1 <- arima(eth, order = c(3,1,4), include.mean = F, fixed = c(1.1577, -1.1892, 0.8953,
+ -1.2096, 1.2659, -0.9488, 0.1506)) %>% residuals()
>
> ###DXY
> google <- Data_Eth$`Price Google (X2t)`
>
> par(mfrow = c(1,1))
> BoxCox.ar(google + abs(min(google)) + 0.1)
> dxy <- 1/sqrt(dxy)
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> adf.test(diff(dxy))
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> par(mfrow = c(1,2)) ; acf(diff(dxy)) ; pacf(diff(dxy))
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
> arima(dxy, order = c(2,1,2)) %>% coeftest()
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> arima(dxy, order = c(2,1,2)) %>% residuals() %>% jarque.bera.test()
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
> arima(dxy, order = c(2,1,2)) %>% residuals() %>% Box.test(type = "Ljung-Box")
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> arima(dxy, order = c(2,1,2)) %>% residuals() %>% checkresiduals()
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> a_2 <- arima(dxy, order = c(2,1,2)) %>% residuals()
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
> b_2 <- arima(dxy, order = c(2,1,2), fixed = c(1.1253, -0.9369,
+ -1.1784, 0.9728)) %>% residuals()
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> ###CCF & Identifikasi Fungsi Transfer
> ccf_1 <- ccf(a_1, b_1)
> ccf_2 <- ccf(a_2, b_2)
FALSE Error in eval(expr, envir, enclos): object 'a_2' not found
>
> sd(a_1)
FALSE [1] 0.2172894
> sd(a_2)
FALSE Error in eval(expr, envir, enclos): object 'a_2' not found
> sd(b_1)
FALSE [1] 0.1461076
> sd(b_2)
FALSE Error in eval(expr, envir, enclos): object 'b_2' not found
>
> ccf.d_1 <- data.frame(Lag = c(-24:24), CCF = ccf_1$acf,
+ Vk = data.frame(Vk = (sd(b_1)/sd(a_1))*ccf_1$acf))
FALSE Error in data.frame(Lag = c(-24:24), CCF = ccf_1$acf, Vk = data.frame(Vk = (sd(b_1)/sd(a_1)) * : arguments imply differing number of rows: 49, 31
>
> ccf.d_2 <- data.frame(Lag = c(-24:24), CCF = ccf_2$acf,
+ Vk = data.frame(Vk = (sd(b_2)/sd(a_2))*ccf_2$acf))
FALSE Error in eval(expr, envir, enclos): object 'ccf_2' not found
>
> ggplot(data = ccf.d_1, aes(x = Lag, y = Vk)) +
+ geom_col() +
+ expand_limits(y=c(-1,1)) +
+ geom_abline(intercept = 2*sd(ccf.d_1$Vk),slope = 0, col = "red") +
+ geom_abline(intercept = -2*sd(ccf.d_1$Vk), slope = 0, col = "blue") +
+ theme_minimal()
FALSE Error in eval(expr, envir, enclos): object 'ccf.d_1' not found
>
> ggplot(data = ccf.d_2, aes(x = Lag, y = Vk)) +
+ geom_col() +
+ expand_limits(y=c(-1,1)) +
+ geom_abline(intercept = 2*sd(ccf.d_2$Vk),slope = 0, col = "red") +
+ geom_abline(intercept = -2*sd(ccf.d_2$Vk), slope = 0, col = "blue") +
+ theme_minimal()
FALSE Error in eval(expr, envir, enclos): object 'ccf.d_2' not found
>
> #PEMODELAN ARIMAX(p,d,q)(b,r,s)
> lm(btc[2:622] ~ diff(m2ms) + diff(dxy)) %>% coeftest()
FALSE Error in eval(predvars, data, env): object 'btc' not found
>
> n <- lm(btc[2:622] ~ diff(m2ms) + diff(dxy)) %>% residuals()
FALSE Error in eval(predvars, data, env): object 'btc' not found
>
> par(mfrow = c(1,2)) ; acf(n) ; pacf(n)FALSE Error in attr(data, "tsp") <- c(start, end, frequency): object is not a matrix
FALSE Error in attr(data, "tsp") <- c(start, end, frequency): object is not a matrix
>
> arima(n, order = c(5,0,0), include.mean = F) %>% coeftest()
FALSE Error in attr(data, "tsp") <- c(start, end, frequency): object is not a matrix
>
> arima(n, order = c(5,0,0), include.mean = F) %>% residuals() %>%
+ jarque.bera.test()
FALSE Error in attr(data, "tsp") <- c(start, end, frequency): object is not a matrix
> arima(n, order = c(5,0,0), include.mean = F) %>% residuals() %>%
+ Box.test(type = "Ljung-Box")
FALSE Error in attr(data, "tsp") <- c(start, end, frequency): object is not a matrix
>
> length(btc)
FALSE Error in eval(expr, envir, enclos): object 'btc' not found
> length(diff(m2ms))
FALSE Error in eval(expr, envir, enclos): object 'm2ms' not found
> length(diff(dxy))
FALSE Error in eval(expr, envir, enclos): object 'dxy' not found
>
> arimax(btc[2:622], order = c(5,0,0), xreg = scale(cbind(diff(m2ms),
+ diff(dxy))),
+ method = 'ML', include.mean = F) %>% coeftest()
FALSE Error in eval(expr, envir, enclos): object 'm2ms' not found
>
> a_t <- arimax(btc[2:622], order = c(5,0,0), xreg = scale(cbind(diff(m2ms),
+ diff(dxy))),
+ method = 'ML', include.mean = F) %>% residuals()
FALSE Error in eval(expr, envir, enclos): object 'm2ms' not found
>
> ccf(a_t, a_1)
FALSE Error in eval(expr, envir, enclos): object 'a_t' not found
> ccf(a_t, a_2)
FALSE Error in eval(expr, envir, enclos): object 'a_t' not found
>
> Box.test(a_t, type = "Ljung-Box")
FALSE Error in eval(expr, envir, enclos): object 'a_t' not found
> jarque.bera.test(a_t)
FALSE Error in eval(expr, envir, enclos): object 'a_t' not found
>
> arimax(btc[2:622], order = c(5,0,0), xreg = scale(cbind(diff(m2ms),
+ diff(dxy))),
+ method = 'ML', include.mean = F) %>% residuals() %>%
+ checkresiduals()
FALSE Error in eval(expr, envir, enclos): object 'm2ms' not found