1 TINJAUAN PUSTAKA

Metode Box-Jenkins (ARIMA) terdiri dari serangkaian proses iteratif untuk menemukan model peramalan terbaik. Berikut adalah landasan teori dari masing-masing tahapan analisis:

1.1 Stasioneritas Data

Syarat utama dalam pemodelan ARIMA adalah data harus stasioner dalam varian dan rata-rata (mean).

  • Stasioneritas dalam Varian: Jika data tidak stasioner dalam varian, dilakukan transformasi data, misalnya menggunakan transformasi Box-Cox dengan parameter \(\lambda\).

  • Stasioneritas dalam Rata-rata: Jika data tidak stasioner dalam rata-rata, dilakukan proses diferensiasi (differencing). Rumus diferensiasi orde pertama adalah:\[\Delta Y_t = Y_t - Y_{t-1}\]

1.2 Identifikasi Model

Identifikasi kandidat model ARIMA(\(p,d,q\)) dilakukan dengan mengamati perilaku plot Autocorrelation Function (ACF) dan Partial Autocorrelation Function (PACF) dari data yang sudah stasioner.

  • Orde Autoregressive (\(p\)) dilihat dari plot PACF yang terputus (cut off).
  • Orde Moving Average (\(q\)) dilihat dari plot ACF yang terputus (cut off).

Bentuk umum persamaan model ARIMA adalah: \[\phi_p(B)(1-B)^d Z_t = \theta_q(B)a_t\]

1.3 Pengujian Parameter Model

Pengujian parameter bertujuan untuk menentukan apakah parameter model ARIMA yang diestimasi memiliki pengaruh signifikan terhadap model. Pilih \(\delta\) sebagai himpunan parameter model (yang terdiri atas \(\phi\) dan \(\theta\)) serta \(se(\hat{\delta})\) sebagai standar eror dari \(\hat{\delta}\). Tahapan pengujiannya adalah:

  1. Hipotesis: \[H_{0} : \delta = 0\] \[H_{1} : \delta \neq 0\]

  2. Taraf Signifikansi: \(\alpha = 0.05\)

  3. Statistik Uji: \[t_{hitung} = \frac{\hat{\delta}}{se(\hat{\delta})}\] Untuk perhitungan manual parameter, standar error parameter didapatkan melalui: \[SE(\text{parameter}) = \sqrt{\frac{1-(\text{parameter})^2}{n}}\]

  4. Daerah Penolakan: \(H_{0}\) ditolak jika \(|t_{hitung}| > t_{\alpha/2; db=n-n_{p}}\) dengan \(n\) adalah banyak data dan \(n_p\) adalah banyak parameter.

1.4 Uji Diagnostik Residual

Model dikatakan layak jika residualnya memenuhi asumsi White Noise, yaitu:

  1. Normalitas: Diuji dengan Jarque-Bera Test. Residual harus berdistribusi normal (\(p-value > \alpha\)).

  2. Independensi (Tidak ada autokorelasi): Diuji dengan Ljung-Box Test (\(p-value > \alpha\)).

  3. Homoskedastisitas (Varian konstan): Diuji dengan ARCH Test (\(p-value > \alpha\)).

1.5 Evaluasi Peramalan

Untuk mengukur akurasi dari peramalan (forecasting), digunakan beberapa metrik kesalahan pengukuran berikut:

  1. Mean Absolute Percent Error (MAPE): \[MAPE = \frac{1}{n}\sum_{k=1}^{n}\left|\frac{y_k - \hat{y}_k}{y_k}\right| \times 100\%\]
  2. Symmetric Mean Absolute Percent Error (SMAPE): \[SMAPE = \frac{1}{n}\sum_{k=1}^{n}\frac{|y_k - \hat{y}_k|}{\frac{|y_k + \hat{y}_k|}{2}} \times 100\%\]
  3. Root Mean Squared Error (RMSE): \[RMSE = \sqrt{\frac{\sum_{k=1}^{n}(y_k - \hat{y}_k)^2}{n}}\]

2 Metodologi Penelitian

2.1 Library yang Digunakan

library(tidyverse)
library(MASS)
library(forecast)
library(tseries)
library(lmtest)
library(FinTS)
library(knitr)

2.2 Data Penelitian

Data yang digunakan adalah harga saham AMRT periode 1 April 2024 - 26 Juni 2024 sebanyak 50 observasi yang diimpor dari file CSV. Frekuensi awal ini dibagi menjadi data training dan data testing dengan rasio 80:20, yaitu 40 data training dan 10 data testing.

# 1. Membaca file CSV
data_csv <- read.csv("D:/Komlan B/Sumber Alfaria Trijaya Stock Price History.csv", sep = ";")
head(data_csv)
##         Date Price  Open  High   Low   Vol. Change..
## 1 01/04/2024 2,910 2,910 2,920 2,890 43.18M    0.00%
## 2 02/04/2024 2,910 2,920 2,920 2,890 30.48M    0.00%
## 3 03/04/2024 2,890 2,910 2,910 2,880 36.87M   -0.69%
## 4 04/04/2024 2,900 2,900 2,910 2,880 18.54M    0.35%
## 5 05/04/2024 2,880 2,900 2,900 2,870  9.75M   -0.69%
## 6 16/04/2024 2,700 2,670 2,790 2,660 52.99M   -6.25%
# 2. Mengambil data dari kolom ke-2 (Kolom Price)
amrt_raw <- data_csv[, 2]

# 3. MENGUBAH TEKS JADI ANGKA MURNI
amrt_clean <- as.numeric(gsub(",", "", amrt_raw))

# 4. Mengubah data menjadi format Time Series
ts_amrt <- ts(amrt_clean)

# 5. Membagi data (45 training, 5 testing)
train_data <- window(ts_amrt, end = 40)
test_data <- window(ts_amrt, start = 41)

2.3 Langkah Analisis

  1. Melakukan identifikasi stasioneritas (plot data, Box-Cox, uji ADF).

  2. Melakukan transformasi dan differencing jika diperlukan.

  3. Mengidentifikasi kandidat model dari plot ACF dan PACF.

  4. Estimasi dan pengujian parameter model untuk mendapatkan model yang parameternya signifikan.

  5. Uji diagnostik residual model terpilih.

  6. Peramalan (forecasting) dan perhitungan tingkat kesalahan (MAPE, SMAPE, RMSE).

3 Hasil dan Pembahasan

3.1 Identifikasi Model dan Stasioneritas

Langkah pertama dalam pemodelan ARIMA adalah memastikan bahwa data telah stasioner, baik dalam varian maupun dalam rata-rata.

3.1.1 Uji Stasioneritas Varian (Box-Cox)

Untuk menguji apakah data sudah stasioner dalam varian, kita dapat melihat plot Box-Cox dan menghitung nilai \(\lambda\) (Lambda) optimalnya.

# Plot Box-Cox untuk melihat posisi lambda
boxcox(lm(train_data ~ 1), lambda = seq(-2, 6, 0.01))

# Menghitung Lambda optimal secara matematis
lambda_opt <- BoxCox.lambda(train_data)
cat("Nilai Lambda Optimal: ", lambda_opt, "\n")
## Nilai Lambda Optimal:  1.999924

Berdasarkan hasil uji Box-Cox, nilai \(\lambda\) optimal adalah 1.9999242. Karena nilai tersebut tidak sama dengan 1, maka data perlu ditransformasi untuk menstabilkan varian. Dengan hasil transformasi sebagai berikut.

# Melakukan transformasi Box-Cox pada data training
train_trans <- BoxCox(train_data, lambda = lambda_opt)

# Plot data hasil transformasi
autoplot(train_trans) +
  ggtitle("Plot Runtun Waktu Data Hasil Transformasi Box-Cox") +
  theme_minimal()

3.1.2 Uji Stasioneritas dalam Mean (Rata-rata)

Setelah varian stabil, kita perlu memastikan data stasioner dalam rata-rata menggunakan uji Augmented Dickey-Fuller (ADF)

# Uji ADF pada data transformasi
adf_trans <- adf.test(train_trans)
print(adf_trans)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_trans
## Dickey-Fuller = -2.399, Lag order = 3, p-value = 0.4169
## alternative hypothesis: stationary

Karena data hasil transformasi belum stasioner dalam mean (p-value = 0.4168766 > 0.05), maka perlu dilakukan proses differencing orde 1 untuk menstabilkan rata-ratanya. Dengan hasil differencing didapatkan sebagai berikut.

# Melakukan differencing orde 1 (d=1)
train_diff <- diff(train_trans, differences = 1)

# Plot data setelah differencing untuk melihat kestabilan secara visual
autoplot(train_diff) +
  ggtitle("Plot Runtun Waktu Data AMRT Setelah Differencing Orde 1") +
  theme_minimal()

# Uji formal menggunakan Augmented Dickey-Fuller (ADF) Test
adf_diff <- adf.test(train_diff)
print(adf_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train_diff
## Dickey-Fuller = -3.5986, Lag order = 3, p-value = 0.0461
## alternative hypothesis: stationary

Setelah dilakukan differencing, secara formal didapat nilai p-value = 0.0460958 < 0.05 dimana nilai ini menunjukkan bahwa data telah stasioner dalam mean.

3.2 Identifikasi Model (ACF dan PACF)

Setelah data stasioner melalui transformasi Box-Cox dan differencing orde 1 (\(d=1\)), langkah selanjutnya adalah menentukan orde Autoregressive (\(p\)) dan Moving Average (\(q\)) dengan mengamati plot korelasi.

# Menampilkan plot ACF dan PACF secara berdampingan
ggtsdisplay(train_diff, main = "Plot ACF dan PACF Data AMRT (Stasioner)")

Berdasarkan pengamatan pada plot ACF dan PACF di atas:PACF:

  • PACF: Terlihat garis terputus (cut off) pada lag 1, yang mengindikasikan kandidat orde \(p = 1\).
  • ACF: Terlihat garis terputus (cut off) pada lag 1, yang mengindikasikan kandidat orde \(q = 1\).

Kandidat model yang akan diuji adalah ARIMA(1,1,0), ARIMA(0,1,1), dan ARIMA(1,1,1).

3.3 Estimasi dan Pengujian Parameter Model

Tahap ini bertujuan untuk menentukan apakah parameter model ARIMA yang diestimasi memiliki pengaruh signifikan. Kita akan menguji ketiga kandidat model yang telah diidentifikasi.

# 1. Uji Model ARIMA(1,1,0)
mod1 <- Arima(train_data, order = c(1,1,0), lambda = lambda_opt, include.constant = FALSE)
cat("--- Signifikansi Parameter ARIMA(1,1,0) ---\n")
## --- Signifikansi Parameter ARIMA(1,1,0) ---
coeftest(mod1)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)  
## ar1 -0.35895    0.14741 -2.4351  0.01489 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 2. Uji Model ARIMA(0,1,1)
mod2 <- Arima(train_data, order = c(0,1,1), lambda = lambda_opt, include.constant = FALSE)
cat("\n--- Signifikansi Parameter ARIMA(0,1,1) ---\n")
## 
## --- Signifikansi Parameter ARIMA(0,1,1) ---
coeftest(mod2)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)   
## ma1 -0.47694    0.17226 -2.7686 0.005629 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
# 3. Uji Model ARIMA(1,1,1)
mod3 <- Arima(train_data, order = c(1,1,1), lambda = lambda_opt, include.constant = FALSE)
cat("\n--- Signifikansi Parameter ARIMA(1,1,1) ---\n")
## 
## --- Signifikansi Parameter ARIMA(1,1,1) ---
coeftest(mod3)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)    
## ar1  0.37615    0.25782  1.4590   0.1446    
## ma1 -0.81955    0.17669 -4.6385 3.51e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Berdasarkan hasil estimasi yang dilakukan pada ketiga kandidat model, didapatkan ringkasan sebagai berikut:

  1. Model ARIMA(1,1,0): Memiliki nilai signifikansi parameter \(ar1\) sebesar 0.01489. Karena nilai ini \(< 0.05\), maka parameter signifikan.
  2. Model ARIMA(0,1,1): Memiliki nilai signifikansi parameter \(ma1\) sebesar 0.00563. Karena nilai ini \(< 0.05\), maka parameter signifikan.
  3. Model ARIMA(1,1,1): Memiliki nilai signifikansi \(ar1\) sebesar 0.14458 dan \(ma1\) sebesar 0.0000035096. Karena parameter \(ar1 > 0.05\), maka model ini tidak memenuhi syarat signifikansi seluruh parameter.

Oleh karena itu, model yang layak untuk dilanjutkan ke tahap pengujian berikutnya adalah ARIMA(1,1,0) dan ARIMA(0,1,1). Untuk menentukan model terbaik di antara keduanya, kita membandingkan nilai AIC (Akaike Information Criterion).

3.4 Uji Diagnostik Residual

Tahap ini bertujuan untuk memastikan residual dari kedua kandidat model yang signifikan (ARIMA(1,1,0) dan ARIMA(0,1,1)) telah memenuhi asumsi White Noise, yaitu berdistribusi normal, tidak ada autokorelasi (independen), dan variannya konstan (homoskedastis).

# 1. Mengambil residual masing-masing model
res_mod1 <- residuals(mod1) # ARIMA(1,1,0)
res_mod2 <- residuals(mod2) # ARIMA(0,1,1)

# 2. Fungsi untuk menghitung p-value semua uji
hitung_asumsi <- function(res) {
  jb_p   <- jarque.bera.test(res)$p.value
  lb_p   <- Box.test(res, type = "Ljung-Box", lag = 10)$p.value
  arch_p <- ArchTest(res, lags = 1)$p.value
  return(c(Normalitas = jb_p, Independensi = lb_p, Homoskedastisitas = arch_p))
}

# 3. Membuat Tabel Perbandingan
tabel_asumsi <- data.frame(
  Asumsi = c("Normalitas (Jarque-Bera)", "Independensi (Ljung-Box)", "Homoskedastisitas (ARCH)"),
  ARIMA_1_1_0 = hitung_asumsi(res_mod1),
  ARIMA_0_1_1 = hitung_asumsi(res_mod2)
)

kable(tabel_asumsi, digits = 5, caption = "Perbandingan P-Value Uji Asumsi Kedua Kandidat Model")
Perbandingan P-Value Uji Asumsi Kedua Kandidat Model
Asumsi ARIMA_1_1_0 ARIMA_0_1_1
Normalitas Normalitas (Jarque-Bera) 0.09404 0.02167
Independensi Independensi (Ljung-Box) 0.96737 0.97565
Homoskedastisitas.Chi-squared Homoskedastisitas (ARCH) 0.98852 0.87400

Berdasarkan tabel perbandingan uji asumsi di atas, diperoleh hasil sebagai berikut:

  1. Uji Normalitas: Model ARIMA(1,1,0) memiliki nilai \(p\)-value sebesar 0.09404 (\(> 0.05\)) sehingga memenuhi asumsi normalitas. Sedangkan model ARIMA(0,1,1) memiliki nilai \(p\)-value sebesar 0.02167 (\(< 0.05\)) yang berarti tidak memenuhi asumsi normalitas.
  2. Uji Independensi: Kedua model memenuhi asumsi independensi karena tidak terdapat autokorelasi pada residual. Hal ini ditunjukkan oleh nilai \(p\)-value \(> 0.05\), yaitu sebesar 0.96737 untuk ARIMA(1,1,0) dan 0.97565 untuk ARIMA(0,1,1).
  3. Uji Homoskedastisitas: Kedua model memenuhi asumsi homoskedastisitas (varian konstan) karena memiliki nilai \(p\)-value \(> 0.05\), yaitu sebesar 0.98852 untuk ARIMA(1,1,0) dan 0.874 untuk ARIMA(0,1,1).

Berdasarkan hasil uji diagnostik residual, model ARIMA(0,1,1) dinyatakan gugur karena gagal memenuhi asumsi normalitas. Sebaliknya, model ARIMA(1,1,0) berhasil memenuhi seluruh asumsi White Noise. Oleh karena itu, model ARIMA(1,1,0) secara mutlak ditetapkan sebagai model terbaik dan akan digunakan pada tahap peramalan (forecasting).

3.5 Peramalan (Forecasting)

Setelah mendapatkan model terbaik yang memenuhi semua asumsi kelayakan, yaitu ARIMA(1,1,0), langkah selanjutnya adalah menggunakan model tersebut untuk meramalkan harga saham AMRT pada 10 periode ke depan. Hasil peramalan ini akan dibandingkan dengan data aktual (testing data pada observasi ke-41 hingga 50) untuk mengevaluasi tingkat akurasi model.

# 1. Melakukan peramalan 10 hari ke depan
fc_final <- forecast(mod1, h = 10)

# 2. Membuat tabel hasil evaluasi beserta perhitungan metrik error
hasil_evaluasi <- data.frame(
  Data_Ke = 41:50,
  Aktual = as.numeric(test_data),
  Ramalan = as.numeric(fc_final$mean)
) %>%
  mutate(
    Error = Aktual - Ramalan,
    APE = abs(Error / Aktual) * 100,
    SAPE = (abs(Error) / ((Aktual + Ramalan) / 2)) * 100,
    SE = Error^2
  )

# 3. Menghitung nilai rata-rata metrik evaluasi
mape_val <- mean(hasil_evaluasi$APE)
smape_val <- mean(hasil_evaluasi$SAPE)
rmse_val <- sqrt(mean(hasil_evaluasi$SE))

# 4. Menampilkan tabel perbandingan (Aktual vs Ramalan dan Error)
kable(hasil_evaluasi[, 1:4], digits = 2, caption = "Tabel Perbandingan Harga Aktual vs Ramalan")
Tabel Perbandingan Harga Aktual vs Ramalan
Data_Ke Aktual Ramalan Error
41 2740 2785.71 -45.71
42 2730 2790.85 -60.85
43 2720 2789.00 -69.00
44 2720 2789.66 -69.66
45 2710 2789.43 -79.43
46 2720 2789.51 -69.51
47 2700 2789.48 -89.48
48 2740 2789.49 -49.49
49 2720 2789.49 -69.49
50 2730 2789.49 -59.49

Untuk melihat pergerakan hasil peramalan secara visual dibandingkan dengan data historis dan data aktual, dapat dilihat pada plot berikut:

# Membuat plot peramalan vs aktual
autoplot(fc_final) +
  autolayer(test_data, series = "Data Aktual") +
  ggtitle("Plot Peramalan Harga Saham AMRT dengan ARIMA(1,1,0)") +
  xlab("Waktu") + ylab("Harga Saham") +
  theme_minimal()

Berdasarkan perhitungan evaluasi peramalan, diperoleh tingkat kesalahan model sebagai berikut:

MAPE (Mean Absolute Percentage Error): 2.43%

SMAPE (Symmetric Mean Absolute Percentage Error): 2.4%

RMSE (Root Mean Squared Error): 67.36

Nilai MAPE yang berada di bawah 10% menunjukkan bahwa model ARIMA(1,1,0) memiliki kriteria akurasi yang Sangat Baik dalam memprediksi harga saham AMRT.

4 Kesimpulan

Berdasarkan serangkaian analisis runtun waktu yang telah dilakukan terhadap data harga saham Sumber Alfaria Trijaya (AMRT) periode 1 April - 26 Juni 2024, dapat ditarik beberapa kesimpulan sebagai berikut:

  1. Data awal harga saham AMRT tidak stasioner dalam varian dan rata-rata. Kestabilan varian dicapai melalui transformasi Box-Cox dengan nilai \(\lambda = 1.99992\), sedangkan kestabilan rata-rata (mean) dicapai melalui proses diferensiasi orde pertama (\(d=1\)).

  2. Identifikasi melalui plot ACF dan PACF serta pengujian parameter menghasilkan model ARIMA(1,1,0) tanpa konstanta sebagai model yang optimal. Parameter pada model ini terbukti signifikan (\(p\)-value \(< 0.05\)) dan residual model telah memenuhi seluruh asumsi kelayakan diagnostik (White Noise), yaitu berdistribusi normal, independen (tidak ada autokorelasi), dan homoskedastis (varian konstan).

  3. Evaluasi akurasi peramalan pada 10 data testing menunjukkan performa prediksi yang sangat akurat dengan tingkat kesalahan MAPE sebesar 2.43%, SMAPE sebesar 2.4%, dan RMSE sebesar 67.36. Dengan tingkat kesalahan yang sangat kecil tersebut, model ARIMA(1,1,0) dinyatakan sangat layak dan direkomendasikan untuk digunakan dalam meramalkan pergerakan harga saham AMRT di masa mendatang.