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
## Warning: package 'ggplot2' was built under R version 4.3.2
## 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
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
## Warning: package 'forecast' was built under R version 4.3.3
## 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
## Warning: package 'TTR' was built under R version 4.3.3
## 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
## Warning: package 'readxl' was built under R version 4.3.2
## # 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:
Plot Time Series
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
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
## 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
## [1] 1.151515
## [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
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
Uji Stasioneritas Data
Plot ACF Train
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
##
## 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
## [1] 5
## [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
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
## 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))## [1] 0.9494949
## [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
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
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
## 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)
## 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)
## 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)
## 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
##
## 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)
## 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
##
## 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)
## 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
##
## 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)
## 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
##
## 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)
## 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
##
## 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) 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
## 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
##
## 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.
## 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
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
## 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.