Peralaman Harga Saham PT Bank Central Asia Tbk Menggunakan Model ARIMA

Yoga Pramudana Setiawan

20 Mei 2022

Library:

> # install.packages("quantmod")
> # install.packages("highcharter")
> # install.packages("magrittr")
> # install.packages("knitr")
> # install.packages("MASS")
> # install.packages("tseries")
> # install.packages("forecast")
> # install.packages("lmtest")
> # install.packages("nortest")
> # install.packages("kableExtra")
> # install.packages("equatiomatic")

1 PENDAHULUAN

1.1 Latar Belakang

Investasi merupakan salah satu langkah yang dapat diambil untuk menjaga nilai kekayaan seseorang supaya tidak tergerus oleh inflasi. Salah satu bentuk investasi yakni berupa kepemilikan saham. Harga saham berfluktuasi setiap waktu sesuai dengan hukum penawaran dan permintaan. Harga tersebut dicatat dengan rinci setiap detik oleh Bursa Efek Indonesia.

Sebagai investor penting untuk melakukan analisa terlebih dahulu mengenai saham yang akan dibeli. Kinerja perusahaan dan laporan keuangan tentu menjadi pertimbangan utama dalam membeli saham namun investor juga dapat mempertimbangkan peramalan menggunakan data deret waktu untuk mengetahui kisaran pergerakan harga saham dalam beberapa periode waktu ke depan. Artikel ini akan membahas mengenai peramalan harga saham (studi kasus pada saham BBCA) pada 10 tahun terakhir.

(catatan : artikel ini hanya bertujuan untuk tujuan edukasi semata, tidak ada ajakan atau himbauan untuk membeli saham yang tertera pada artikel)

1.2 Statistik Deskriptif

Statistik deskriptif yang seringkali digunakan pada analisis deret waktu yakni rata-rata, ragam, nilai tertinggi dan nilai terendah. Rata-rata dari sekumpulan \(n\) pengamatan dapat dinyatakan dalam hasil penjumlahan seluruh pengamatan dibagi dengan banyaknya amatan atau dapat dinyatakan dalam notasi berikut :

\[\begin{equation} \tag{1} \overline{x} = \frac{\sum_{i=1}^n x_i}{n}. \end{equation}\]

Sedangkan ragam dari sekumpulan \(n\) pengamatan dapat dinyatakan dalam hasil penjumlahan deviasi tiap amatan terhadap nilai rata-ratanya kemudian dibagi dengan banyaknya amatan dikurangi satu atau dapat dinyatakan dalam notasi berikut :

\[\begin{equation} \tag{2} s^2 = \frac{\sum_{i=1}^n (x_i - \overline{x})^2}{n-1}. \end{equation}\]

(Mendenhall dkk., 2009)

1.3 Analisis Deret Waktu

1.3.1 Definisi

Data deret waktu merupakan suatu rangkaian pengamatan yang diamati pada urutan waktu tertentu. Sedangkan analisis deret waktu merupakan teknik untuk menganalisis ketergantungan antar waktu tersebut.

(Box dkk, 2008)

1.3.2 Tren

Terdapat tren atau pola kecenderungan pada data deret waktu. Bentuk dari tren dapat berupa regresi seperti misalnya regresi linier dan kuadratik. Selain itu terdapat juga tren siklus seperti gelombang cosinus atau musiman seperti bulanan, tahunan, atau kuartalan.

(Cryer & Chan, 2008)

1.3.3 Stasioneritas

Pada data deret waktu dikenal istilah stasioneritas. Ide awal dari stasioneritas adalah hukum probabilitas untuk memastikan bahwa tidak akan ada perubahan perilaku seiring perubahan waktu. Stasioneritas bagi rata-rata akan terpenuhi apabila \(E(Y_t)=E(Y_{t-k})\) dan stasioneritas bagi ragam akan terpenuhi apabila \(Var(Y_t)=Var(Y_{t-k})\) untuk seluruh \(t\) dan \(k\).

Untuk mendeteksi adanya non stasioneritas pada rata-rata dapat digunakan Uji Dickey Fuller sedangkan untuk mendeteksi adanya non stasioneritas pada ragam dapat digunakan Uji Box Cox.

Untuk kasus data deret waktu non stasioner pada rata-rata dapat dilakukan dekomposisi model menjadi bentuk regresi linier seperti di bawah ini :

\[\begin{equation} \tag{3} Z_t = \alpha_0 + \alpha_1t + a_t, \end{equation}\]

dimana \(a_t\) merupakan white noise dengan rata-rata nol. Untuk model kuadratik dapat dibentuk menjadi :

\[\begin{equation} \tag{4} Z_t = \alpha_0 + \alpha_1t + \alpha_2t^2 + a_t, \end{equation}\]

dan untuk model regresi yang lebih umum dapat digunakan model regresi polinomial berderajat \(k\) seperti di bawah ini:

\[\begin{equation} \tag{5} Z_t = \alpha_0 + \alpha_1t + \dots +\alpha_kt^k + a_t. \end{equation}\]

Demikian pula untuk model dengan tren siklus dan musiman dapat didekomposisi menjadi persamaan :

\[\begin{equation} \tag{6} Z_t = v_0 + \sum_{j=1}^{m}(\alpha_j cos\omega_jt + \beta_j sin\omega_jt) + a_t. \end{equation}\]

Selain itu, menurut Box dan Jenkins perbedaan antar waktu (differencing) pada deret tersebut memiliki perilaku yang sangat mirip sehingga differencing yang sesuai dapat digunakan untuk melakukan transformasi dari data non stasioner menjadi stasioner. Contoh differencing dapat dilihat pada persamaan di bawah ini :

\[\begin{equation} \tag{7} \nabla Y_t = Y_t - Y_{t-1}, \end{equation}\]

atau dapat pula dituliskan menggunakan operator backshift seperti contoh di bawah ini :

\[\begin{equation} \tag{8} \nabla Y_t = (1-B)Y_t. \end{equation}\]

Pada kasus data nonstasioner pada ragam dapat dilakukan transformasi Box Cox menggunakan nilai \(\lambda\) yang bersesuaian pada data tersebut. Berikut rumus dari transformasi Box Cox :

\[\begin{equation} \tag{9} T(Z_t) = \frac{Z_t^\lambda - 1}{\lambda} \end{equation}\]

Tabel 1: Transformasi Box Cox
\(\lambda\) Transformasi
-1.0 \(\frac{1}{Z_t}\)
-0.5 \(\frac{1}{\sqrt{\left(Z_t) \right)}}\)
(Wei, 2006)

1.3.4 Identifikasi Model

ACF dan PACF dari sampel data deret waktu dapat menjadi petunjuk efektif untuk menentukan orde \(p\) dan \(q\). Berikut merupakan tabel yang dapat menjadi petunjuk dalam menentukan orde \(p\) dan \(q\) dalam model.

Tabel 2: Identifikasi Model dengan ACF dan PACF
AR(\(p\)) MA(\(q\)) ARMA(\(p,q\)), \(p\)>0, dan \(q\)>0
ACF turun eksponensial atau membentuk gelombang sinus mengecil berhenti setelah lag \(q\) turun eksponensial atau membentuk gelombang sinus mengecil
PACF berhenti setelah lag \(p\) turun eksponensial atau membentuk gelombang sinus mengecil turun eksponensial atau membentuk gelombang sinus mengecil

ACF juga dapat menunjukkan gejala non stasioner pada data sampel. Berikut merupakan contoh ACF pada data yang tidak stasioner :

(Cryer & Chan, 2008)

1.3.5 Pendugaan Parameter

Berbagai metode yang dapat digunakan untuk menduga parameter AR dan MA seperti misalnya metode momen sampel, metode kuadrat terkecil, dan metode kemungkinan maksimum.

(Cryer & Chan, 2008)

1.3.6 Diagnostik Model

Setelah mendapatkan model terbaik maka langkah selanjutnya yakni mengecek kebaikan model melalui sisaan model. Terdapat dua pendekatan untuk menganalisis kebaikan model yakni dengan mengecek sisaan model atau dengan melakukan overfitting parameter pada model terbaik.

Pendekatan pertama dilakukan dengan cara menguji kenormalan sisaan model. Model yang baik adalah model yang memiliki sisaan yang menyebar acak dan mengikuti sebaran normal dengan rata-rata nol. Untuk mengetahui acak atau tidaknya sisaan dapat dilihat dari ACF sisaan model. Sisaan yang menyebar acak memiliki nilai ACF nol. Sedangkan untuk mengetahui kenormalan sisaan dapat menggunakan salah satu uji kenormalan sisaan seperti Kolmogorov Smirnov, Saphiro Wilk, atau lainnya.

Pendekatan kedua dapat dilakukan dengan membuat model namun dengan parameter AR dan MA setingkat lebih tinggi. Apabila parameter yang sudah ada pada model sebelumnya tetap signifikan dan parameter tambahan tidak signifikan maka dapat dipastikan model yang sebelumnya terbentuk merupakan model terbaik.

(Cryer & Chan, 2008)

1.4 Data

Data deret waktu yang digunakan adalah data harga penutupan saham PT Bank Central Asia Tbk mingguan periode April 2020 - April 2022.

2 SOURCE CODE

2.1 Library yang Dibutuhkan

> # Library
> library(quantmod)
> library(highcharter)
> library(magrittr)
> library(knitr)
> library(MASS)
> library(tseries)
> library(forecast)
> library(lmtest)
> library(nortest)
> library(equatiomatic)

2.2 Mengimport Data

Data pada artikel ini diambil dari Yahoo Finance dengan fungsi getSymbols dari library quantmod dimana argumen pertama diisi dengan nama saham yakni BBCA.JK, argumen kedua auto.assign diisi dengan FALSE supaya output yang dihasilkan berupa data tidak hanya nama simbol saham, argumen ketiga dan keempat from dan to yang diisi dengan tanggal awal dan akhir harga saham yang ingin diimpor, dan argumen terakhir periodicity diisi dengan weekly untuk menampilkan harga saham dalam format per minggu.

> # Import data dari Yahoo Finance
> price_bbca <- getSymbols("BBCA.JK", auto.assign=FALSE, 
+                          from="2020-04-30", to="2022-04-30", 
+                          periodicity = "weekly")

Data yang sudah diimpor lalu akan ditampilkan pada tabel menggunakan fungsi kbl namun sebelumnya data akan diubah ke bentuk dataframe terlebih dahulu menggunakan fungsi as.data.frame dan Cl digunakan untuk mengambil data harga penutupan saham.

Untuk menampilkan data dengan fungsi kbl perlu memasukkan argumen pertama yakni data yang akan ditampilkan yakni tail(tb3) yang artinya beberapa harga penutupan terakhir, argumen kedua yakni col.names untuk mendefinisikan nama kolom pada tabel, argumen ketiga caption untuk mendefinisikan judul tabel, dan argumen keempat align untuk mengatur posisi teks pada tabel (parameter c berarti center atau rata tengah).

Kemudian dilanjutkan dengan fungsi kable_styling untuk mengatur beberapa style di tabel seperti pada argumen pertama full_width dibuat FALSE supaya tabel tidak terlalu lebar dan mengatur html_font menjadi Open Sans supaya serasi dengan tema keseluruhan. Lalu fungsi column_spec untuk mengatur style tiap kolom seperti pada argumen width yang berguna untuk mengatur lebar masing-masing kolom.

> # Menampilkan data harga penutupan saham BBCA
> tb3 <- as.data.frame(Cl(price_bbca))
> kbl(tail(tb3), col.names = c("Harga"), 
+     caption = "**Tabel 3: Harga Penutupan Saham BBCA beberapa Minggu Terakhir**",
+     align = 'c') %>%
+   kable_styling(full_width = F, html_font = "Open Sans") %>%
+   column_spec(1, width = "250px") %>%
+   column_spec(2, width = "150px")
Tabel 3: Harga Penutupan Saham BBCA beberapa Minggu Terakhir
Harga
2022-03-21 7950
2022-03-28 7925
2022-04-04 7850
2022-04-11 7700
2022-04-18 7875
2022-04-25 8125

2.3 Plot

Untuk menampilkan plot deret waktu pada harga saham dapat menggunakan fungsi chartseries dari library quantmod. Argumen pertama yang diinputkan yakni data deret waktu kemudian argumen kedua name diisikan dengan judul plot.

> # Menampilkan plot harga penutupan saham BBCA
> chartSeries(Cl(price_bbca), name = "BBCA")

3 HASIL DAN PEMBAHASAN

3.1 Statistik Deskriptif

Berdasarkan data yang digunakan, diperoleh nilai rata-rata sebesar 6655,

> xbar = mean(Cl(price_bbca))
> xbar
[1] 6655

dengan ragam sebesar 622302.4,

> ragam = var(Cl(price_bbca))
> ragam
              BBCA.JK.Close
BBCA.JK.Close      622302.4

dimana capaian nilai terendah pada tanggal 18 Mei 2020 sebesar 4765 dan capaian tertinggi pada tanggal 25 April 2022 sebesar 8125

> which(Cl(price_bbca) == min(Cl(price_bbca)))
[1] 4
> which(Cl(price_bbca) == max(Cl(price_bbca)))
[1] 105
> 
> Cl(price_bbca)[c(4,105),]
           BBCA.JK.Close
2020-05-18          4765
2022-04-25          8125

3.2 Tren

Untuk melihat tren pada data deret waktu terlebih dahulu dengan membuat plot data deret waktu seperti pada plot sebelumnya.

> chartSeries(Cl(price_bbca), name = "BBCA")

Terlihat pada plot diatas dimana terdapat kecenderungan tren meningkat secara linier sehingga dapat dipastikan data tidak stasioner terhadap rata-rata. Namun supaya lebih valid dapat digunakan uji stasioner.

3.3 Uji Stasioner

3.3.1 Ragam

Uji stasioneritas ragam menggunakan fungsi boxcox dari library MASS dimana argumen yang diisi merupakan objek fungsi linier menggunakan fungsi lm dari closing_bbca terhadap nilai lambda 1.

> closing_bbca <- as.ts(Cl(price_bbca))
> boxcox(lm(closing_bbca~1))

Terlihat bahwa 95% lambda yang dihasilkan pada selang kepercayaan mengandung nilai 1 sehingga tidak perlu dilakukan transformasi Box cox.

3.3.2 Rata-rata

Uji stasioneritas rata-rata menggunakan fungsi adf.test dari library tseries. Untuk melakukan Uji Dickey Fuller hanya perlu menginputkan data deret waktu ke dalam fungsi adf.test.

> adf.test(closing_bbca)

    Augmented Dickey-Fuller Test

data:  closing_bbca
Dickey-Fuller = -2.4977, Lag order = 4, p-value = 0.3703
alternative hypothesis: stationary

Tampak bahwa hasil tes terima \(H_0\) yang artinya data deret waktu tidak stasioner. Untuk mengatasi hal tersebut maka dapat digunakan differencing. Untuk melakukan differencing dapat menggunakan fungsi diff dan memasukkan argumen berupa data deret waktu.

> diff_closing_bbca <- diff(closing_bbca)
> plot(diff_closing_bbca)

> adf.test(diff_closing_bbca)

    Augmented Dickey-Fuller Test

data:  diff_closing_bbca
Dickey-Fuller = -3.9131, Lag order = 4, p-value = 0.0161
alternative hypothesis: stationary

Terlihat dari plot data deret waktu setelah melakukan differencing dimana tak terlihat lagi adanya tren pada data deret waktu. Uji Dickey Fuller pada hasil differencing juga menyatakan tolak \(H_0\) yang artinya data sudah stasioner.

3.4 Identifikasi Orde

Proses menentukan model tentatif dapat menggunakan ACF dan PACF. Untuk membuat plot ACF dan PACF dapat menggunakan library forecast dan menginputkan data yang telah stasioner.

> Acf(diff_closing_bbca)

> Pacf(diff_closing_bbca)

Dapat dilihat pada plot ACF dan PACF dimana keduanya tak menunjukkan adanya pola gelombang sinus ataupun penurunan eksponensial. Untuk ACF yang signifikan terlihat pada orde 3 dan 7 namun untuk orde 1 juga hampir mendekati signifikan sehingga orde yang mungkin bagi \(q\) adalah {1, 3, 7}. Sedangkan pada plot PACF terlihat tak ada orde yang signifikan, namun untuk orde 1 dan 3 terlihat mendekati signifikan sehingga orde yang mungkin bagi \(p\) adalah {0, 1, 3}. Apabila dirangkum model tentatif yang mungkin dibentuk adalah :

  • ARIMA(0,1,1)
  • ARIMA(0,1,3)
  • ARIMA(0,1,7)
  • ARIMA(1,1,1)
  • ARIMA(1,1,3)
  • ARIMA(1,1,7)
  • ARIMA(3,1,1)
  • ARIMA(3,1,3)
  • ARIMA(3,1,7)

3.5 Pendugaan Parameter

Pada pendugaan parameter digunakan looping sebanyak dua kali, looping pertama dengan iterator i merupakan berbagai kemungkinan orde \(p\) yang mungkin sedangkan looping kedua dengan iterator j merupakan berbagai kemungkinan orde \(q\) yang mungkin. Kemudian untuk melakukan pendugaan parameter menggunakan fungsi Arima dari library forecast sedangkan untuk pengujian parameter menggunakan fungsi coeftest dari library lmtest. Kemudian masing-masing model yang terbentuk dan hasil pengujian parameter dimasukkan kedalam list bernama list_model.

Fungsi cat digunakan untuk menampilkan pembatas antar model namun tanpa indeks [1] di output sehingga hasil output dapat lebih rapi. Langkah terakhir yakni menampilkan output dengan membuat looping dan memanggil list_model dan disertai key yang bersesuaian.

> list_model = list()
> id = 1
> 
> for (i in c(0, 1, 3)) {
+   for (j in c(1, 3, 7)) {
+     list_model[[id]] <- Arima(closing_bbca, order = c(i,1,j))
+     list_model[[id+1]] <- coeftest(list_model[[id]])
+     id = id + 2
+   }
+ }
> 
> for (k in seq(1:9)){
+   print(list_model[[2*k-1]])
+   print(list_model[[2*k]])
+   cat("########################################################################\n\n")
+ }
Series: closing_bbca 
ARIMA(0,1,1) 

Coefficients:
         ma1
      0.2166
s.e.  0.0923

sigma^2 = 33170:  log likelihood = -688.38
AIC=1380.76   AICc=1380.88   BIC=1386.05

z test of coefficients:

    Estimate Std. Error z value Pr(>|z|)  
ma1 0.216570   0.092292  2.3466  0.01895 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(0,1,3) 

Coefficients:
         ma1      ma2      ma3
      0.2245  -0.0004  -0.1923
s.e.  0.0957   0.1039   0.0843

sigma^2 = 32272:  log likelihood = -685.99
AIC=1379.98   AICc=1380.39   BIC=1390.56

z test of coefficients:

       Estimate  Std. Error z value Pr(>|z|)  
ma1  0.22452592  0.09565331  2.3473  0.01891 *
ma2 -0.00041931  0.10390103 -0.0040  0.99678  
ma3 -0.19228970  0.08425620 -2.2822  0.02248 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(0,1,7) 

Coefficients:
         ma1     ma2      ma3      ma4     ma5     ma6      ma7
      0.2106  0.1018  -0.2252  -0.0555  0.2074  0.1640  -0.2049
s.e.  0.1021  0.1039   0.1086   0.1093  0.1006  0.1093   0.1205

sigma^2 = 30163:  log likelihood = -680.97
AIC=1377.94   AICc=1379.46   BIC=1399.09

z test of coefficients:

     Estimate Std. Error z value Pr(>|z|)  
ma1  0.210611   0.102084  2.0631  0.03910 *
ma2  0.101766   0.103867  0.9798  0.32720  
ma3 -0.225183   0.108607 -2.0734  0.03814 *
ma4 -0.055532   0.109329 -0.5079  0.61150  
ma5  0.207385   0.100553  2.0624  0.03917 *
ma6  0.163959   0.109272  1.5005  0.13349  
ma7 -0.204858   0.120485 -1.7003  0.08908 .
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(1,1,1) 

Coefficients:
          ar1     ma1
      -0.0053  0.2212
s.e.   0.2709  0.2525

sigma^2 = 33495:  log likelihood = -688.38
AIC=1382.76   AICc=1383   BIC=1390.69

z test of coefficients:

      Estimate Std. Error z value Pr(>|z|)
ar1 -0.0052906  0.2709019 -0.0195   0.9844
ma1  0.2211740  0.2525053  0.8759   0.3811

########################################################################

Series: closing_bbca 
ARIMA(1,1,3) 

Coefficients:
         ar1     ma1      ma2      ma3
      0.0367  0.1903  -0.0057  -0.1955
s.e.  0.3644  0.3520   0.1164   0.0905

sigma^2 = 32590:  log likelihood = -685.99
AIC=1381.97   AICc=1382.59   BIC=1395.2

z test of coefficients:

      Estimate Std. Error z value Pr(>|z|)  
ar1  0.0366882  0.3644057  0.1007   0.9198  
ma1  0.1902879  0.3519886  0.5406   0.5888  
ma2 -0.0057454  0.1163574 -0.0494   0.9606  
ma3 -0.1954546  0.0904514 -2.1609   0.0307 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(1,1,7) 

Coefficients:
         ar1      ma1     ma2      ma3     ma4     ma5     ma6      ma7
      0.2828  -0.0560  0.0376  -0.2656  0.0177  0.2200  0.0934  -0.2702
s.e.  0.3182   0.3032  0.1247   0.1171  0.1242  0.1044  0.1176   0.1105

sigma^2 = 30273:  log likelihood = -680.62
AIC=1379.24   AICc=1381.15   BIC=1403.04

z test of coefficients:

     Estimate Std. Error z value Pr(>|z|)  
ar1  0.282764   0.318245  0.8885  0.37427  
ma1 -0.055997   0.303223 -0.1847  0.85349  
ma2  0.037641   0.124700  0.3018  0.76277  
ma3 -0.265563   0.117100 -2.2678  0.02334 *
ma4  0.017690   0.124164  0.1425  0.88671  
ma5  0.220040   0.104364  2.1084  0.03500 *
ma6  0.093412   0.117590  0.7944  0.42697  
ma7 -0.270242   0.110488 -2.4459  0.01445 *
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(3,1,1) 

Coefficients:
          ar1      ar2      ar3    ma1
      -0.2159  -0.0098  -0.2493  0.434
s.e.   0.3152   0.1175   0.0993  0.318

sigma^2 = 32284:  log likelihood = -685.52
AIC=1381.05   AICc=1381.66   BIC=1394.27

z test of coefficients:

      Estimate Std. Error z value Pr(>|z|)  
ar1 -0.2158790  0.3152202 -0.6849  0.49344  
ar2 -0.0098376  0.1175098 -0.0837  0.93328  
ar3 -0.2492829  0.0992824 -2.5108  0.01204 *
ma1  0.4339826  0.3180245  1.3646  0.17237  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(3,1,3) 

Coefficients:
          ar1      ar2      ar3     ma1     ma2     ma3
      -0.7487  -0.8392  -0.7429  0.9688  1.1340  0.8014
s.e.   0.3393   0.0649   0.3015  0.3510  0.0879  0.3533

sigma^2 = 27960:  log likelihood = -679.83
AIC=1373.65   AICc=1374.82   BIC=1392.16

z test of coefficients:

     Estimate Std. Error  z value  Pr(>|z|)    
ar1 -0.748740   0.339311  -2.2066  0.027339 *  
ar2 -0.839206   0.064947 -12.9215 < 2.2e-16 ***
ar3 -0.742859   0.301450  -2.4643  0.013729 *  
ma1  0.968792   0.350983   2.7602  0.005776 ** 
ma2  1.134037   0.087860  12.9074 < 2.2e-16 ***
ma3  0.801431   0.353286   2.2685  0.023299 *  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Series: closing_bbca 
ARIMA(3,1,7) 

Coefficients:
          ar1      ar2      ar3     ma1     ma2     ma3     ma4     ma5     ma6
      -0.3879  -0.5726  -0.4921  0.6267  0.7293  0.4154  0.0658  0.1212  0.1015
s.e.   0.6294   0.3267   0.4770  0.6342  0.3926  0.5558  0.1517  0.1863  0.1639
          ma7
      -0.0423
s.e.   0.1583

sigma^2 = 30465:  log likelihood = -679.79
AIC=1381.58   AICc=1384.45   BIC=1410.66

z test of coefficients:

     Estimate Std. Error z value Pr(>|z|)  
ar1 -0.387850   0.629423 -0.6162  0.53776  
ar2 -0.572604   0.326736 -1.7525  0.07969 .
ar3 -0.492146   0.477024 -1.0317  0.30221  
ma1  0.626739   0.634206  0.9882  0.32304  
ma2  0.729320   0.392584  1.8577  0.06321 .
ma3  0.415371   0.555787  0.7474  0.45485  
ma4  0.065775   0.151701  0.4336  0.66459  
ma5  0.121163   0.186311  0.6503  0.51548  
ma6  0.101462   0.163897  0.6191  0.53588  
ma7 -0.042276   0.158349 -0.2670  0.78948  
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

########################################################################

Setelah dilakukan pendugaan parameter terhadap seluruh model tentatif didapatkan hasil bahwa model dengan AIC terkecil adalah ARIMA(3,1,3) dan didapatkan juga bahwa seluruh parameter signifikan pada model ARIMA(3,1,3). Sehingga dapat diputuskan bahwa model terbaik pada kasus ini adalah ARIMA(3,1,3).

3.6 Diagnostik Model

3.6.1 Pengecekan Sisaan

3.6.1.1 Uji Ljung Box

Uji Ljung Box dilakukan untuk mengetahui apakah autokorelasi pada sisaan model sudah tidak signifikan lagi. Untuk menampilkan uji Ljung Box dapat menggunakan fungsi checkresiduals pada library forecast. Argumen yang diinputkan berupa objek yakni model deret waktu yang akan dievaluasi sisaannya.

> y = Arima(closing_bbca, order = c(3,1,3))
> checkresiduals(y)


    Ljung-Box test

data:  Residuals from ARIMA(3,1,3)
Q* = 1.7338, df = 4, p-value = 0.7846

Model df: 6.   Total lags used: 10

Tampak pada hasil diatas dimana pada plot ACF sudah tidak ada nilai ACF yang signifikan pada lag berapapun, kemudian sisaan model terlihat mengikuti histogram sebaran normal. Lalu pada uji Ljung Box juga didapatkan p-value 0.7846 sehingga dapat diputuskan terima \(H_0\) yang artinya antar sisaan pada model tersebut sudah tidak berkorelasi.

3.6.1.2 Uji Kenormalan Sisaan

Uji kenormalan sisaan (uji Lilliefors) dapat diperoleh menggunakan fungsi lillie.test dari library nortest dengan argumen berupa vektor sisaan model.

> lillie.test(y$residuals)

    Lilliefors (Kolmogorov-Smirnov) normality test

data:  y$residuals
D = 0.061284, p-value = 0.4311

Diperoleh p-value sebesar 0.4311 sehingga dapat diputuskan terima \(H_0\) yang artinya sisaan model sudah mengikuti sebaran normal.

3.6.2 Overfit Model

Kode yang digunakan untuk melakukan overfit model sama seperti pendugaan parameter. Fungsi yang digunakan yakni Arima untuk menduga parameter model ARIMA sesuai argumen yang diinputkan dan fungsi coeftest untuk menguji signifikansi masing-masing parameter model.

> cat("ARIMA(3,1,4)")
ARIMA(3,1,4)
> y_overfit_1 <- Arima(closing_bbca, order = c(3,1,4))
> coeftest(y_overfit_1)

z test of coefficients:

     Estimate Std. Error  z value  Pr(>|z|)    
ar1  1.074110   0.058080  18.4938 < 2.2e-16 ***
ar2 -0.975864   0.076943 -12.6829 < 2.2e-16 ***
ar3  0.900702   0.047965  18.7785 < 2.2e-16 ***
ma1 -0.844643   0.117131  -7.2111 5.551e-13 ***
ma2  0.846822   0.110023   7.6968 1.396e-14 ***
ma3 -1.009077   0.114253  -8.8320 < 2.2e-16 ***
ma4  0.015868   0.117120   0.1355    0.8922    
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
> 
> cat("ARIMA(4,1,3)")
ARIMA(4,1,3)
> y_overfit_2 <- Arima(closing_bbca, order = c(4,1,3))
> coeftest(y_overfit_2)

z test of coefficients:

     Estimate Std. Error  z value  Pr(>|z|)    
ar1  1.057404   0.102453  10.3209 < 2.2e-16 ***
ar2 -0.957028   0.123367  -7.7576 8.658e-15 ***
ar3  0.883765   0.123658   7.1468 8.881e-13 ***
ar4  0.014690   0.103293   0.1422    0.8869    
ma1 -0.828266   0.031766 -26.0741 < 2.2e-16 ***
ma2  0.833276   0.058514  14.2405 < 2.2e-16 ***
ma3 -0.995463   0.059100 -16.8437 < 2.2e-16 ***
---
Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Parameter \(q\) yang ditambahkan pada model sudah tidak signifikan demikian pula parameter \(p\) yang ditambahkan pada model juga tidak signifikan. Akan tetapi parameter yang sudah ada pada model sebelumnya tetap signifikan. Hal ini menunjukkan bahwa model yang terbentuk sebelumnya merupakan model terbaik.

Persamaan model terbaik yang terbentuk adalah :

> extract_eq(y, use_coefs = TRUE)

\[ (1 +0.75\operatorname{B} +0.84\operatorname{B}^{\operatorname{2}} +0.74\operatorname{B}^{\operatorname{3}} )\ (1 - \operatorname{B}) y_{t} = (1 +0.97\operatorname{B} +1.13\operatorname{B}^{\operatorname{2}} +0.8\operatorname{B}^{\operatorname{3}} )\ \varepsilon_{t} \]

3.7 Peramalan

Pada peramalan digunakan fungsi forecast dari library forecast dan mengisi argumen pertama dengan objek berupa model terbaik yang terpilih sebelumnya dan argumen kedua berupa banyak periode yang akan dicari nilai ramalannya.Selanjutnya membuat plot dari dari nilai ramalan yang terbentuk menggunakan fungsi plot dan mengisi argumen dengan hasil ramalan sebelumnya.

Lalu menampilkan hasil ramalan dan selang kepercayaan dari nilai ramalan dalam bentuk dataframe. Pertama membentuk vektor periode yang berisi nilai 1 s.d. 4. Kedua memanggil fungsi data.frame dan mengisi argumen pertama dengan periode, argumen kedua sampai dengan keenam dengan masing-masing vektor selang kepercayaan dan nilai ramalan. Lalu mengubah nama masing-masing kolom pada tabel menggunakan perintah colnames. Terakhir membentuk tabel menggunakan fungsi kbl seperti pada tabel-tabel sebelumnya.

> future = forecast(y, h = 4)
> plot(future)

> periode <- seq(1:4)
> ramalan <- data.frame(periode,
+                       future$lower[,2], 
+                       future$lower[,1],
+                       future$mean, 
+                       future$upper[,1],
+                       future$upper[,2])
> colnames(ramalan) <- c("periode", "low 95%", "low 80%", "mean", "up 80%", "up 95%")
> 
> kbl(ramalan, 
+     caption = "**Tabel 4: Ramalan Harga Saham BBCA 4 Minggu Kedepan**",
+     align = 'c') %>%
+   kable_styling(full_width = F, html_font = "Open Sans") %>%
+   column_spec(2, background = "red") %>%
+   column_spec(3, background = "salmon") %>%
+   column_spec(4, bold = TRUE) %>%
+   column_spec(5, background = "lightgreen") %>%
+   column_spec(6, background = "lime")
Tabel 4: Ramalan Harga Saham BBCA 4 Minggu Kedepan
periode low 95% low 80% mean up 80% up 95%
1 7851.766 7966.240 8182.485 8398.731 8513.204
2 7619.724 7800.160 8141.012 8481.864 8662.300
3 7407.152 7643.269 8089.304 8535.339 8771.456
4 7345.867 7613.864 8120.121 8626.378 8894.375

Terlihat hasil dari ramalan dimana pada minggu pertama harga saham akan mengalami penguatan lalu dilanjutkan pelemahan di minggu kedua dan ketiga dan menguat kembali di minggu keempat. Secara probabilistik kemungkinan capaian nilai terendah yang mungkin selama 4 minggu kedepan pada nilai 7345 dan kemungkinan capaian tertinggi yang mungkin selama 4 minggu kedepan pada nilai 8894.

4 DAFTAR PUSTAKA

  1. Box, G. E. P., Jenkins, G. M., dan Reinsel, G. C. (2008). Time Series Analysis Forecasting and Control, 4th ed. New Jersey: John Wiley & Sons, Inc.
  2. Cryer, J. D. dan Chan, K. (2008). Time Series Analysis With Applications in R, 2nd ed. New York: Springer Science + Business Media, LLC.
  3. Mendenhall, W., Beaver, R. J., dan Beaver, B. M. (2009). Introduction to Probability and Statistics, 13th ed. Belmont: Cengage Learning.
  4. Wei, W. W. S. (2006). Time Series Analysis Univariate and Multivariate Methods, 2nd ed. New York: Pearson.