Tugas Minggu 6

Pada Kesempatan kali ini, kami dari Kelompok 1 mendapatkan tema Ekonomi. Sehubungan dengan hal tersebut, kami memutuskan untuk mengambil dataset Saham BBCA sebagai acuan data deret waktu kami. Harga Saham yang kami ambil adalah harga penutupan saham Mingguan dari Tahun (2004- 2024). Harga Mingguan Saham sejatinya adalah harga terakhir penutupan sebuah saham pada rentan waktu dimana saham itu dijual di bursa dalam suatu minggu, yang adalah Hari Jumat Pukul 3 Sore.

Saya Mendapat Bagian rentetatan Saham dari Tahun 2012- 2016.

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:212]
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) #AIC=1460.94
## 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 dnegan 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%.