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:
# 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 outputData 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
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")| 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).
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"))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}\]
##
## Augmented Dickey-Fuller Test
##
## data: harga_penutupan
## Dickey-Fuller = -1.7211, Lag order = 7, p-value = 0.6961
## alternative hypothesis: stationary
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")| 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.
Model ARIMA dipilih berdasarkan nilai AIC (Akaike Information Criterion) terkecil (Akaike, 1974).
## 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
## 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.
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.
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)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"
)##
## *---------------------------------*
## * 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).
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:
## 1971-04-23
## T+1 31.03723
## T+2 49.88246
## T+3 64.27518
## T+4 75.26737
## T+5 83.66246
# 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"))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"))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"))| 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 ✓ |
Dokumen ini dibuat menggunakan R Markdown dan dapat dipublikasikan ke RPubs.