Tugas Minggu 7

Forecasting dan Uji Diagnostik

Pada Tugas Minggu ini, saya akan melakukan uji Diagnostik terhadap model yang didapat dan melakukan forecasting dengan model tersebut, syntax akan saya lanjutkan karena masih berhubungan dengan pemodelan yang dilakukan pada minggu 6.

Import Data

library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.2
library(tsibble)
## Warning: package 'tsibble' was built under R version 4.3.3
## Registered S3 method overwritten by 'tsibble':
##   method               from 
##   as_tibble.grouped_df dplyr
## 
## Attaching package: 'tsibble'
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, union
library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
library(MASS)
library(forecast)
## Warning: package 'forecast' was built under R version 4.3.3
library(TSA)
## Warning: package 'TSA' was built under R version 4.3.3
## Registered S3 methods overwritten by 'TSA':
##   method       from    
##   fitted.Arima forecast
##   plot.Arima   forecast
## 
## Attaching package: 'TSA'
## The following objects are masked from 'package:stats':
## 
##     acf, arima
## The following object is masked from 'package:utils':
## 
##     tar
library(TTR)
## Warning: package 'TTR' was built under R version 4.3.3
library(aTSA)
## Warning: package 'aTSA' was built under R version 4.3.2
## 
## Attaching package: 'aTSA'
## The following object is masked from 'package:forecast':
## 
##     forecast
## The following objects are masked from 'package:tseries':
## 
##     adf.test, kpss.test, pp.test
## The following object is masked from 'package:graphics':
## 
##     identify
library(graphics)
library(readxl)
## Warning: package 'readxl' was built under R version 4.3.2
data<-read_excel("C:/Users/Admin/Downloads/Adriano Excel Putra/data mpdw.xlsx")
head(data)
## # A tibble: 6 × 2
##   Waktu               `Harga Penutupan`
##   <dttm>                          <dbl>
## 1 2012-07-09 00:00:00              1490
## 2 2012-07-16 00:00:00              1570
## 3 2012-07-23 00:00:00              1600
## 4 2012-07-30 00:00:00              1540
## 5 2012-08-06 00:00:00              1590
## 6 2012-08-13 00:00:00              1610

Mengubah Jenis Data

Data.ts<- ts(data$`Harga Penutupan`)
## Membuat Plot Untuk Melihat Pola Saham

ts.plot(Data.ts, xlab="Waktu", ylab="Harga Penutupan", main="Time Series Plot")
points(Data.ts)

Dapat Dilihat Secara Eksplorasi Lewat Plot Time Series, Data ini memiliki Pola Tren. Tren pada data ini dapat dikatakan Tren yang positif karena terlihat adanya kenaikan berdasarkan waktu. Secara Visualisasi Kita dapat mengatakan Mungkin data ini Tidak stasioner dalam Rataan maupun dalam Ragam. Tidak stasioner dalam rataan karena adanya pola tren yang terbuat, tidak dalam ragam karena terdapat beberapa pola “Pita” yang berbeda di setiap urutan datanya.

Data Keseluruhan

Disini akan dicoba lihat pola secara keseluruhannya:

Data.ts<- ts(data$`Harga Penutupan`)

Plot Time Series

ts.plot(Data.ts, xlab="Waktu", ylab="Harga Penutupan", main="Time Series Plot")
points(Data.ts)

Dapat Dilihat Secara Eksplorasi Lewat Plot Time Series, Data ini memiliki Pola Tren. Tren pada data ini dapat dikatakan Tren yang positif karena terlihat adanya kenaikan berdasarkan waktu. Secara Visualisasi Kita dapat mengatakan Mungkin data ini Tidak stasioner dalam Rataan Tapi mungkin dalam Ragam. Tidak stasioner dalam rataan karena adanya pola tren yang terbuat, Stasioner dalam ragam karena terdapat beberapa pola “Pita” yang cenderung cukup sama di beberapa periode waktu.

Plot ACF

acf(Data.ts)

Dapat dilihat Dari Plot ACFnya bahkan sampai di LAG ke 20 saja masih Tails off slowly. Hal ini menunjukkan bahwa Data keseluruhan Penutupan Saham BBCA Periode 2012-2016 TIdak Stasioner dalam Rataan

Uji ADF

adf.test(Data.ts)
## Augmented Dickey-Fuller Test 
## alternative: stationary 
##  
## Type 1: no drift no trend 
##      lag  ADF p.value
## [1,]   0 0.96   0.909
## [2,]   1 1.31   0.952
## [3,]   2 1.25   0.945
## [4,]   3 1.23   0.943
## [5,]   4 1.38   0.957
## Type 2: with drift no trend 
##      lag   ADF p.value
## [1,]   0 -1.82   0.397
## [2,]   1 -1.49   0.525
## [3,]   2 -1.42   0.550
## [4,]   3 -1.55   0.504
## [5,]   4 -1.49   0.523
## Type 3: with drift and trend 
##      lag   ADF p.value
## [1,]   0 -3.27  0.0774
## [2,]   1 -2.51  0.3629
## [3,]   2 -2.52  0.3565
## [4,]   3 -2.68  0.2908
## [5,]   4 -2.36  0.4237
## ---- 
## Note: in fact, p.value = 0.01 means p.value <= 0.01

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.4236 yang lebih besar dari taraf nyata 5% dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF.

Uji Variance Plot Lambda Box-Cox

index <- seq(1:211)
bcfull = boxcox(Data.ts~index, lambda = seq(0,6,by=1))

#Nilai Rounded Lambda
lambda <- bcfull$x[which.max(bcfull$y)]
lambda
## [1] 1.151515
bcfull$x[bcfull$y > max(bcfull$y) - 1/2 * qchisq(.95,1)]
##  [1] 0.6060606 0.6666667 0.7272727 0.7878788 0.8484848 0.9090909 0.9696970
##  [8] 1.0303030 1.0909091 1.1515152 1.2121212 1.2727273 1.3333333 1.3939394
## [15] 1.4545455 1.5151515 1.5757576 1.6363636 1.6969697

Dilihat Dari Kumpulan Lambda Optimalnya, berkisar antara 0 sampai ke lambda 1.696967 . Dengan Lambda optimum di angka 0. Disini dapat dikatakan Data stasioner dalam ragam ,mengandung lambda 1. Lambda 1 sendiri artinya data tidak perlu ditransformasi ( memangkatkan data dengan 1) sehingga dapat dikatakan data itu sendiri sudah masuk kedalam wilayah Lambda-Lambda Boxcox. Jadi Dapat dikatakan Stasioner dalam Ragam.

Kesimpulan

Dari Data Saham BBCA Tahun 2012-2016. Set Partisi Data Pertama , yaitu Periode 2012- Pertengahan tahun 2014, Didapatkan Pola data yang tidak stasioner dalam rataan maupun ragam. Namun pola yang berbeda terjadi pada Data lanjutan 2014- 2016. Pola yang ditunjukkan masih tidak stasioner dalam rataan karena adanya trend kenaikan harga saham, namun dapat dikatakan stasioner dalam ragam.

Ketika Data digabungkan secara utuh, maka didapat kesimpulan Polanya tidak stasioner dalam rataan namun stasioner dalam Ragam.

Identifikasi Pendugaan Parameter

Sebelumnya kita telah menguji Kestasioneran Data Harga Saham Mingguan BBCA dari periode 2012-2016. Didapatkan bahwa Data tersebut Stasioner dalam Ragam namun tidak stasioner dalam rataan, Maka dari itu Saya akan melakukan penaganan ketidakstasioneran rataan melalui differencing

ts.plot(Data.ts, xlab="Waktu", ylab="Harga Penutupan", main="Time Series Plot")
points(Data.ts)

Dilihat Dari Pola Datanya, Saya akan melakukan splitting data 70:30 (Train:Test) Hal ini berdasarkan dari pola eksploratif dari data yang didapat.

Splitting Data

Train

sahamtrain<-Data.ts[1:130]
plot.ts(sahamtrain, lty=1, xlab="waktu", ylab="Saham", main="Plot Saham Train")

Test

sahamtest<-Data.ts[131:211]
plot.ts(sahamtest, lty=1, xlab="waktu", ylab="Saham", main="Plot Saham Test")

Uji Stasioneritas Data

Plot ACF Train

acf(sahamtrain)

Berdasarkan plot ACF, terlihat bahwa plot ACF data menurun secara perlahan (tails of slowly). Hal ini juga menjadi indikasi bahwa data tidak stasioner dalam rataan

Uji ADF Train

tseries::adf.test(sahamtrain)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  sahamtrain
## Dickey-Fuller = -2.1371, Lag order = 5, p-value = 0.5195
## alternative hypothesis: stationary

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.5195 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa data tidak stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga ketidakstasioneran model kedepannya harus ditangani

Plot Box-Cox Train

index <- seq(1:130)
bc = boxcox(sahamtrain~index, lambda = seq(5,10,by=1))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 5
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
## [1] 5.000000 5.050505 5.101010

Plot Boxcox menunjukkan nilai rounded value (\(\lambda\)) optimum sebesar 5 dan pada selang kepercayaan 95% nilai memiliki batas bawah 5 sampai 5.1 Selang tersebut tidak memuat nilai satu sehingga dapat dikatakan bahwa data bangkitan tidak stasioner dalam ragam.

Penaganan Ketidakstasioneran

train.diff<-diff(sahamtrain,differences = 1) 
plot.ts(train.diff, lty=1, xlab="waktu", ylab="Data Difference 1 Kurs", main="Plot Difference Kurs")

Setelah differncing 1 kita telah menyelesaikan permasalah kestasioneran secara visual, namun mari kita lihat dengan pengujian plot dan uji formal yang ada

Plot ACF Differencing

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cuts off pada lag ke 1. Hal ini menandakan data sudah stasioner dalam rataan dan ketidakstasioneran data telah berhasil tertangani.

Plot ADF Differencing

tseries::adf.test(train.diff)
## Warning in tseries::adf.test(train.diff): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  train.diff
## Dickey-Fuller = -5.064, Lag order = 5, p-value = 0.01
## alternative hypothesis: stationary

Aman ges

\(H_0\) : Data tidak stasioner dalam rataan

\(H_1\) : Data stasioner dalam rataan

Berdasarkan uji ADF tersebut, didapat p-value sebesar 0.01 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) atau data stasioner dalam rataan. Hal ini sesuai dengan hasil eksplorasi menggunakan plot time series dan plot ACF, sehingga dalam hal ini ketidakstasioneran data sudah berhasil ditangani dan dapat dilanjutkan ke pemodelan

Plot Boxcox

index <- seq(1:129)
library(MASS)
train.diff.pos <- train.diff + abs(min(train.diff)) + 1
bc <- boxcox(train.diff.pos ~ index, lambda = seq(-2, 2, by = 0.1))

#Nilai Rounded Lambda
lambda <- bc$x[which.max(bc$y)]
lambda
## [1] 0.9494949
#SK
bc$x[bc$y > max(bc$y) - 1/2 * qchisq(.95,1)]
##  [1] 0.7070707 0.7474747 0.7878788 0.8282828 0.8686869 0.9090909 0.9494949
##  [8] 0.9898990 1.0303030 1.0707071 1.1111111 1.1515152 1.1919192 1.2323232

Pada Tahap Ini, Karena Differencing , terdapat respon yang bernilai negatif. Hal ini tentu menjadi batasan dari transformasi box-cox yang mengharuskan semua variabel responnya berniali positif. Untuk itu saya melakukan perubahan pada variabel respon dengan fungsi absolute sehingga mendapat nilai posiif agar bisa dilakukan transformasi box cox. Setelah dilakukan transformasi, dapat dilihat bahwa Lambda 1 berada direntang lambda optimum , sehingga kita dapat menyimpulkan data ini stasioner dalam ragam.

Identifikasi Model

ACF

acf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot ACF cenderung cuts off pada lag ke 1, sehingga jika plot PACF dianggap tails of, maka model tentatifnya adalah ARIMA(0,1,1).

PACF

pacf(train.diff)

Berdasarkan plot tersebut, terlihat bahwa plot PACF cenderung cuts off pada lag ke 1, sehingga jika plot ACF dianggap tails of, maka model tentatifnya adalah ARIMA(1,1,0).

Jika baik plot ACF maupun plot PACF keduanya dianggap tails of, maka model yang terbentuk adalah ARIMA(1,1,1)

Plot EACF

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

Identifikasi model menggunakan plot EACF dilakukan dengan melihat ujung segitiga pada pola segitiga nol. Dalam hal ini model tentatif yang terbentuk adalah ARIMA(0,1,1), ARIMA(1,1,1), ARIMA(2,1,1), dan ARIMA(1,1,2), ARIMA (0,1,3).

Pendugaan Parameter Model Tentatif

ARIMA(0,1,1)

model1=Arima(train.diff, order=c(0,0,1),method="ML")
summary(model1) #AIC=1461.07
## Series: train.diff 
## ARIMA(0,0,1) with non-zero mean 
## 
## Coefficients:
##           ma1    mean
##       -0.1778  8.8617
## s.e.   0.0868  4.9370
## 
## sigma^2 = 4708:  log likelihood = -727.53
## AIC=1461.07   AICc=1461.26   BIC=1469.65
## 
## Training set error measures:
##                     ME     RMSE      MAE MPE MAPE      MASE         ACF1
## Training set 0.1084488 68.08361 51.64934 NaN  Inf 0.6434176 -0.002826794
lmtest::coeftest(model1) # Paramater MA signfikan pada alpha 5 %, Intercept Signfikan pada taraf 10%.
## 
## z test of coefficients:
## 
##           Estimate Std. Error z value Pr(>|z|)  
## ma1       -0.17781    0.08677 -2.0492  0.04044 *
## intercept  8.86166    4.93705  1.7949  0.07266 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA (1,1,0)

model2=Arima(train.diff, order=c(1,0,0),method="ML")
summary(model2) 
## Series: train.diff 
## ARIMA(1,0,0) with non-zero mean 
## 
## Coefficients:
##           ar1    mean
##       -0.1804  8.8743
## s.e.   0.0866  5.0818
## 
## sigma^2 = 4704:  log likelihood = -727.47
## AIC=1460.94   AICc=1461.14   BIC=1469.52
## 
## Training set error measures:
##                      ME     RMSE      MAE MPE MAPE      MASE        ACF1
## Training set 0.08984153 68.05038 51.62459 NaN  Inf 0.6431092 0.001892674
lmtest::coeftest(model2) #Paramater AR signfikan pada alpha 5 %, Intercept Signfikan pada taraf 10%.
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value Pr(>|z|)  
## ar1       -0.180439   0.086605 -2.0835  0.03721 *
## intercept  8.874304   5.081786  1.7463  0.08076 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA (1,1,1)

model3=Arima(train.diff, order=c(1,0,1),method="ML")
summary(model3) #AIC= 1462.93
## Series: train.diff 
## ARIMA(1,0,1) with non-zero mean 
## 
## Coefficients:
##           ar1     ma1   mean
##       -0.2465  0.0685  8.881
## s.e.   0.4775  0.4923  5.141
## 
## sigma^2 = 4740:  log likelihood = -727.46
## AIC=1462.93   AICc=1463.25   BIC=1474.37
## 
## Training set error measures:
##                      ME     RMSE     MAE MPE MAPE      MASE          ACF1
## Training set 0.08137256 68.04595 51.6583 NaN  Inf 0.6435291 -0.0001478487
lmtest::coeftest(model3) # Intercept signifkan di Alpha 10%
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value Pr(>|z|)  
## ar1       -0.246531   0.477467 -0.5163  0.60562  
## ma1        0.068479   0.492268  0.1391  0.88936  
## intercept  8.881050   5.141047  1.7275  0.08408 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA (2,1,1)

model4=Arima(train.diff, order=c(2,0,1),method="ML")
summary(model4) #AIC= 1464.93
## Series: train.diff 
## ARIMA(2,0,1) with non-zero mean 
## 
## Coefficients:
##           ar1      ar2     ma1    mean
##       -0.2499  -0.0017  0.0717  8.8825
## s.e.   1.4201   0.2538  1.4206  5.1358
## 
## sigma^2 = 4778:  log likelihood = -727.46
## AIC=1464.93   AICc=1465.41   BIC=1479.23
## 
## Training set error measures:
##                      ME     RMSE      MAE MPE MAPE      MASE          ACF1
## Training set 0.07976898 68.04589 51.65556 NaN  Inf 0.6434951 -7.350304e-06
lmtest::coeftest(model4) # Intercept signifkan di Alpha 10%
## 
## z test of coefficients:
## 
##             Estimate Std. Error z value Pr(>|z|)  
## ar1       -0.2498959  1.4200893 -0.1760  0.86032  
## ar2       -0.0016569  0.2537731 -0.0065  0.99479  
## ma1        0.0716680  1.4205859  0.0504  0.95976  
## intercept  8.8824723  5.1357758  1.7295  0.08371 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA (1,1,2)

model5=Arima(train.diff, order=c(1,0,2),method="ML")
summary(model5) #AIC= 4754.71
## Series: train.diff 
## ARIMA(1,0,2) with non-zero mean 
## 
## Coefficients:
##           ar1     ma1      ma2    mean
##       -0.2776  0.0983  -0.0101  8.8783
## s.e.   0.6451  0.6433   0.1526  5.1093
## 
## sigma^2 = 4778:  log likelihood = -727.46
## AIC=1464.92   AICc=1465.41   BIC=1479.22
## 
## Training set error measures:
##                      ME     RMSE      MAE MPE MAPE      MASE         ACF1
## Training set 0.08519107 68.04472 51.66024 NaN  Inf 0.6435533 0.0005861324
lmtest::coeftest(model5) # Intercept Signfikan bila di alpha 10 %
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value Pr(>|z|)  
## ar1       -0.277563   0.645064 -0.4303  0.66699  
## ma1        0.098323   0.643300  0.1528  0.87852  
## ma2       -0.010104   0.152586 -0.0662  0.94721  
## intercept  8.878273   5.109333  1.7377  0.08227 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

ARIMA (0,0,3)

model6=Arima(train.diff, order=c(0,0,3),method="ML")
summary(model6) #AIC= 4753.58 
## Series: train.diff 
## ARIMA(0,0,3) with non-zero mean 
## 
## Coefficients:
##           ma1     ma2      ma3    mean
##       -0.2016  0.0660  -0.1413  8.9001
## s.e.   0.0885  0.1001   0.1079  4.3296
## 
## sigma^2 = 4721:  log likelihood = -726.71
## AIC=1463.43   AICc=1463.92   BIC=1477.73
## 
## Training set error measures:
##                     ME     RMSE     MAE MPE MAPE      MASE       ACF1
## Training set 0.1152985 67.63444 52.3444 NaN  Inf 0.6520762 0.01121321
lmtest::coeftest(model6) # Parameter MA 1 da Intercept Signfikan
## 
## z test of coefficients:
## 
##            Estimate Std. Error z value Pr(>|z|)  
## ma1       -0.201609   0.088535 -2.2772  0.02278 *
## ma2        0.066008   0.100074  0.6596  0.50952  
## ma3       -0.141265   0.107945 -1.3087  0.19064  
## intercept  8.900073   4.329617  2.0556  0.03982 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Kesimpulan Model

#Ambil AIC dari Model1.da sampai Model6.da Untuk Dibandingkan


AIC1<-summary(model1)$aic
AIC2<-summary(model2)$aic
AIC3<-summary(model3)$aic
AIC4<-summary(model4)$aic
AIC5<-summary(model5)$aic
AIC6<-summary(model6)$aic

#Ambil Sigma^2 dari Model1.da sampai Model6.da Untuk Dibandingkan


sig1<-summary(model1)$sigma2
sig2<-summary(model2)$sigma2
sig3<-summary(model3)$sigma2
sig4<-summary(model4)$sigma2
sig5<-summary(model5)$sigma2
sig6<-summary(model6)$sigma2


Conclussion<-data.frame(Model=c("ARIMA(0,1,1)","ARIMA(1,1,0)","ARIMA(1,1,1)","ARIMA(2,1,1)","ARIMA(1,1,2)","ARIMA(0,1,3)"), AIC=c(AIC1,AIC2,AIC3,AIC4,AIC5,AIC6), Sigma2=c(sig1,sig2,sig3,sig4,sig5,sig6)
)

Conclussion
##          Model      AIC   Sigma2
## 1 ARIMA(0,1,1) 1461.068 4708.376
## 2 ARIMA(1,1,0) 1460.943 4703.782
## 3 ARIMA(1,1,1) 1462.927 4740.495
## 4 ARIMA(2,1,1) 1464.926 4778.411
## 5 ARIMA(1,1,2) 1464.922 4778.247
## 6 ARIMA(0,1,3) 1463.428 4720.798

Dari Perbandingan Model Didapatkan Model terbaik adalah ARIMA (1,1,0). Model ini diambil dengan perbandingan AIC dan Varians model yang paling kecil. Selain itu pada model ini juga seluruh parameternya signifikan walau unutk Parameter AR 1 , alpha perlu di turunkan menjadi 90% agar masih signifikan. Sehingga Dapat dikatakan pada Model ARIMA (1,1,0), seluruh parameter signifikan pada taraf nyata 90%.

Overfitting Model Terbaik

Disini model yang terbaik adalah Model ARIMA (1,1,0) dengan beberapa pertimbangan diatas, kemudian akan dicobakan overfitting ke model ARIMA (2,1,0), dimana pada Case sebelumnya ARIMA (1,1,1) sudah di coba namun masih lebih baik model sebelumnya ARIMA (1,1,0).

Model Arima (2,1,0)

model7=Arima(train.diff, order=c(2,0,0),method="ML")
summary(model7) 
## Series: train.diff 
## ARIMA(2,0,0) with non-zero mean 
## 
## Coefficients:
##           ar1     ar2    mean
##       -0.1787  0.0096  8.8796
## s.e.   0.0881  0.0878  5.1304
## 
## sigma^2 = 4741:  log likelihood = -727.47
## AIC=1462.93   AICc=1463.25   BIC=1474.37
## 
## Training set error measures:
##                      ME     RMSE      MAE MPE MAPE      MASE         ACF1
## Training set 0.08299789 68.04722 51.64627 NaN  Inf 0.6433793 0.0004793729
lmtest::coeftest(model7) 
## 
## z test of coefficients:
## 
##             Estimate Std. Error z value Pr(>|z|)  
## ar1       -0.1786562  0.0881170 -2.0275  0.04261 *
## ar2        0.0095556  0.0878122  0.1088  0.91335  
## intercept  8.8796458  5.1304276  1.7308  0.08349 .
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Dapat dilihat bahwa Pada Model terbaru, Parameter AR baru tidak signifikan terhadap dimana didapatkan P-valuenya sangat tinggi. Hal ini mengindikasikan bahwa lebih baik melakukan peramalan dengan model sebelumnya yaitu model ARIMA (1,1,0).

Diagnostik Model

isaan model ARIMA harus memenuhi asumsi normalitas, kebebasan sisaan, dan kehomogenan ragam. Diagnostik model dilakukan secara eksplorasi dan uji formal. Diagnostik Model pertama akan dilkaukan lewat eksplorasi plot.

Eksplorasi

#Eksplorasi 
sisaan.da <- model2$residuals 
par(mfrow=c(2,2)) 
qqnorm(sisaan.da) 
qqline(sisaan.da, col = "blue", lwd = 2) 
plot(c(1:length(sisaan.da)),sisaan.da) 
acf(sisaan.da) 
pacf(sisaan.da) 

par(mfrow = c(1,1))

Berdasarkan plot kuantil-kuantil normal, secara eksplorasi ditunjukkan sisaan sepertinya tidak menyebar normal ditandai dengan titik titik yang cenderung tidak mengikuti garis \(45^{\circ}\). Kemudian dapat dilihat juga lebar pita sisaan yang cenderung sama menandakan bahwa sepertinya homogen . Plot ACF dan PACF sisaan ARIMA(1,1,0) juga tidak signifikan pada 20 lag awal yang menandakan saling bebas. Kondisi ini akan diuji lebih lanjut dengan uji formal.

Uji Formal

Normalitas

#1) Sisaan Menyebar Normal 
ks.test(sisaan.da,"pnorm")  #tak tolak H0 > sisaan menyebar normal
## Warning in ks.test.default(sisaan.da, "pnorm"): ties should not be present for
## the Kolmogorov-Smirnov test
## 
##  Asymptotic one-sample Kolmogorov-Smirnov test
## 
## data:  sisaan.da
## D = 0.4806, p-value < 2.2e-16
## alternative hypothesis: two-sided

Selain dengan eksplorasi, asumsi tersebut dapat diuji menggunakan uji formal. Pada tahapan ini uji formal yang digunakan untuk normalitas adalah uji Kolmogorov-Smirnov (KS). Hipotesis pada uji KS adalah sebagai berikut.

\(H_0\) : Sisaan menyebar normal

\(H_1\) : Sisaan tidak menyebar normal

Berdasarkan uji KS tersebut, didapat p-value sebesar 0.00000 … yang kurang dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa sisaan tidak menyebar normal. Hal ini sesuai dengan hasil eksplorasi menggunakan plot kuantil-kuantil normal.

Autokorelasi

#2) Sisaan saling bebas/tidak ada autokorelasi 
Box.test(sisaan.da, type = "Ljung")  #tak tolak H0 > sisaan saling bebas
## 
##  Box-Ljung test
## 
## data:  sisaan.da
## X-squared = 0.00047294, df = 1, p-value = 0.9826

Selanjutnya akan dilakukan uji formal untuk kebebasan sisaan menggunakan uji Ljung-Box. Hipotesis yang digunakan adalah sebagai berikut.

\(H_0\) : Sisaan saling bebas

\(H_1\) : Sisaan tidak tidak saling bebas

Berdasarkan uji Ljung-Box tersebut, didapat p-value sebesar 0.9826 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa sisaan saling bebas.

Sisaan Homogen

#3) Sisaan homogen 
Box.test((sisaan.da)^2, type = "Ljung")  #tak tolak H0 > sisaan homogen
## 
##  Box-Ljung test
## 
## data:  (sisaan.da)^2
## X-squared = 5.9962, df = 1, p-value = 0.01434

Hipotesis yang digunakan untuk uji kehomogenan ragam adalah sebagai berikut.

\(H_0\) : Ragam sisaan homogen

\(H_1\) : Ragam sisaan tidak homogen

Berdasarkan uji Ljung-Box terhadap sisaan kuadrat tersebut, didapat p-value sebesar 0.01434 yang lebih kecil dari taraf nyata 5% sehingga tolak \(H_0\) dan menandakan bahwa ragam sisaan tidak homogen.

Nilai Rataan

#4) Nilai tengah sisaan sama dengan nol 
t.test(sisaan.da, mu = 0, conf.level = 0.95)  #tak tolak h0 > nilai tengah sisaan sama dengan 0
## 
##  One Sample t-test
## 
## data:  sisaan.da
## t = 0.014937, df = 128, p-value = 0.9881
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -11.81158  11.99126
## sample estimates:
##  mean of x 
## 0.08984153

Terakhir, dengan uji-t, akan dicek apakah nilai tengah sisaan sama dengan nol. Hipotesis yang diujikan sebagai berikut.

\(H_0\) : nilai tengah sisaan sama dengan 0

\(H_1\) : nilai tengah sisaan tidak sama dengan 0

Berdasarkan uji-ttersebut, didapat p-value sebesar 0.9881 yang lebih besar dari taraf nyata 5% sehingga tak tolak \(H_0\) dan menandakan bahwa nilai tengah sisaan sama dengan nol. Hal ini berbeda dengan eksplorasi.

Masalah Normalitas dan Kehomogonenan ragam bisa diatasi dengan melakukan transformasi terhadap peubahnya sehingga dapat membuat distiribusi data menjadi normal. Metode pemodelan lain juga bisa digunakan sehingga bisa menghasilkan model yang lebih resisten terhadap asumsi

Peramalan

Peramalan akan dilakukan sesuai Splitting data yang telah ditentukan yaitu sebanyak 82 data.

ramalan.da <- forecast::forecast(model2, h = 81) 
ramalan.da
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 130       9.573381 -78.32071 97.46747 -124.8490 143.9958
## 131       8.748163 -80.56531 98.06163 -127.8450 145.3413
## 132       8.897065 -80.46224 98.25637 -127.7662 145.5603
## 133       8.870197 -80.49060 98.23099 -127.7953 145.5357
## 134       8.875045 -80.48580 98.23589 -127.7906 145.5407
## 135       8.874170 -80.48668 98.23502 -127.7915 145.5398
## 136       8.874328 -80.48652 98.23518 -127.7913 145.5400
## 137       8.874300 -80.48655 98.23515 -127.7913 145.5399
## 138       8.874305 -80.48654 98.23515 -127.7913 145.5399
## 139       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 140       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 141       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 142       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 143       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 144       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 145       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 146       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 147       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 148       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 149       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 150       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 151       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 152       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 153       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 154       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 155       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 156       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 157       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 158       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 159       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 160       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 161       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 162       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 163       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 164       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 165       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 166       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 167       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 168       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 169       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 170       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 171       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 172       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 173       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 174       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 175       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 176       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 177       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 178       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 179       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 180       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 181       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 182       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 183       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 184       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 185       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 186       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 187       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 188       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 189       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 190       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 191       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 192       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 193       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 194       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 195       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 196       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 197       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 198       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 199       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 200       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 201       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 202       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 203       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 204       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 205       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 206       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 207       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 208       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 209       8.874304 -80.48654 98.23515 -127.7913 145.5399
## 210       8.874304 -80.48654 98.23515 -127.7913 145.5399
data.ramalan.da <- ramalan.da$mean
plot(ramalan.da)

Berdasarkan hasil plot ramalan di atas, dapat dilihat bahwa ramalan ARIMA(1,1,0) cenderung stabil hingga akhir periode, kemudian akan dilakukan pencarian akurasi dari ramalan tersebut .

Plotting

sahamtrain<-Data.ts[1:130]

train.ts<-ts(sahamtrain)

sahamtest<- Data.ts[131:211]

test.ts<- ts(sahamtest)
# Nilai akhir data latih
pt_1 <- train.ts[130]  
hasil.forc.Diff <- data.ramalan.da

# Invers differencing untuk mendapatkan hasil
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1

# Buat dua plot dalam satu tampilan
par(mfrow = c(1, 2))  # Mengatur layout untuk 2 plot dalam 1 baris

# Plot pertama: train.ts dan hasil
ts.plot(train.ts, hasil, col = c("blue", "red"), lty = 1:1)
legend("topright", legend = c("Train", "Hasil"), col = c("blue", "red"), lty = 1, cex = 0.8)

# Gabungkan train.ts dan test.ts menjadi satu time series
combined_ts <- ts(c(train.ts, test.ts), start = start(train.ts), frequency = frequency(train.ts))

# Plot train.ts dan test.ts yang sudah digabung
ts.plot(combined_ts, col = "blue", lty = 1)



# Tambahkan legenda untuk membedakan train + test dan hasil prediksi
legend("topright", legend = c("Train + Test"), col = "blue", lty = 1, cex = 0.8)

Bila dibandingkan , Grafik kiri adalah grafik peramalan dan grafik kanan adalah grafik asli datanya. Dapat dilihat bahwa Forecasting yang dilakukan mampu membaca trend harga Saham BBCA namun kurang mampu dalam memprediksi nilai angka saham secara akurat.

pt_1 <- train.ts[130]  # nilai akhir data latih
hasil.forc.Diff <- data.ramalan.da
hasil <- diffinv(hasil.forc.Diff, differences = 1) + pt_1

# Plot train.ts dan hasil dengan warna berbeda
ts.plot(train.ts, hasil, col = c("blue", "red"), lty = 1:1)

# Tambahkan legenda jika diperlukan
legend("topright", legend = c("Train", "Hasil"), col = c("blue", "red"), lty = 1, cex = 0.8)

Dapat dilihat bahwa hasil forecastingnya untuk Model ARIMA (1,1,0) cenderung stabil dan menunjukkan pola tren positif di waktu kedepan, bila dibandingkan data aslinya hasil ini berbeda dengan data asli, maka akan dibandingkan untuk melihat akurasinya.

perbandingan.da<-matrix(data=c(head(sahamtest, n=81), hasil[-1]),
                     nrow = 81, ncol = 2)
colnames(perbandingan.da)<-c("Aktual","Hasil Forecast")
perbandingan.da
##       Aktual Hasil Forecast
##  [1,]   2585       2654.573
##  [2,]   2590       2663.322
##  [3,]   2665       2672.219
##  [4,]   2675       2681.089
##  [5,]   2740       2689.964
##  [6,]   2805       2698.838
##  [7,]   2810       2707.712
##  [8,]   2820       2716.587
##  [9,]   2920       2725.461
## [10,]   2820       2734.335
## [11,]   2865       2743.210
## [12,]   2890       2752.084
## [13,]   2960       2760.958
## [14,]   3010       2769.832
## [15,]   2950       2778.707
## [16,]   2980       2787.581
## [17,]   2695       2796.455
## [18,]   2755       2805.330
## [19,]   2705       2814.204
## [20,]   2870       2823.078
## [21,]   2825       2831.953
## [22,]   2730       2840.827
## [23,]   2650       2849.701
## [24,]   2740       2858.576
## [25,]   2710       2867.450
## [26,]   2725       2876.324
## [27,]   2660       2885.198
## [28,]   2700       2894.073
## [29,]   2745       2902.947
## [30,]   2620       2911.821
## [31,]   2750       2920.696
## [32,]   2650       2929.570
## [33,]   2375       2938.444
## [34,]   2570       2947.319
## [35,]   2450       2956.193
## [36,]   2385       2965.067
## [37,]   2455       2973.941
## [38,]   2360       2982.816
## [39,]   2375       2991.690
## [40,]   2640       3000.564
## [41,]   2560       3009.439
## [42,]   2695       3018.313
## [43,]   2580       3027.187
## [44,]   2710       3036.062
## [45,]   2585       3044.936
## [46,]   2630       3053.810
## [47,]   2630       3062.685
## [48,]   2625       3071.559
## [49,]   2640       3080.433
## [50,]   2645       3089.307
## [51,]   2635       3098.182
## [52,]   2660       3107.056
## [53,]   2600       3115.930
## [54,]   2600       3124.805
## [55,]   2600       3133.679
## [56,]   2620       3142.553
## [57,]   2685       3151.428
## [58,]   2655       3160.302
## [59,]   2610       3169.176
## [60,]   2670       3178.050
## [61,]   2715       3186.925
## [62,]   2680       3195.799
## [63,]   2740       3204.673
## [64,]   2665       3213.548
## [65,]   2660       3222.422
## [66,]   2615       3231.296
## [67,]   2610       3240.171
## [68,]   2625       3249.045
## [69,]   2610       3257.919
## [70,]   2620       3266.793
## [71,]   2630       3275.668
## [72,]   2605       3284.542
## [73,]   2600       3293.416
## [74,]   2625       3302.291
## [75,]   2585       3311.165
## [76,]   2580       3320.039
## [77,]   2555       3328.914
## [78,]   2645       3337.788
## [79,]   2645       3346.662
## [80,]   2800       3355.537
## [81,]   2905       3364.411
accuracy(ts(hasil[-1]), head(sahamtest, n=81))
##                 ME     RMSE      MAE       MPE     MAPE
## Test set -335.6744 438.9206 378.9251 -12.95247 14.43996

Secara keseluruhan, nilai-nilai ini memberikan gambaran tentang kinerja model pada set pengujian. RMSE dan MAE yang tinggi menunjukkan kesalahan prediksi yang cukup besar. MPE negatif menunjukkan kecenderungan underprediction, sementara MAPE memberikan gambaran tentang besarnya kesalahan relatif. Dimana MAPE yang didapat adalah 14.4 %. Sehingga dapat dikatakan model ini cukup layak namun jika kita melihat nilai test dan nilai aktualnya, tentunya model ini belum bisa dijadikan model yang cukup andal dalah memprediksi harga saham, dimana disni model hanya mampu menangkap pola trennya saja tanpa dengan tepat memprediksikan nilainya.