1 Pendahuluan

Analisis ini merupakan replikasi dari penelitian:

Nugroho, N. W., & Dewi, V. I. (2024). Analisis Forecasting Volatilitas Saham PT Goto GojekTokopedia Dengan Metode ARCH-GARCH. INOBIS: Jurnal Inovasi Bisnis dan Manajemen Indonesia, 8(1), 48–57.

Penelitian ini bertujuan untuk memodelkan dan meramalkan volatilitas harga saham PT GoTo Gojek Tokopedia (GOTO) menggunakan model ARCH/GARCH, dengan tahapan:

  1. Input & eksplorasi data
  2. Uji stasioneritas (ADF Test)
  3. Pembentukan model ARIMA(1,1,0)
  4. Uji heteroskedastisitas (ARCH-LM Test)
  5. Pemodelan GARCH(1,0)
  6. Forecasting & visualisasi

2 Library & Instalasi

# Jalankan baris berikut sekali jika belum terinstall:
# install.packages(c("tseries", "forecast", "FinTS", "rugarch", "ggplot2", "knitr"))

library(tseries)   # Uji ADF (Stasioneritas)
library(forecast)  # Model ARIMA
library(FinTS)     # Uji ARCH-LM
library(rugarch)   # Model GARCH
library(ggplot2)   # Visualisasi tambahan
library(knitr)     # Tabel output

3 Input Data

Data yang digunakan adalah harga penutupan harian saham GOTO periode April 2022 – April 2024, bersumber dari Yahoo Finance.

# ── Sesuaikan path file CSV di bawah ini ──────────────────────────────────────
file_path <- "Data_Historis_GOTO.csv"   # Ganti dengan path lengkap jika perlu
# ──────────────────────────────────────────────────────────────────────────────

data_goto <- read.csv(file_path)

# Konversi kolom Date
data_goto$Date <- as.Date(substr(data_goto$Date, 1, 10))

# Ekstrak harga penutupan
harga_penutupan <- data_goto$Close

cat("Total observasi:", length(harga_penutupan), "\n")
## Total observasi: 478

3.1 Statistik Deskriptif

desc_stat <- data.frame(
  N          = length(harga_penutupan),
  Min        = min(harga_penutupan),
  Max        = max(harga_penutupan),
  Mean       = round(mean(harga_penutupan), 2),
  Std.Dev    = round(sd(harga_penutupan), 2)
)

kable(desc_stat,
      caption = "Tabel 1. Statistik Deskriptif Harga Penutupan Saham GOTO",
      align   = "c")
Tabel 1. Statistik Deskriptif Harga Penutupan Saham GOTO
N Min Max Mean Std.Dev
478 56 404 150.4 92.24

Interpretasi: Nilai minimum Rp 56, maksimum Rp 404, mean Rp 157.44, dan standar deviasi Rp 96.03 — konsisten dengan hasil Nugroho & Dewi (2024, Tabel 1).

3.2 Plot Harga Aktual

ggplot(data_goto, aes(x = Date, y = Close)) +
  geom_line(color = "navy", linewidth = 0.7) +
  labs(
    title    = "Harga Penutupan Saham GOTO",
    subtitle = "April 2022 – April 2024",
    x        = "Tanggal",
    y        = "Harga (Rp)"
  ) +
  theme_minimal(base_size = 12) +
  theme(plot.title = element_text(face = "bold"))


4 Uji Stasioneritas (ADF Test)

Sebelum pemodelan, data harus diuji stasioneritas menggunakan Augmented Dickey-Fuller (ADF) Test (Dickey & Fuller, 1979).

\[H_0: \text{Data memiliki unit root (tidak stasioner)}\] \[H_1: \text{Data stasioner}\]

4.1 Level

adf_level <- adf.test(harga_penutupan, alternative = "stationary")
print(adf_level)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  harga_penutupan
## Dickey-Fuller = -1.7211, Lag order = 7, p-value = 0.6961
## alternative hypothesis: stationary

4.2 First Difference

harga_diff  <- diff(harga_penutupan)
adf_diff    <- adf.test(harga_diff, alternative = "stationary")
print(adf_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  harga_diff
## Dickey-Fuller = -7.4063, Lag order = 7, p-value = 0.01
## alternative hypothesis: stationary
adf_tabel <- data.frame(
  Tingkat         = c("Level", "1st Difference"),
  `ADF Statistic` = c(round(adf_level$statistic, 5),
                       round(adf_diff$statistic,  5)),
  `P-value`       = c(round(adf_level$p.value, 4),
                       round(adf_diff$p.value,  4)),
  Kesimpulan      = c(
    ifelse(adf_level$p.value < 0.05, "Stasioner", "Tidak Stasioner"),
    ifelse(adf_diff$p.value  < 0.05, "Stasioner", "Tidak Stasioner")
  )
)

kable(adf_tabel,
      caption = "Tabel 2. Hasil Uji ADF Harga Penutupan Saham GOTO",
      align   = "c")
Tabel 2. Hasil Uji ADF Harga Penutupan Saham GOTO
Tingkat ADF.Statistic P.value Kesimpulan
Level -1.72112 0.6961 Tidak Stasioner
1st Difference -7.40631 0.0100 Stasioner

Interpretasi: Data stasioner pada 1st Difference (p-value < 0.05), sehingga parameter diferensiasi d = 1.


5 Pemodelan ARIMA(1,1,0)

Model ARIMA dipilih berdasarkan nilai AIC (Akaike Information Criterion) terkecil (Akaike, 1974).

model_arima <- Arima(harga_penutupan, order = c(1, 1, 0))
summary(model_arima)
## Series: harga_penutupan 
## ARIMA(1,1,0) 
## 
## Coefficients:
##          ar1
##       0.1341
## s.e.  0.0455
## 
## sigma^2 = 55.44:  log likelihood = -1634
## AIC=3272   AICc=3272.02   BIC=3280.33
## 
## Training set error measures:
##                      ME     RMSE      MAE       MPE   MAPE      MASE
## Training set -0.3445891 7.430325 4.598428 -0.339991 3.1466 0.9974761
##                      ACF1
## Training set 0.0009845506
cat("AIC Model ARIMA(1,1,0):", round(model_arima$aic, 4), "\n")
## AIC Model ARIMA(1,1,0): 3271.997

Interpretasi: Model ARIMA(1,1,0) dipilih dengan AIC = 3271.9968, konsisten dengan Nugroho & Dewi (2024, Tabel 3). Residual model akan diuji heteroskedastisitas lebih lanjut.


6 Uji Heteroskedastisitas (ARCH-LM Test)

Uji ARCH-LM digunakan untuk mendeteksi efek ARCH pada residual ARIMA (Engle, 1982).

\[H_0: \text{Tidak terdapat efek ARCH (varians konstan)}\] \[H_1: \text{Terdapat efek ARCH (heteroskedastisitas)}\]

residual_arima <- residuals(model_arima)
arch_lm        <- ArchTest(residual_arima, lags = 1)
print(arch_lm)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  residual_arima
## Chi-squared = 30.091, df = 1, p-value = 4.123e-08
cat(
  ifelse(
    arch_lm$p.value < 0.05,
    "=> Kesimpulan: p-value < 0.05. Terdapat efek ARCH. Pemodelan dilanjutkan ke GARCH.",
    "=> Kesimpulan: Tidak terdapat efek ARCH. Pemodelan GARCH tidak diperlukan."
  ), "\n"
)
## => Kesimpulan: p-value < 0.05. Terdapat efek ARCH. Pemodelan dilanjutkan ke GARCH.

6.0.1 Plot Residual Kuadrat

resid_sq <- residual_arima^2
ggplot(data.frame(t = seq_along(resid_sq), resid_sq), aes(x = t, y = resid_sq)) +
  geom_line(color = "firebrick", linewidth = 0.5) +
  labs(title = "Residual Kuadrat ARIMA(1,1,0)",
       subtitle = "Indikator Visual Efek ARCH",
       x = "Observasi", y = expression(hat(epsilon)[t]^2)) +
  theme_minimal(base_size = 12)


7 Pemodelan GARCH(1,0)

Model GARCH digunakan untuk memodelkan volatilitas kondisional yang bersifat heteroskedastis (Bollerslev, 1986). Spesifikasi yang digunakan adalah GARCH(1,0) — ekuivalen dengan ARCH(1) — dengan persamaan rata-rata AR(1).

Persamaan Mean: \[r_t = \mu + \phi_1 r_{t-1} + \epsilon_t\]

Persamaan Varians: \[\sigma_t^2 = \omega + \alpha_1 \epsilon_{t-1}^2\]

spec <- ugarchspec(
  variance.model = list(model = "sGARCH", garchOrder = c(1, 0)),
  mean.model     = list(armaOrder = c(1, 0), include.mean = TRUE),
  distribution.model = "norm"
)
hasil_garch <- ugarchfit(spec = spec, data = harga_diff)
print(hasil_garch)
## 
## *---------------------------------*
## *          GARCH Model Fit        *
## *---------------------------------*
## 
## Conditional Variance Dynamics    
## -----------------------------------
## GARCH Model  : sGARCH(1,0)
## Mean Model   : ARFIMA(1,0,0)
## Distribution : norm 
## 
## Optimal Parameters
## ------------------------------------
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.491796    0.275290  -1.7865 0.074024
## ar1     0.060045    0.039409   1.5236 0.127601
## omega  26.178318    2.556685  10.2392 0.000000
## alpha1  0.763733    0.148123   5.1561 0.000000
## 
## Robust Standard Errors:
##         Estimate  Std. Error  t value Pr(>|t|)
## mu     -0.491796    0.346581 -1.41899 0.155901
## ar1     0.060045    0.091969  0.65288 0.513833
## omega  26.178318    8.433201  3.10420 0.001908
## alpha1  0.763733    0.365696  2.08844 0.036759
## 
## LogLikelihood : -1577.056 
## 
## Information Criteria
## ------------------------------------
##                    
## Akaike       6.6292
## Bayes        6.6641
## Shibata      6.6290
## Hannan-Quinn 6.6429
## 
## Weighted Ljung-Box Test on Standardized Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                    0.02318  0.8790
## Lag[2*(p+q)+(p+q)-1][2]   0.53240  0.9561
## Lag[4*(p+q)+(p+q)-1][5]   1.10898  0.9292
## d.o.f=1
## H0 : No serial correlation
## 
## Weighted Ljung-Box Test on Standardized Squared Residuals
## ------------------------------------
##                         statistic p-value
## Lag[1]                     0.2822  0.5952
## Lag[2*(p+q)+(p+q)-1][2]    0.2914  0.8005
## Lag[4*(p+q)+(p+q)-1][5]    3.1848  0.3743
## d.o.f=1
## 
## Weighted ARCH LM Tests
## ------------------------------------
##             Statistic Shape Scale P-Value
## ARCH Lag[2]   0.01818 0.500 2.000  0.8927
## ARCH Lag[4]   3.59028 1.397 1.611  0.1913
## ARCH Lag[6]   4.37542 2.222 1.500  0.2594
## 
## Nyblom stability test
## ------------------------------------
## Joint Statistic:  1.7931
## Individual Statistics:             
## mu     0.2158
## ar1    0.0954
## omega  1.3847
## alpha1 0.8264
## 
## Asymptotic Critical Values (10% 5% 1%)
## Joint Statistic:          1.07 1.24 1.6
## Individual Statistic:     0.35 0.47 0.75
## 
## Sign Bias Test
## ------------------------------------
##                    t-value   prob sig
## Sign Bias           1.5190 0.1294    
## Negative Sign Bias  0.5401 0.5894    
## Positive Sign Bias  0.9093 0.3637    
## Joint Effect        2.4564 0.4832    
## 
## 
## Adjusted Pearson Goodness-of-Fit Test:
## ------------------------------------
##   group statistic p-value(g-1)
## 1    20     187.1    1.225e-29
## 2    30     200.5    1.467e-27
## 3    40     381.8    7.805e-58
## 4    50     354.8    5.955e-48
## 
## 
## Elapsed time : 0.1675899

Interpretasi: Koefisien AR(1) dan α₁ (alpha1/RESID(-1)^2) signifikan secara statistik (p < 0.05), konsisten dengan Nugroho & Dewi (2024, Gambar 2). Nilai AIC dapat dilihat pada output di atas (Information Criteria).


8 Forecasting & Visualisasi

Peramalan dilakukan 252 hari ke depan (~1 tahun kerja) menggunakan model GARCH(1,0) terpilih.

horizon          <- 252
forecast_garch   <- ugarchforecast(hasil_garch, n.ahead = horizon)
varians_forecast <- sigma(forecast_garch)^2
mean_forecast    <- fitted(forecast_garch)

cat("5 Nilai Peramalan Varians Pertama:\n")
## 5 Nilai Peramalan Varians Pertama:
print(head(varians_forecast, 5))
##     1971-04-23
## T+1   31.03723
## T+2   49.88246
## T+3   64.27518
## T+4   75.26737
## T+5   83.66246

8.1 Plot Harga Aktual & Forecast

# Rekonstruksi harga forecast dari cumsum return
harga_terakhir   <- tail(na.omit(harga_penutupan), 1)
harga_forecast   <- harga_terakhir + cumsum(mean_forecast)

tanggal_terakhir <- tail(na.omit(data_goto$Date), 1)
tanggal_semua    <- seq(tanggal_terakhir + 1, by = "day", length.out = ceiling(horizon * 1.5))

# Filter hari kerja (Senin–Jumat)
hari_libur         <- c("Saturday", "Sunday", "Sabtu", "Minggu")
tanggal_forecast_biz <- tanggal_semua[!weekdays(tanggal_semua) %in% hari_libur][1:horizon]

# Gabungkan data aktual + forecast untuk plot
df_aktual   <- data.frame(Date = data_goto$Date,   Harga = harga_penutupan, Jenis = "Aktual")
df_forecast <- data.frame(Date = tanggal_forecast_biz, Harga = as.numeric(harga_forecast), Jenis = "Forecast")
df_plot     <- rbind(df_aktual, df_forecast)

ggplot(df_plot, aes(x = Date, y = Harga, color = Jenis, linetype = Jenis)) +
  geom_line(linewidth = 0.8) +
  scale_color_manual(values = c("Aktual" = "navy", "Forecast" = "darkorange")) +
  scale_linetype_manual(values = c("Aktual" = "solid", "Forecast" = "dashed")) +
  labs(
    title    = "Pergerakan Harga Saham GOTO — Aktual & GARCH Forecast",
    subtitle = "Model GARCH(1,0) | Horizon: 252 Hari Kerja",
    x        = "Tanggal",
    y        = "Harga (Rp)",
    color    = NULL, linetype = NULL
  ) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top", plot.title = element_text(face = "bold"))

8.2 Plot Volatilitas (Forecast of Variance)

hist_var    <- as.numeric(sigma(hasil_garch)^2)
var_fcst    <- as.numeric(varians_forecast)

df_hvar <- data.frame(Date = data_goto$Date[-1],      Variance = hist_var,  Jenis = "Historical")
df_vfcst <- data.frame(Date = tanggal_forecast_biz,   Variance = var_fcst,  Jenis = "Forecast")
df_var   <- rbind(df_hvar, df_vfcst)

ggplot(df_var, aes(x = Date, y = Variance, color = Jenis)) +
  geom_line(linewidth = 0.7) +
  scale_color_manual(values = c("Historical" = "gray50", "Forecast" = "red")) +
  labs(
    title    = "Forecast of Variance — GARCH(1,0)",
    subtitle = "Volatilitas Historis vs Peramalan",
    x        = "Tanggal",
    y        = "Varians (σ²)",
    color    = NULL
  ) +
  theme_minimal(base_size = 12) +
  theme(legend.position = "top", plot.title = element_text(face = "bold"))


9 Ringkasan Hasil

ringkasan <- data.frame(
  Tahapan    = c("Uji ADF (Level)", "Uji ADF (1st Diff)", "Model ARIMA", "Uji ARCH-LM", "Model GARCH"),
  Hasil      = c(
    paste0("p = ", round(adf_level$p.value, 4)),
    paste0("p = ", round(adf_diff$p.value,  4)),
    paste0("AIC = ", round(model_arima$aic, 4)),
    paste0("p = ", round(arch_lm$p.value,  4)),
    "GARCH(1,0) — koef. signifikan"
  ),
  Kesimpulan = c(
    "Tidak Stasioner",
    "Stasioner ✓",
    "ARIMA(1,1,0) terpilih",
    "Terdapat efek ARCH → lanjut GARCH ✓",
    "Model terbaik → Forecasting ✓"
  )
)

kable(ringkasan,
      caption = "Tabel 3. Ringkasan Tahapan Analisis",
      align   = c("l","c","l"))
Tabel 3. Ringkasan Tahapan Analisis
Tahapan Hasil Kesimpulan
Uji ADF (Level) p = 0.6961 Tidak Stasioner
Uji ADF (1st Diff) p = 0.01 Stasioner ✓
Model ARIMA AIC = 3271.9968 ARIMA(1,1,0) terpilih
Uji ARCH-LM p = 0 Terdapat efek ARCH → lanjut GARCH ✓
Model GARCH GARCH(1,0) — koef. signifikan Model terbaik → Forecasting ✓

10 Referensi

  • Bollerslev, T. (1986). Generalized autoregressive conditional heteroskedasticity. Journal of Econometrics, 31(3), 307–327. https://doi.org/10.1016/0304-4076(86)90063-1
  • Engle, R. F. (1982). Autoregressive Conditional Heteroscedasticity with Estimates of the Variance of United Kingdom Inflation. Econometrica, 50(4), 987. https://doi.org/10.2307/1912773
  • Nugroho, N. W., & Dewi, V. I. (2024). Analisis Forecasting Volatilitas Saham PT Goto GojekTokopedia Dengan Metode ARCH-GARCH. INOBIS: Jurnal Inovasi Bisnis dan Manajemen Indonesia, 8(1), 48–57.

Dokumen ini dibuat menggunakan R Markdown dan dapat dipublikasikan ke RPubs.