IHSG Time Series Analysis

Kelompok 6 MPDW

2022-09-25

Anggota Kelompok 6

NIM Nama
G1401201004 Alfidhia Rahman Nasa Juhanda
G1401201017 Ervina Dwi Anggrahini
G1401201024 Nanda Putri Cintari
G1401201054 Fransiska Agustina Siahaan
G1401201102 Kayla Fakhriya Jasmine

Pendahuluan

Covid-19 (Coronavirus Disease 2019) adalah penyakit akibat serangan virus SARS Cov-2 (Severe Acute Respiratory Syndrome Coronavirus 2) yang menyebar luas ke seluruh dunia secara tepat di tahun 2020. Kasus covid-19 pertama terjadi di Indonesia pada 2 Maret 2020. Banyak dampak yang diberikan oleh Virus Covid ini, termasuk pada sektor ekonomi. Ekonomi Indonesia sempat mengalami resesi disebabkan oleh pemberlakuan Pembatasan Sosial Berskala Besar (PSBB). PSBB ini menyebabkan pergerakan ekonomi menjadi sangat terbatas sehingga membuat banyak perusahaan mengalami defisit yang cukup signifikan. Hal ini juga berdampak terhadap kepercayaan investor terhadap ekonomi sehingga mereka cenderung melakukan penarikan dana Investasinya. Oleh karena hal tersebut, dampak nyatanya adalah anjloknya nilai Indek Harga Saham Gabungan (IHSG) yang terjadi sesaat setelah menyebarnya kasus covid pertama di Indonesia.

Indeks Harga Saham Gabungan (IHSG) adalah suatu rangkaian informasi historis mengenai pergerakan harga saham gabungan sampai tanggal tertentu dan mencerminkan suatu nilai yang berfungsi sebagai pengukuran kinerja suatu saham gabungan di bursa efek (Puspitasari et al. 2012). Sebelum terjadi pandemi, nilai IHSG (pada Desember 2019) berada di kisaran 6299.54. Kemudian, nilai IHSG mendadak tidak stabil pada Maret 2020 menjadi 4538.93. Ketidakstabilan nilai IHSG ini berdampak besar terhadap perekonomian Indonesia. Oleh karena itu, penting untuk meramalkan nilai IHSG dalam beberapa periode kedepan untuk menentukan kebijakan dan strategi yang tepat agar masyarakat terutama investor dapat meminimalkan kerugian dan mengoptimalkan keuntungan khususnya saat pandemi Covid-19.

Analisis deret waktu pada dasarnya digunakan untuk melakukan analisis data yang mempertimbangkan pengaruh waktu. Data dapat disebut sebagai data deret waktu apabila data tersedia secara periodik berdasarkan urutan waktu, bisa dalam jam, hari, minggu, bulan, kuartal, dan tahun. Analisis deret waktu memiliki tujuan untuk membantu dalam menyusun perencanaan ke depan. Pada data model stokastik terdapat beberapa model yang dapat digunakan seperti AR, MA, ARMA, ARMA, SARIMA dan lainnya. Model ARIMA dilakukan pada data stasioner atau data yang dilakukan differencing sehingga data telah stasioner. Secara umum, model ARIMA dinotasikan sebagai ARIMA(p, d, q). Model ini merupakan gabungan dari model ARMA(p, q) dan proses differencing (Ukhra 2014).

Data yang digunakan pada analisis kali ini merupakan data yang bersumber dari Yahoo Finance, yaitu Data mingguan harga penutupan pada IHSG (closing price) dengan jangka waktu dari September 2020 hingga 2022. Harga penutupan adalah harga surat berharga yang diperdagangkan pada akhir hari kerja perdagangan. Harga penutupan dianggap valuasi yang paling akurat dari suatu saham dan sangat berguna bagi para investor untuk mengakses perubahan yang terjadi pada harga saham.

Analisis yang dilakukan pada data deret waktu harga penutupan IHSG bertujuan untuk mendapatkan model ARIMA terbaik yang digunakan untuk melakukan peramalan pada data tersebut.

Tinjauan Pustaka

Double Moving Average (DMA)

Metode DMA merupakan metode yang menghitung rata-rata bergerak yang kedua atau menghitung rata-rata bergerak dari rata-rata bergerak SMA. DMA diperlukan untuk dapat mengakumulasi dan mengakomodir trend yang ada (Jana et al. 2015). \[ \text{Proses Pemulusan:} \\S'_t=\frac{X_t+X_{t-1}+...+X_{t-N-1}}{N} \\S''_t=\frac{S'_t+S'_{t-1}+...+S'_{t-N-1}}{N}\\ \text{Forecasting:} \\F_{t-m}=a_t+b_tm \\\text{dimana:} \\a_t=2S'_t-S''_t \\b_t=\frac{2}{N-1}(S'_t-S''_t) \]

Double Exponential Smoothing (DES)

DES merupakan metode peramalan data yang mengalami trend kenaikan dan apabila data yang digunakan semakin banyak dalam perhitungan peramalannya maka error peramalannya akan semakin kecil, begitu juga sebaliknya. \[ \text{Proses Pemulusan:} \\\tilde{y}_T=\lambda y_{T-1} \\\tilde{y}_T^{(2)}=\lambda \tilde{y}_T^{(1)}+(1-\lambda)\tilde{y}_{T-1}^{(2)} \\\text{Dengan initial value dari:} \\\tilde{y}_0^{(1)}=\hat{\beta}_{0,0}-\frac{1-\lambda}{\lambda} \hat{\beta}_{1,0} \\\tilde{y}_0^{(2)}=\hat{\beta}_{0,0}-2(\frac{1-\lambda}{\lambda})\hat{\beta}_{1,0} \\ \\\text{Forecasting:} \\e_{\tau}(1)=y_{T+1}-\hat{y}_{T+1}(T) \\\hat{y}_{T+\tau}(\tau)=(2\tilde{y}_T^{(1)}-\tilde{y}_T^{(2)})+\tau\frac{\lambda}{1-\lambda}(\tilde{y}_T^{(1)}-\tilde{y}_T^{(2)}) \\\hat{y}_{T+\tau}(\tau)=(2+\frac{\lambda}{1-\lambda}\tau)\tilde{y}_T^{(1)}-(1+\frac{\lambda}{1-\lambda}\tau)\tilde{y}_T^{(2)} \]

Data Stasioner

Data Stasioner merupakan data deret waktu yang memiliki ciri-ciri statistik dasar seperti nilai tengah dan ragam yang tetap (konstan) sepanjang waktu. Menurut Pramujo et. al (2014), keStasioneran data deret waktu memiliki arti bahwa dalam data tersebut tidak terdapat pertumbuhan atau penurunan secara signifikan dan tidak memiliki kecenderungan terhadap trend tertentu. Dengan kata lain, fluktuasi data berada di sekitar suatu nilai rata-rata yang konstan, tidak bergantung pada waktu maupun ragam dari fluktuasi tersebut. Pada dasarnya, data Stasioner dibagi menjadi dua, yaitu Stasioner dalam mean (rata-rata) dan Stasioner dalam variance (ragam). Apabila data Stasioner dalam rata-rata, maka terjadi fluktuasi data di sekitar suatu nilai rata-rata yang konstan. Sedangkan data Stasioner dalam ragam, yaitu data yang dari waktu ke waktu mempunyai fluktuasi yang tetap atau konstan dan tidak berubah-ubah (Pramujo et. al 2014).

Model Autoregressive Integrated Moving Average (ARIMA)

Metode Autoregressive Integrated Moving Average (ARIMA) adalah model peramalan yang sering digunakan dalam pemodelan time series dan menghasilkan ramalan-ramalan berdasarkan sintesis dari pola data secara historis. Metode ARIMA sering digunakan untuk peramalan di berbagai bidang, salah satunya bidang transportasi (Nurjanah, et al. 2018). Model peramalan univariate time series yang memadukan antara model Autoregressive (AR), model Moving Average (MA) dan model campuran autoregressive moving average (ARMA) untuk data yang tidak stasioner. Bentuk umum ARIMA (p, d, q) sebagai berikut:

\[ \phi_p(B)Y_t^*=\theta_0+\theta_q(B)e_t\\ \] \[ \begin{aligned} \text{Dengan:}\\ Y_t^*&= \text{ data deret waktu yang telah dilakukan differencing}\\ \phi_p(B)&=1-\phi_1B-\phi_2B^2-...-\phi_pB^p\\ \phi_q(B)&=1-\phi_1B-\phi_2B^2-...-\phi_qB^q\\ (1-B)^d&=\text{ differencing non-musiman pada orde ke-d}\\ e_t&=\text{ nilai kesalahan pada waktu ke-t} \end{aligned} \] Di mana nilai \(d>0\), untuk \(d=0\) model stasioner sama dengan \(ARMA(p,q)\).

Pembedaan (differencing) dengan lag-d dilakukan untuk menstasionerkan data. Konsep differencing adalah mengurangkan antara pengamatan Yt dengan pengamatan sebelumnya yaitu Yt-1. Metode estimasi maximum likelihood masih dianggap metode estimasi parameter ARIMA yang efisien (As’ad, et al. 2017).

Augmented Dickey-Fuller (ADF)

Uji Augmented Dickey Fuller (ADF) merupakan pengujian yang dilakukan terhadap data deret waktu (time series) untuk mengetahui apakah data deret waktu tersebut stationer atau tidak. Tidak semua proses runtun waktu dapat direpresentasikan dengan baik menggunakan model AR(1). Jika model merupakan suatu autoregresif tingkat p, dengan p ≥ 1, Dickey dan Fuller menambahkan tiga statistik-F untuk uji hipotesis gabungan (joint hypotesis) pada koefisien-koefisien model autoregresif yang terbentuk. Uji akar-akar unit metode Dickey-Fuller untuk model autoregresif tingkat p dengan p ≥ 1 dikenal sebagai uji Dickey-Fuller diperluas (Augmented Dickey-Fuller Test) (Rusdi, 2011).

Teknik Interpolasi

Teknik interpolasi memperkirakan nilai yang hilang dengan mengasumsikan hubungan dalam rentang titik data. Interpolasi adalah perkiraan suatu nilai tengah dari suatu set nilai yang diketahui. Dalam teknik statistik bergulir di mana hanya nilai-nilai sebelumnya yang dianggap memperhitungkan nilai yang hilang, teknik interpolasi memperkirakan dengan titik data masa lalu dan masa akan datang yang diketahui. Interpolasi memiliki berbagai metode:

  • Linier: Mengasumsikan hubungan linier b/w rentang titik data

  • Spline: Memperkirakan nilai yang meminimalkan kelengkungan keseluruhan sehingga memperoleh permukaan halus yang melewati titik input.

  • Waktu: Memperkirakan nilai yang hilang dengan lebih fokus pada titik terdekat daripada titik jauh. Ada berbagai teknik interpolasi lain yang dapat digunakan untuk menghitung nilai yang hilang.

Semua ini mengasumsikan bahwa titik data yang berdekatan serupa, yang tidak selalu demikian. Menurut Fatimah (2015), berdasarkan derajat polinomial interpolasi dibagi menjadi empat macam yaitu:

  1. Interpolasi Linear merupakan interpolasi untuk polinomial berderajat satu.

  2. Interpolasi Kuadrat merupakan interpolasi untuk polinomial berderajat dua.

  3. Interpolasi Lagrange merupakan interpolasi untuk polinomial berderajat m-1 jika diberikan n titik, yaitu 𝑥1, 𝑥2, …, 𝑥𝑛.

  4. Interpolasi Newton merupakan interpolasi untuk polinomial berderajat m jika diberikan n+1 titik, yaitu 𝑥0, 𝑥1, 𝑥2,… , 𝑥𝑛.

Differencing/Pembedaan

Teknik Differencing (Pembedaan) dapat membantu menstabilkan nilai rata-rata deret waktu dengan menghilangkan perubahan tingkat deret waktu, dan karenanya menghilangkan (atau mengurangi) tren dan musiman.

Package yang digunakan

library(googlesheets4)
library(tseries)
library(forecast)
library(TTR)
library(TSA)
library(imputeTS)
library(ggplot2)
library(lmtest)

Data untuk Analisis

Data yang digunakan adalah data Indeks Harga Saham Gabungan 2 tahun terakhir yang bersumber dari yahoo finance. Data tersebut telah diunduh dan dirangkum pada google sheets ini..

Import Data

Data yang digunakan hanyalah data Close, didapatkan dengan syntax berikut:

gs4_deauth()
IHSG_2Yr <- read_sheet("https://docs.google.com/spreadsheets/d/1OIC65ByfmmT9SX7I0URCxf3cH24vpj5xVO-YwM6a3SQ/edit?usp=sharing")
IHSG_2Yr <- IHSG_2Yr[c("Date","Close")]
IHSG_2Yr
# Cek apakah ada missing value:
IHSG_2Yr[which(is.na(IHSG_2Yr$Close)),]

Dari output di atas, dapat terlihat bahwa terdapat missing value pada baris ke-87 atau pada tanggal 2 mei 2022. Hal ini melanggar salah satu syarat data time series, yaitu rentang waktu yang tidak sama. Oleh karena itu, akan dilakukan penanganan missing value.

Menduga Missing Value

Pendugaan dilakukan dengan teknik interpolasi “spline”. Nilai dugaan dari teknik ini didapatkan dengan memperhatikan pola nilai sebelum dan setelah nilai missing value. Hal ini lebih baik daripada metode lain yang hanya mengambil nilai rataan 2 nilai sebelum dan setelah, atau bahkan hanya menduplikasi nilai sebelum/setelahnya. Oleh karena itu, teknik ini dianggap paling akurat untuk menduga nilai missing value. Fungsi yang digunakan untuk mengatasi missing value adalah fungsi na_interpolation yang tersedia pada package imputeTS, yang syntax-nya adalah sebagai berikut:

IHSG_2Yr <- na_interpolation(IHSG_2Yr, option = "spline")
IHSG_2Yr[81:90,]

Setelah dilakukan penanganan, dapat terlihat bahwa nilai IHSG pada tanggal 2 mei 2022 telah terisi dengan nilai \(6840.217\).

Eksplorasi Data

Eksplorasi data diperlukan untuk melihat pola dari data time series. Selain itu, eksplorasi juga berguna dalam pembagian data training dan data testing. Data testing yang baik adalah data testing yang memiliki pola seperti data trainingnya. Maka dari itu, diperlukan eksplorasi data untuk menentukan proporsi terbaik data training vs data testing.

IHSG_2Yr$Date <- as.Date(IHSG_2Yr$Date)
ggplot(IHSG_2Yr, aes(x=Date, y=Close)) +
  geom_line() +
  scale_x_date(date_breaks = "3 month", date_labels = "%Y %b") +
  labs(title = "Plot Time Series Data IHSG mingguan",
       subtitle = "(September 2020 sd September 2022)",
       y="Harga IHSG") +
  theme(plot.title =  element_text(face = "bold", hjust=.5),
        plot.subtitle = element_text(hjust=.5))

Dari plot di atas, terlihat bahwa data cenderung memiliki pola trend yang naik. Terlihat pula bahwa pembagian data training-testing dapat dilakukan antara bulan april 2022 hingga juli 2022. Hal ini karena pola setelah bulan-bulan tersebut cenderung memiliki pola trend naik pula, sama seperti data trainingnya. Untuk lebih jelasnya, perhatikan penjelasan di bawah ini:

p = 0.81 #setelah dilakukan pencarian nilai proporsi data training terbaik
freq_train=as.integer(p*nrow(IHSG_2Yr))
IHSG_2Yr$Date <- as.Date(IHSG_2Yr$Date)
ggplot(IHSG_2Yr, aes(x=Date, y=Close)) +
  geom_line() + 
  scale_x_date(date_breaks = "3 month", date_labels = "%Y %b") +
  labs(title = "Plot Time Series Data IHSG mingguan",
       subtitle = "(September 2020 sd September 2022)") +
  geom_vline(aes(xintercept = Date[freq_train], 
                 col="Frequency_Train_Data"), lty=2, lwd=.7) +
  theme(plot.title =  element_text(face = "bold", hjust=.5),
        plot.subtitle = element_text(hjust=.5),
        legend.position = "bottom") +
  scale_color_manual(name = "", values = c(Frequency_Train_Data="red"))

Setelah dilakukan eksplorasi kembali, didapatkan titik potong yang sekiranya baik dalam membagi data training testing terdapat pada nilai proporsi data training 0.81 atau \(p=81\%\). Titik tersebut bertepatan pada tanggal 2 Mei 2022 (didapatkan dengan syntax di bawah).

IHSG_2Yr[freq_train,1]

Selanjutnya, akan dilakukan pembagian data training testing berdasarkan eksplorasi di atas.

Splitting Data

train <- 1:freq_train
y <- IHSG_2Yr$Close
y_train <- ts(y[train])
y_test <- ts(y[-train], start = 88)
ggplot(IHSG_2Yr[train,], aes(x=Date, y=Close)) +
  geom_line() +
  scale_x_date(date_breaks = "3 month", date_labels = "%Y %b") +
  labs(title = "Plot Time Series Data Training",
       subtitle = "(September 2020 sd Mei 2022)",
       y="Harga IHSG") +
  theme(plot.title =  element_text(face = "bold", hjust=.5),
        plot.subtitle = element_text(hjust=.5))

ggplot(IHSG_2Yr[-train,], aes(x=Date, y=Close)) +
  geom_line() +
  scale_x_date(date_breaks = "1 month", date_labels = "%Y %b") +
  labs(title = "Plot Time Series Data Testing",
       subtitle = "(Mei 2022 sd September 2022)",
       y="Harga IHSG") +
  theme(plot.title =  element_text(face = "bold", hjust=.5),
        plot.subtitle = element_text(hjust=.5))

Terlihat bahwa pola data testing tidak berbeda jauh dengan pola data training. Hal ini menandakan bahwa pembagian kedua data ini telah tepat.

Pemulusan

Double Moving Average (DMA)

Metode pemulusan Double Moving Average (DMA) merupakan metode yang tepat untuk data IHSG Close karena data tersebut memiliki pola data tren. Fungsi di bawah ini akan me-looping nilai n dari 3 sampai dengan 11 sehingga didapatkan n optimum.

akurasi = data.frame()
for(n in 3:11){
  data.sma<-SMA(y_train, n=n)
  dma <- SMA(data.sma, n=n)
  At <- 2*data.sma - dma
  Bt <- 2/(n-1)*(data.sma - dma)
  data.ramal<- c(NA, At+Bt)
  
  error.dma = y_train-data.ramal[1:length(y_train)]
  SSE.dma = sum(error.dma[(2*n):length(y_train)]^2, na.rm = T)
  RMSE.dma = sqrt(mean(error.dma[(2*n):length(y_train)]^2, na.rm = T))
  MAPE.dma = mean(abs((error.dma[(2*n):length(y_train)]/y_train[(2*n):length(y_train)])*100), na.rm = T)
  
  akurasi.dma <- matrix(c(SSE.dma, RMSE.dma, MAPE.dma))
  row.names(akurasi.dma)<- c("SSE", "RMSE", "MAPE")
  colnames(akurasi.dma) <- c(paste("Akurasi m =", n))
  akurasi = rbind(akurasi, c(n=n, RMSE=akurasi.dma[2], MAPE=akurasi.dma[3]))
}
colnames(akurasi) = c("n", "RMSE", "MAPE")
akurasi[order(akurasi[,2]),]

Berdasarkan tabel di atas, nilai RMSE dan MAPE terkecil dimiliki oleh metode pemulusan DMA pada n = 4 yang dapat dijadikan n optimum dalam rentang nilai n dari 3 sampai 11. Dengan nilai MSE terkecil sebesar \(143.7413\) dan MAPE terkecil sebesar \(1.664693\). Syntax di bawah ini akan memodelkan pemulusan DMA dengan n optimum.

Pemulusan Double Moving Average dengan N Optimum (4)

n=4
data.sma<-SMA(y_train, n=n)
dma <- SMA(data.sma, n=n)
At <- 2*data.sma - dma
Bt <- 2/(n-1)*(data.sma - dma)
data.ramal<- c(NA, At+Bt)

fcast = c()
for (i in 1:21) {
  fcast[i] = At[length(At)] + Bt[length(Bt)]*(i)
} # Ramalan DMA

data.gab <- cbind(aktual = c(y_train,rep(NA,21)), pemulusan = c(dma, rep(NA,21)), At = c(At, rep(NA,21)), Bt = c(Bt,rep(NA,21)), ramalan = c(data.ramal, fcast[-1]))
tail(data.gab)
##        aktual pemulusan At Bt  ramalan
## [103,]     NA        NA NA NA 6703.473
## [104,]     NA        NA NA NA 6678.953
## [105,]     NA        NA NA NA 6654.433
## [106,]     NA        NA NA NA 6629.913
## [107,]     NA        NA NA NA 6605.394
## [108,]     NA        NA NA NA 6580.874

Plot DMA

# Plot
plot.ts(IHSG_2Yr$Close, xlab="Weekly", ylab="Close", main="Plot Pemulusan dan Peramalan dengan Metode DMA N Optimum (4)", ylim=c(5000,7500), type="l")
points(data.gab[,1])
lines(data.gab[,2],col="green",lwd=2)
lines(data.gab[,5],col="red",lwd=2)
legend("topleft",c("data aktual","data pemulusan DMA","data peramalan"), lty=1, col=c("black","green","red"), cex=0.8)

Plot di atas menunjukkan hasil pemulusan dan peramalan metode DMA pada n = 4. Dapat dilihat bahwa hasil pemulusan, dapat dilihat pada garis pemulusan yang masih cukup menggambarkan pola data IHSG Close aktual. Kemudian, hasil peramalan menunjukkan pola yang cenderung menurun yang nilainya tidak terlalu berbeda jauh dengan data aktual (data testing).

Nilai akurasi DMA

RMSE_DMA_train <- sqrt(mean((y_train-data.ramal[-88])^2, na.rm = T))
RMSE_DMA_test <- sqrt(mean((y_test-fcast)^2))
MAPE_DMA_train <- mean(abs((y_train-data.ramal[-88])/y_train)*100, na.rm = T)
MAPE_DMA_test <- mean(abs((y_test-fcast)/y_test)*100)
Akurasi_DMA <- data.frame("DMA_Train"=c(RMSE_DMA_train,MAPE_DMA_train), "DMA_Test"=c(RMSE_DMA_test,MAPE_DMA_test))
rownames(Akurasi_DMA) <- c("RMSE","MAPE")
Akurasi_DMA

Dari syntax di atas, didapatkan bahwa nilai RMSE DMA testing sebesar 351.044 dan MAPE DMA testing sebesar 4.06. Kedua nilai error ini cukup besar jika dibandingkan data trainingnya.

Double Exponential Smoothing (DES)

Selain DMA, Metode pemulusan lain yang cocok untuk data yang memiliki pola data tren adalah DES. Metode ini memandang bahwa semakin besar lag, maka semakin tidak berpengaruh data tersebut terhadap data aktual saat ini. Fungsi di bawah ini akan me-looping parameter DES, yaitu alpha dan beta (dari 0.1 hingga 0.9) sehingga didapatkan parameter optimum.

#Pengulangan Melihat Nilai Keakuratan
a = seq(.1,.9,.1)
b = seq(.1, .9,.1)
output = data.frame()
for (i in a) {
  for (j in b) {
    des <- HoltWinters(y_train, alpha = i, beta=j, gamma=F)
    sse <- des$SSE
    rmse <- sqrt(sse/length(y_train))
    mape <- mean(abs((des$fitted[,1]-y_train)/y_train)*100)
    akurasi <- cbind("SSE"=sse, "RMSE"=rmse, "MAPE"=mape)
    output <- rbind(output, akurasi)
  }
}
output <- cbind("Alpha" = rep(a,each=9), "Beta"=b, output)
dplyr::arrange(.data=output,RMSE) #Mengurutkan data dari nilai SSE/MSE terkecil

Setelah diurutkan berdasarkan nilai RMSE, dapat terlihat bahwa nilai alpha optimum 0.9 dan beta optimum 0.1, dengan nilai RMSE terkecilnya yaitu sebesar \(1410.87\). Kedua parameter ini yang kemudian akan digunakan untuk pemulusan.

Pemulusan Double Exponential Smoothing dengan alpha dan beta optimum (0.9, 0.1)

df_des <- HoltWinters(y_train, alpha = .9, beta=.1, gamma=F)
datades <- data.frame(y_train, c(NA, NA, df_des$fitted[,1]))
colnames(datades) = c("y_train","y_train_hat")
datades
ramal_des <- forecast::forecast(df_des,h=21)
data.frame(ramal_des)

Plot DES

plot(ramal_des, xlab="periode waktu", ylab="Yt",
     main="Forecasting Using Double Exponential Smoothing (0.9, 0.1)")
lines(y_test, col = "black", lwd=1.8)
lines (datades[,2], col="green",lwd=1)
legend("topleft", legend = c("Data aktual", "Fitted DES", "Ramalan"), lty=1, col= c("black", "green", "blue"))

Dari plot di atas, dapat terlihat garis data ramalan DES relatif mendekati garis data aktualnya (data testing). Selain itu, hampir seluruh data aktual masuk ke dalam selang kepercayaan 95% data ramalan DES. Hal ini mengindikasikan bahwa tingkat akurasi dari pemulusan DES sudah cukup baik dalam meramalkan data.

Nilai akurasi DES

RMSE_DES_train <- sqrt(df_des$SSE/length(y_train))
RMSE_DES_test <- sqrt(mean((y_test-ramal_des$mean)^2))
MAPE_DES_train <- mean(abs((df_des$fitted[,1]-y_train)/y_train)*100)
MAPE_DES_test <- mean(abs((y_test-ramal_des$mean)/y_test)*100)
Akurasi_DES <- data.frame("DES_Train"=c(RMSE_DES_train,MAPE_DES_train), "DES_Test"=c(RMSE_DES_test,MAPE_DES_test))
rownames(Akurasi_DES) <- c("RMSE","MAPE")
Akurasi_DES

Dari syntax di atas, didapatkan bahwa nilai RMSE DES testing sebesar 279.261 dan MAPE DES testing sebesar 3.48. Kedua nilai error ini juga cukup besar jika dibandingkan data trainingnya.

Perbandingan DMA vs DES

Plot DMA vs DES

plot(ramal_des, xlab="periode waktu", ylab="Yt",
     main="Forecasting DMA vs DES")
lines(y_test, col = "black", lwd=1.8)
lines (datades[,2], col="green",lwd=1.5)
lines(data.gab[,5],col="red",lwd=1.5)
legend("topleft", legend = c("Aktual", "Fitted DES", "Ramalan DES", "Ramalan DMA"), lty=1, col= c("black", "green", "blue", "red"))

Plot di atas menunjukkan hasil peramalan dengan dua metode yang berbeda, yaitu DMA dan DES. Peramalan pada metode DMA yang ditunjukkan oleh garis merah memiliki pola ramalan yang cenderung menurun, sedangkan peramalan pada metode DES yang ditunjukkan oleh garis biru memiliki pola yang datar dan terdapat daerah yang merupakan selang kepercayaan 80% dan 95%. Dari kedua metode tersebut, dapat dilihat bahwa secara eksploratif hasil ramalan metode DES cenderung lebih mendekati pola data test dibandingkan hasil ramalan data DMA yang cenderung menururn dan menjauhi pola data test.

Nilai akurasi DMA vs DES

Untuk menilai keakuratan model pemulusan, nilai yang digunakan untuk perbandingan hanyalah nilai data testing. Syntax di bawah ini akan menjalankan perbandingan tersebut.

Akurasi <- data.frame("DMA"=Akurasi_DMA[,2], "DES"=Akurasi_DES[,2])
rownames(Akurasi) <- c("RMSE","MAPE")
Akurasi

Dari perbandingan nilai keakuratan kedua model di atas, terbukti bahwa model DES menunjukkan nilai error yang lebih kecil daripada model DMA. Hal ini sesuai dengan hasil eksplorasi yang juga menyatakan bahwa model DES lebih baik untuk memprediksi data bila dibandingkan model DMA.

Cek Kestasioneran data

Prosedur Eksploratif

Secara eksploratif, kestasioneran data dapat terlihat dari plot deret waktu atau melihat plot acf dari peubah yang akan diuji. Jika pada plot deret waktu menunjukan pola tren naik/turun pada kurun waktu tertentu (tidak stabil), atau, jika plot acf menunjukkan pola tails off slowly, maka data tersebut tidak stasioner.

plot.ts(y_train, ylab=expression(Y[t]), main = "Plot Time Series Data IHSG mingguan")

acf(y_train)

Dapat terlihat dari plot deret waktu dan plot acf peubah Y_train di atas, bahwa secara eksploratif dapat disimpulkan data tersebut tidak stasioner. Uji ADF akan dilakukan untuk meyakinkan kesimpulan tersebut.

Uji Formal

Secara formal, metode Augmented Dickey-Fuller (ADF) dapat memberikan hasil uji secara akurat untuk menentukan apakah sebuah data stasioner atau tidak. Dengan hipotesis sebagai berikut:

\[ \begin{aligned} H_0&: \text{ Data tidak stasioner}\\ H_1&: \text{ Data stasioner} \end{aligned} \]

adf.test(y_train)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y_train
## Dickey-Fuller = -2.8143, Lag order = 4, p-value = 0.2414
## alternative hypothesis: stationary

Didapat nilai \(P-value>0.05\) maka tak tolak \(H_0\) pada taraf nyata 5%. Artinya, cukup bukti untuk mengatakan bahwa data tidak stasioner. Untuk mengatasi ketidakstasioneran ini, perlu dilakukan differencing atau pembedaan.

Differencing

y_diff <- diff(y_train, differences = 1)
y_diff
## Time Series:
## Start = 2 
## End = 87 
## Frequency = 1 
##  [1]   42.511231 -113.432129  -19.057129  126.929199   49.750977    8.773925
##  [7]   16.037110  207.303711  125.529296  110.597657  211.679199   27.147949
## [13]  127.846192  165.995117  -95.615235  -29.635742  278.761719  115.577148
## [19]  -66.285156 -444.774902  289.376953   70.791992    9.411133    9.863769
## [25]   16.953125   99.459961   -2.048828 -160.598144 -184.105957   58.752929
## [31]   16.048829  -69.394043  -21.247559  -67.307129   10.041992 -165.230957
## [37]   75.496094  216.549805   30.331054  -88.376953   15.278809    0.608887
## [43]   16.836425   32.665528   29.180175  -31.650878  133.392089  -63.938964
## [49] -108.720215   10.594238   85.554687  -32.047851   38.373047   11.568847
## [55]   84.030274  252.923828  151.568848   10.399902  -52.391602   -9.561035
## [61]   69.269043   69.208985 -158.709961  -23.047364  114.416016  -50.989746
## [67]  -39.032227   18.582032  119.833984   -7.915039   32.972168  -80.861817
## [73]   85.879883   84.215821   77.210937   -4.646973   40.157227   -5.726074
## [79]   32.362793   47.567383   76.227539  132.075195   24.697266   -9.926270
## [85]    3.308106 -388.697430

Cek ulang kestasioneran data

adf.test(y_diff)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y_diff
## Dickey-Fuller = -3.1144, Lag order = 4, p-value = 0.1183
## alternative hypothesis: stationary

Didapat nilai \(P-value=0.1183>0.05\) maka tak tolak \(H_0\) pada taraf nyata 5% atau cukup bukti untuk mengatakan bahwa data masih tidak stasioner. Artinya, differencing pertama gagal untuk membuat data stasioner, sehingga perlu dilakukan differencing kedua untuk mengatasi ketidakstasioneran ini.

Differencing #2

y_diff2 <- diff(y_train, differences = 2)
y_diff2
## Time Series:
## Start = 3 
## End = 87 
## Frequency = 1 
##  [1] -155.943360   94.375000  145.986328  -77.178222  -40.977052    7.263185
##  [7]  191.266601  -81.774415  -14.931639  101.081542 -184.531250  100.698243
## [13]   38.148925 -261.610352   65.979493  308.397461 -163.184571 -181.862304
## [19] -378.489746  734.151855 -218.584961  -61.380859    0.452636    7.089356
## [25]   82.506836 -101.508789 -158.549316  -23.507813  242.858886  -42.704100
## [31]  -85.442872   48.146484  -46.059570   77.349121 -175.272949  240.727051
## [37]  141.053711 -186.218751 -118.708007  103.655762  -14.669922   16.227538
## [43]   15.829103   -3.485353  -60.831053  165.042967 -197.331053  -44.781251
## [49]  119.314453   74.960449 -117.602538   70.420898  -26.804200   72.461427
## [55]  168.893554 -101.354980 -141.168946  -62.791504   42.830567   78.830078
## [61]   -0.060058 -227.918946  135.662597  137.463380 -165.405762   11.957519
## [67]   57.614259  101.251952 -127.749023   40.887207 -113.833985  166.741700
## [73]   -1.664062   -7.004884  -81.857910   44.804200  -45.883301   38.088867
## [79]   15.204590   28.660156   55.847656 -107.377929  -34.623536   13.234376
## [85] -392.005536

Cek ulang kestasioneran data #2

adf.test(y_diff2)
## Warning in adf.test(y_diff2): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y_diff2
## Dickey-Fuller = -5.6831, Lag order = 4, p-value = 0.01
## alternative hypothesis: stationary

Dengan implementasi yang sama seperti bagian sebelumnya, hasil di atas menunjukkan bahwa data setelah differencing telah stasioner.

Identifikasi model Arima

Untuk mengidentifikasi model arima, nilai ACF dan PACF dapat digunakan untuk menentukan nilai q pada nilai MA(q) dan nilai p pada model AR(p). Namun, kedua nilai ini p dan q pada model campuran ARMA(p,q). Oleh karena itu, dikembangkan metode extended autocorrelation function (EACF) untuk mengindentifikasi model campuran ARMA(p,q). Pada tabel EACF, triangle of zeros akan terbentuk, dan nilai pada pojok kiri atas akan bersesuaian dengan ordo ARMA.

ACF

acf(y_diff2)

Dari plot ACF di atas, dapat terlihat bahwa terdapat cuts off setelah lag 2. Oleh karena itu, model yang terbentuk adalah ARIMA(0,2,2).

PACF

pacf(y_diff2)

Dari plot PACF di atas, dapat terlihat bahwa terdapat cuts off setelah lag 3. Oleh karena itu, model yang terbentuk adalah ARIMA(3,2,0).

EACF

eacf(y_diff2)
## AR/MA
##   0 1 2 3 4 5 6 7 8 9 10 11 12 13
## 0 x x o o o o o o o o o  o  o  o 
## 1 x o o o o o o o o o o  o  o  o 
## 2 x x o o o o o o o o o  o  o  o 
## 3 x o o o o o o o o o o  o  o  o 
## 4 o x o x o o o o o o o  o  o  o 
## 5 x o o o o o o o o o o  o  o  o 
## 6 x x o x o o o o o o o  o  o  o 
## 7 x x o x o o o o o o o  o  o  o

Dari tabel EACF di atas, dapat terlihat bahwa terdapat triangle of zero dengan titik kiri atasnya yaitu pada 0,2. Artinya, model yang terbentuk Oleh karena itu, model yang terbentuk menurut EACF adalah ARIMA(0,1,2). Namun, model ini telah didapat pada plot acf, maka triangle of zero selanjutnya (1,1) dan (2,2) akan dibentuk model. Jadi, model tambahan yang terbentuk adalah ARIMA(1,2,1) dan ARIMA(2,2,2).

Kesimpulan

Berdasarkan hasil eksploratif di atas, dapat disimpulkan bahwa terdapat tiga model yang menjadi dugaan model terbaik untuk data IHSG, yaitu ARIMA(0,2,2), ARIMA(3,2,0). ARIMA(1,2,1)., ARIMA(2,2,2). Keempat model akan dianalisis lebih lanjut pada bagian selanjutnya.

Pemilihan model terbaik

Signifikansi Parameter

ARIMA(0,2,2)

arima022 <- Arima(y_train, order=c(0,2,2), method="ML")
coeftest(arima022)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.85258    0.15539 -5.4867 4.095e-08 ***
## ma2 -0.14742    0.14697 -1.0031    0.3158    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dari output di atas, dapat terlihat bahwa ma1 signifikan, sedangkan ma2 tidak signifikan.

ARIMA(3,2,0)

arima320 <- Arima(y_train, order=c(3,2,0), method="ML")
coeftest(arima320)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ar1 -0.66173    0.10517 -6.2918 3.137e-10 ***
## ar2 -0.63274    0.10575 -5.9835 2.184e-09 ***
## ar3 -0.41186    0.10404 -3.9587 7.537e-05 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dari output di atas, dapat terlihat bahwa seluruh parameter signifikan.

ARIMA(1,2,1)

arima121 <- Arima(y_train, order=c(1,2,1), method="ML")
coeftest(arima121)
## 
## z test of coefficients:
## 
##      Estimate Std. Error  z value Pr(>|z|)    
## ar1  0.084953   0.117483   0.7231   0.4696    
## ma1 -0.999999   0.053868 -18.5638   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dari output di atas, dapat terlihat bahwa ma1 signifikan, sedangkan ar1 tidak signifikan.

ARIMA(2,2,2)

arima222 <- Arima(y_train, order=c(2,2,2), method="ML")
summary(arima222)
## Series: y_train 
## ARIMA(2,2,2) 
## 
## Coefficients:
##          ar1      ar2      ma1      ma2
##       0.0625  -0.2276  -0.9629  -0.0365
## s.e.  0.3198   0.1181   0.2504   0.3180
## 
## sigma^2 = 13306:  log likelihood = -524.51
## AIC=1059.02   AICc=1059.78   BIC=1071.23
## 
## Training set error measures:
##                    ME     RMSE      MAE        MPE     MAPE      MASE
## Training set -12.2596 111.3019 75.13089 -0.1961632 1.221884 0.9212663
##                     ACF1
## Training set -0.01354769
coeftest(arima222)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value  Pr(>|z|)    
## ar1  0.062542   0.319819  0.1956 0.8449603    
## ar2 -0.227617   0.118073 -1.9278 0.0538835 .  
## ma1 -0.962874   0.250448 -3.8446 0.0001207 ***
## ma2 -0.036513   0.318020 -0.1148 0.9085925    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dari output di atas, dapat terlihat bahwa hanya ma1 yang signifikan pada taraf nyata 5%, ar2 signifikan pada taraf nyata 10%, sedangkan sisanya tidak signifikan.

Keakuratan Model

akurasi_model = data.frame("Model" = c("ARIMA(0,2,2)", "ARIMA(3,2,0)", "ARIMA(1,2,1)", "ARIMA(2,2,2)"),
                        "AIC" = c(arima022$aic, arima320$aic, arima121$aic,arima222$aic),
                       "BIC" = c(arima022$bic, arima320$bic, arima121$bic,arima222$bic))
akurasi_model[order(akurasi_model[,3]),]

Dari ukuran AIC dan BIC, terlihat bahwa model yang memiliki nilai AIC dan BIC terkecil adalah ARIMA(0,2,2), yaitu sebesar 1058.542 dan 1065.87. Kemudian, model yang memiliki nilai AIC dan BIC terbesar adalah ARIMA(3,2,0).

Dugaan Model terbaik

Berdasarkan hasil di atas, didapatkan tabel sebagai berikut:

Model Signifikansi Parameter (\(\alpha=5\%\)) AIC
ARIMA(0,2,2) MA(1) signifikan 1058.542
ARIMA(3,2,0) Seluruh parameter signifikan 1064.048
ARIMA(1,2,1) MA(1) signifikan 1058.951
ARIMA(2,2,2) MA(1) signifikan 1059.021

Jika melihat tabel di atas, maka terdapat 2 kesimpulan:

  1. Jika dilihat dari ukuran parameter model, maka model terbaiknya adalah ARIMA(3,2,0).
  2. Jika dilihat dari nilai keakuratan (AIC), maka model terbaiknya adalah ARIMA(0,2,2)

Oleh karena itu, maka akan dilakukan tes lain terhadap kedua model ini yaitu perbandingan keakuratan ramalan terhadap data testing.

Perbandingan Ramalan Dua Model Terbaik

Plot

ramalan022 <- forecast(arima022, h = 21)
ramalan320 <- forecast(arima320, h = 21)
plot(ramalan022); lines(y_test)

plot(ramalan320); lines(y_test)

Berdasarkan perbandingan kedua plot di atas, dapat terlihat bahwa model ARIMA(0,2,2) jauh lebih baik dalam menduga nilai IHSG 21 pekan setelah data training. Oleh karena itu, secara eksploratif dapat dikatakan bahwa ARIMA(0,2,2) merupakan model terbaik.

Nilai Akurasi

akurasi022 <- accuracy(ramalan022, y_test)
akurasi320 <- accuracy(ramalan320, y_test)

akurasi_model = data.frame("Model" = c("ARIMA(0,2,2)", "ARIMA(3,2,0)"),
                        "RMSE" = c(akurasi022[2,2], akurasi320[2,2]),
                       "MAPE" = c(akurasi022[2,5], akurasi320[2,5]))
akurasi_model[order(akurasi_model[,3]),]

Dari ukuran RMSE dan MAPE, terlihat bahwa model ramalan yang memiliki nilai RMSE dan MAPE terkecil adalah ARIMA(0,2,2), yaitu sebesar 150.172 dan 1.691.

Kesimpulan Model terbaik

Berdasarkan hasil yang telah didapat di atas, dapat disimpulkan bahwa model terbaik untuk melakukan ramalan data IHSG mingguan adalah ARIMA(0,2,2).

Overfitting

ARIMA(1,2,2)

arima122 <- Arima(y_train, order=c(1,2,2), method="ML")
summary(arima122)
## Series: y_train 
## ARIMA(1,2,2) 
## 
## Coefficients:
##           ar1      ma1      ma2
##       -0.3882  -0.4615  -0.5384
## s.e.   0.3733   0.3359   0.3327
## 
## sigma^2 = 13614:  log likelihood = -525.77
## AIC=1059.54   AICc=1060.04   BIC=1069.31
## 
## Training set error measures:
##                     ME     RMSE      MAE        MPE     MAPE      MASE
## Training set -10.12641 113.2752 76.53896 -0.1609594 1.242867 0.9385323
##                     ACF1
## Training set -0.04327006
coeftest(arima122)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)
## ar1 -0.38818    0.37335 -1.0397   0.2985
## ma1 -0.46150    0.33590 -1.3739   0.1695
## ma2 -0.53841    0.33272 -1.6182   0.1056

Dari model overfitting ARIMA(1,2,2), dapat terlihat bahwa tidak ada parameter yang signifikan. Dapat terlihat jelas bahwa model ini tidak lebih baik daripada model awal.

ARIMA(0,2,3)

arima023 <- Arima(y_train, order=c(0,2,3))
summary(arima023)
## Series: y_train 
## ARIMA(0,2,3) 
## 
## Coefficients:
##           ma1      ma2     ma3
##       -0.9039  -0.2574  0.1613
## s.e.   0.1559   0.1389  0.1026
## 
## sigma^2 = 13329:  log likelihood = -525.06
## AIC=1058.11   AICc=1058.61   BIC=1067.88
## 
## Training set error measures:
##                     ME     RMSE      MAE        MPE     MAPE      MASE
## Training set -11.58985 112.0856 75.74979 -0.1852685 1.231119 0.9288554
##                      ACF1
## Training set -0.009719192
coeftest(arima023)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value  Pr(>|z|)    
## ma1 -0.90389    0.15590 -5.7978 6.718e-09 ***
## ma2 -0.25738    0.13892 -1.8527   0.06392 .  
## ma3  0.16131    0.10255  1.5730   0.11572    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dari model overfitting ARIMA(0,2,3), dapat terlihat bahwa parameter ma3 yang ditambahkan tidak signifikan. Artinya, model ini juga tidak lebih baik daripada model awal.

Nilai AIC dan BIC Model

akurasi_ovrfit = data.frame("Model" = c("ARIMA(0,2,2)", "ARIMA(1,2,2)", "ARIMA(0,2,3)"),
                        "AIC" = c(arima022$aic, arima122$aic, arima023$aic),
                       "BIC" = c(arima022$bic, arima122$bic, arima023$bic))
akurasi_ovrfit[order(akurasi_ovrfit[,3]),]

Dari ukuran AIC, terlihat bahwa model yang memiliki nilai AIC terkecil adalah ARIMA(0,2,3), yaitu sebesar 1058.112. Sedangkan, model yang memiliki nilai BIC terkecil adalah ARIMA(0,2,2).

Kesimpulan

Dari signifikansi model terbaik dan ukuran BIC, dapat disimpulkan bahwa model terbaiknya adalah model awal yaitu ARIMA(0,2,2).

Diagnostik Model

Prosedur Eskploratif

#Eksplorasi
best_model <- arima022
sisaan <- best_model$residuals
par(mfrow=c(2,2))
qqnorm(sisaan)
qqline(sisaan, col = "blue", lwd = 2)
plot(as.numeric(best_model$fitted), as.numeric(sisaan), xlab="Fitted", ylab="Sisaan", 
     ylim=c(-500,500), main="Residuals vs Fitted"); abline(h=0, col="red")
acf(sisaan)
plot(1:length(sisaan),sisaan,type='o', xlab="Order", ylim=c(-500,500),
     main="Residuals vs Order"); abline(h=0, col="red")

  1. Normal Q-Q Plot
    Berdasarkan hasil eksplorasi di atas, terlihat bahwa banyak amatan sisaan cenderung menjauhi garis qq-plot distribusi normal. Oleh karena itu, secara eksploratif dapat disimpulkan bahwa sisaan belum cukup menyebar normal.

  2. Plot Residual vs Fitted
    Berdasarkan hasil eksplorasi di atas, mayoritas titik amatan berada disekitar nol meskipun ada beberapa titik amatan yang terletak jauh dari titik nol. Selain itu, dapat terlihat bahwa lebar pita dari sisaan tidak terlalu berbeda jauh dari kiri hingga ke kanan, hal ini mengindikasikan bahwa ragam dari sisaan cukup homogen.

  3. Plot ACF
    Berdasarkan hasil eksplorasi di atas, pada plot ACF tidak terdapat garis vertikal di lag tertentu yang melebihi tinggi garis biru horizontal.Oleh karena itu, secara eksploratif plot ACF dapat disimpulkan tidak terdapat autokorelasi pada model.

  4. Residual vs Order
    Berdasarkan hasil eksplorasi di atas, titik amatan pada plot kebebasan sisaan mayoritas bergerak di sekitar titik nol. Namun, terdapat beberapa titik amatan yang terletak cukup jauh dari titik nol. Oleh karena itu, secara eksploratif plot residual vs order belum dapat disimpulkan apakah sisaan tersebut terdapat autokorelasi atau tidak.

Uji Formal

Kolmogrov-Smirnov Test

\(H_0:\) Sisaan menyebar secara normal

\(H_1:\) Sisaan tidak menyebar secara normal

ks.test(sisaan,"pnorm")
## 
##  Exact one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan
## D = 0.51689, p-value < 2.2e-16
## alternative hypothesis: two-sided

Berdasarkan uji normalitas dengan Kolmogorov-Smirnov Test diperoleh nilai \(P-value = 2.2e-16 < 0.05\). Sehingga dapat disimpulkan bahwa data tidak menyebar secara normal.

L-Jung Box Test

\(H_0:\) Sisaan saling bebas (tidak terdapat korelasi)

\(H_1:\) Sisaan tidak saling bebas (terdapat korelasi)

Box.test(sisaan,type = "Ljung-Box")
## 
##  Box-Ljung test
## 
## data:  sisaan
## X-squared = 0.11131, df = 1, p-value = 0.7387

Berdasarkan uji autokorelasi dengan L-Jung Box Test diperoleh nilai \(P-value = 0.7387 > 0.05\). Sehingga, dapat disimpulkan bahwa tidak terdapat korelasi sisaan antar lagnya.

T-Test

\(H_0:\) Rataan sisaan sama dengan 0

\(H_1:\) Rataan sisaan tidak sama dengan 0

t.test(sisaan, mu = 0, conf.level = 0.95)
## 
##  One Sample t-test
## 
## data:  sisaan
## t = -0.80804, df = 86, p-value = 0.4213
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -34.23921  14.44890
## sample estimates:
## mean of x 
## -9.895154

Berdasarkan uji rataan dengan T-Test diperoleh nilai \(P-value = 0.4213 > 0.05\), sehingga dapat disimpulkan bahwa sisasaannya sama dengan 0.

Peramalan

Plot

ramalan_best <- forecast(best_model, h = 21)
plot(ramalan_best); lines(y_test)

Dari plot di atas, dapat terlihat bahwa model ARIMA(0,2,2) sudah sangat baik dalam meramalkan nilai IHSG 21 pekan ke depan. Hal ini terlihat dari miripnya ramalan dari model dengan data aktual nilai IHSG-nya.

Nilai Akurasi

accuracy(ramalan_best, y_test)
##                     ME     RMSE       MAE         MPE     MAPE      MASE
## Training set -9.895154 113.9941  77.20645 -0.15716217 1.253738 0.9467171
## Test set      7.032481 150.1718 117.19661  0.05742668 1.691531 1.4370825
##                    ACF1 Theil's U
## Training set -0.0351606        NA
## Test set      0.5995693  1.101872

Dari nilai keakuratan di atas, terlihat bahwa tidak terjadi overfitting atau underfitting pada model. Hal ini karena nilai akurasi pada data testing tidak terlalu berbeda jauh jika dibandingkan data training. Misalnya, nilai MAPE pada data training sebesar 1.25 sedangkan pada data testing sebesar 1.69. Hanya terdapat selisih 0.44 nilai MAPE antara training testing atau MAPE data training lebih tinggi sekitar 35% dari MAPE data training. Perbedaan kedua nilai ini tidaklah terlalu signifikan.

Pemodelan vs Pemulusan

Plot

plot.ts(IHSG_2Yr$Close,xlab="Weekly", ylab="Close", main="Plot Perbandingan Pemulusan dan Pemodelan", ylim=c(5000,7500), type="l")
points(y_train)
lines(ramal_des$mean, col="blue",lwd=2)
lines(ramalan_best$mean, col="red",lwd=2)
legend("topleft",c("data aktual","ramalan DES (0.9, 0.1)","ramalan ARIMA(0,2,2)"), lty=1, col=c("black","blue","red"), cex=0.8)

Dari plot di atas, dapat terlihat bahwa peramalan dengan menggunakan model ARIMA(0,2,2) jauh lebih mendekati plot data aktualnya bila dibandingkan dengan hasil peramalan metode DES.

Nilai Akurasi

akurasi_DES <- accuracy(ramal_des$mean, y_test)
akurasi_ARIMA <- accuracy(ramalan_best, y_test)
akurasi_Akhir <- rbind(akurasi_DES, akurasi_ARIMA[2,-6])
rownames(akurasi_Akhir) <- c("DES", "ARIMA(0,2,2)")
akurasi_Akhir
##                      ME     RMSE      MAE        MPE     MAPE      ACF1
## DES          189.695895 279.2619 246.5130 2.62875790 3.483038 0.6469238
## ARIMA(0,2,2)   7.032481 150.1718 117.1966 0.05742668 1.691531 0.5995693
##              Theil's U
## DES           2.030384
## ARIMA(0,2,2)  1.101872

Dari perbandingan nilai akurasi di atas juga terlihat bahwa ramalan pemodelan ARIMA(0,2,2) menghasilkan galat yang jauh lebih kecil jika dibandingkan galat yang dihasilkan oleh pemulusan DES. Sehingga dapat disimpulkan bahwa model ARIMA(0,2,2) merupakan metode terbaik untuk menduga harga penutupan IHSG mingguan berdasarkan harga 2 tahun terakhir.

Kesimpulan

Peramalan harga IHSG dapat dilakukan dengan menggunakan pemulusan DMA dan DES atau pemodelan ARIMA. Dari hasil yang telah diperoleh, pemulusan terbaik adalah pemulusan dengan metode DES dengan nilai alpha 0.9 dan beta 0.1. Selain itu, pemodelan terbaik adalah ARIMA(0,2,2). Berdasarkan plot dan nilai akurasi seperti RMSE, MAPE, dan sebagainya, dapat disimpulkan bahwa metode terbaik yang digunakan untuk meramalkan harga IHSG mingguan adalah metode pemodelan ARIMA(0,2,2).

Daftar Pustaka

  1. As’ad M, Wibowo SS, Sophia E. 207. Peramalan jumlah mahasiswa baru dengan model Autoregressive Integrated Moving Average (ARIMA). Jurnal Informatika Merdeka Pasuruan. 2(3): 20-33.

  2. Diharjo B, Arief R. 2021. Prediksi harga saham indeks IDX30 di Indonesia saat Pandemi Covid-19 dengan Autoregressive Integrated Moving Average (ARIMA). Jurnal Ilmiah Informatika Komputer. 26(3): 261-276.

  3. Fatimah N. 2015. Aplikasi Interpolasi Newton Menggunakan Borland Delphi 5.0. Jurnal Teknologi dan Rekayasa. 20(1): 36-46

  4. Nurjanah IS, Ruhiat D, Andiani D. 2018. Implementasi model Autoregressive Integrated Moving Average (ARIMA) untuk peramalan jumlah penumpang kereta api di Pulau Sumatera. Jurnal Teori dan Riset Matematika. 3(2): 145-156.

  5. Pramujo B, Juwono PT, Soetopo W. 2014. Pemodelan debit menggunakan metode ARIMA guna menentukan pola operasi Waduk Selorejo. Jurnal Teknik Pengairan. 5(2): 141-148.

  6. Ukhra AU. 2014. Pemodelan dan peramalan data deret waktu dengan metode seasonal ARIMA. Jurnal Matematika UNAND. 3(3): 59 – 67.