Analisis Deret Waktu

Analisis deret waktu adalah suatu metode untuk menganalisis dan memodelkan data statistik yang dikumpulkan dalam urutan waktu. Data deret waktu terdiri dari serangkaian observasi yang diambil pada interval waktu yang konsisten, seperti data bulanan, mingguan, harian, atau bahkan tahunan.

Tujuan dari analisis deret waktu adalah untuk memahami pola, tren, siklus, dan fluktuasi yang terdapat dalam data seiring waktu. Hal ini melibatkan identifikasi komponen penting dalam deret waktu, seperti tren jangka panjang, fluktuasi musiman, pola siklus, dan variabilitas acak.

berikut ini adalah contoh data time series dengan mengambil data saham bni dari tahun 2004-2023 dengan measukkan file excel

Selanjutnya data yang digunakan kemudian ditransformasi dalam bentuk time series dengan menggunakan fungsi dari ts.data

1.1 Data

Berikut ini adalah Data Saham BNI yang di gunakan untuk analisis Time Series

library(readxl)
## Warning: package 'readxl' was built under R version 4.3.2
data <- read_excel("Data saham 3.xlsx", 
    range = "A1:G237")

data.ts <- ts((data$hight+data$low)/2,
              start = c(2004, 1),
              end = c(2023, 11),
              frequency = 12)
print(data.ts)
##         Jan    Feb    Mar    Apr    May    Jun    Jul    Aug    Sep    Oct
## 2004 4875.0 7610.0 9800.0 8962.5 9025.0 9112.5 9100.0 9400.0 9250.0 9175.0
## 2005 9387.5 9012.5 8850.0 8300.0 7550.0 8512.5 8712.5 8987.5 8050.0 7612.5
## 2006 7000.0 6450.0 5262.5 5112.5 4905.0 5155.0 5462.5 5862.5 5962.5 5825.0
## 2007 5482.5 4665.0 4842.5 4862.5 4685.0 4500.0 3650.0 4060.0 5010.0 7312.5
## 2008 7487.5 7362.5 7637.5 7912.5 8837.5 8825.0 8700.0 9825.0 9087.5 8987.5
## 2009 8187.5 7112.5 7400.0 7612.5 7175.0 7675.0 7962.5 8450.0 9150.0 9550.0
## 2010 8025.0 7512.5 7325.0 7287.5 7000.0 6562.5 6787.5 6387.5 6550.0 6025.0
## 2011 5267.5 5387.5 5587.5 5687.5 5400.0 4937.5 4535.0 4935.0 5207.5 5255.0
## 2012 4950.0 4725.0 4345.0 4660.0 5062.5 5962.5 6725.0 6762.5 6887.5 6625.0
## 2013 5825.0 5462.5 5662.5 5260.0 5020.0 4820.0 4935.0 5012.5 4887.5 4447.5
## 2014 4437.5 4487.5 4200.0 3875.0 4100.0 4437.5 5237.5 5150.0 4787.5 4287.5
## 2015 3687.5 3862.5 3850.0 3812.5 3850.0 3675.0 3812.5 4025.0 3812.5 3550.0
## 2016 3800.0 3625.0 3612.5 4150.0 4137.5 3725.0 3925.0 4012.5 3775.0 3362.5
## 2017 3662.0 3685.0 3484.0 3010.0 2548.0 2287.0 2263.5 2287.0 1991.0 1749.0
## 2018 1810.5 1853.0 1879.0 1843.5 1697.0 1583.5 1384.0  948.0  668.5  687.0
## 2019  490.5  632.5 1071.5 1270.5 1256.0 1194.5 1194.5 1213.5 1388.5 1654.5
## 2020 1820.0 1967.0 1865.0 1934.0 2488.0 2382.5 2149.5 1948.5 1714.5 1653.5
## 2021 2056.0 2056.0 1726.0 1163.5 1042.0 1098.0 1214.5 1280.0 1205.5 1187.0
## 2022 1135.5 1303.5 1383.0 1383.0 1560.5 1639.5 1532.0 1546.5 1649.0 1569.5
## 2023 1401.5 1238.0 1133.0 1074.5 1039.5  992.5 1109.5 1144.5 4875.0 7610.0
##         Nov    Dec
## 2004 9012.5 9550.0
## 2005 7112.5 6812.5
## 2006 6062.5 6337.5
## 2007 7487.5 7712.5
## 2008 9025.0 8637.5
## 2009 9562.5 9100.0
## 2010 5600.0 5425.0
## 2011 5025.0 4965.0
## 2012 6012.5 6000.0
## 2013 4040.0 3987.5
## 2014 3787.5 3662.5
## 2015 3775.0 3850.0
## 2016 3500.0 4350.0
## 2017 1856.0 1874.5
## 2018  725.0  578.0
## 2019 1649.5 1867.5
## 2020 1785.0 1812.5
## 2021 1257.0 1205.5
## 2022 1551.0 1495.5
## 2023 9800.0

Menampilkan Plot data

plot(data.ts, xlab = "Periode",
     ylab = "Saham",
     col = "red",
     main = "Saham")

points(data.ts, col ="red")

1.2 Melakukan Uji Stasioner

uji stasioner dilakukan untuk mengetahui apakah data deret waktu yang digunakan bersifat stasioner atau tidak stasioner. sifat kestasioneran (stasionary) sangat penting bagi data time series, karena jika suatu data time series tidak stasioner maka kita hanya dapat mempelajari perilakunya pada waktu tertentu, sedangkan untuk peramalan (forecasting) akan sulit untuk dilakukan. Pengujian terhadap keberadaan unit root untuk semua variabel yang dimasukkan kedalam model menunjukkan bahwa seluruh variabel pada level tidak mempunyai unit root atau dapat di katakan sema variabel stasioner. Dalam analisis ini menggunakan unit root dengan menggunakan pendekatan uji Argumented Dickey-Fuller (ADF) dan Kwiatkwoski-Philips-Schmidt-Shin (KPSS). Uji Argumented Dickey-Fuller (ADF) menggunakan fungsi adf.test dan Kwiatkwoski-Philips-Schmidt-Shin (KPSS) menggunakan fungsi kpss.test.

library(tseries)
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo
x<- rnorm(236)
adf.test (x)
## Warning in adf.test(x): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  x
## Dickey-Fuller = -5.2645, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary
x<-rnorm(236)
kpss.test(x)
## Warning in kpss.test(x): p-value greater than printed p-value
## 
##  KPSS Test for Level Stationarity
## 
## data:  x
## KPSS Level = 0.077873, Truncation lag parameter = 4, p-value = 0.1

Berdasarkan hasil uji Argumented Dickey-Fuller diperoleh p-value sebesar 0.576 > 0.05 yang berarti bahwa H0 gagal ditolak atau data tidak stasioner. karena data tidak stasioner maka langka selanjutnya dilakukan differencing untuk membuat data stasioner sebelum dilakukan identifikasi model tentatif.

1.3 Melakukan Differencing Data

Apabila dalam uji ADF ditemukan data yang tidak stasioner, maka harus menstasionerkan data terlebih dahulu dengan proses differencing. Proses differencing dilakukan sampai data menjadi stasioner.

differenced_data <-diff(data.ts)
data.dif1 <-diff(data.ts,
                 differences = 1)

plot(data.dif1,
     main = "Data yang Telah di-Defferencing")

y <- diffinv(x)
adf.test(y)
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -2.2482, Lag order = 6, p-value = 0.4715
## alternative hypothesis: stationary

setelah melakukan differencing hasil dari p-value 0.2028 > 0.05, artinya bahwa H0 gagal ditolak atau data tidak stasioner setelah melakukan 1 kali differncing. karena nilai p-value belum stasioner jadi kita perlu melakukan differencing kedua.

differenced_data <-diff(data.ts)
data.dif2 <-diff(data.ts,
                 lag =  2)

plot(data.dif2,
     main = "Data yang Telah di-Defferencing")

y <- lag(x)
adf.test(y)
## Warning in adf.test(y): p-value smaller than printed p-value
## 
##  Augmented Dickey-Fuller Test
## 
## data:  y
## Dickey-Fuller = -6.3715, Lag order = 6, p-value = 0.01
## alternative hypothesis: stationary

Hasilnya memerlukan 2 kali differencing untuk membuat data stasioner. jadi model dasar ini bahwa model optimal yang hanya membutuhkan 2 kali differencing.

1.4 ACF dan PACF Plot:

Plot ACF (Autocorrelation Function) dan PACF(Partial Autocorrelation Function) dari data yang telah didifferencing. plot ini akan membantu menentukan nilai p(lag untuk model AR) dan q(lag untuk model MA).

pacf(data.dif2,
     main = "Plot PACF Data Saham")

pacf(data.dif2,
     main = "Plot ACF Data Saham")

Memodelkan Data dengan ARIMA

selanjutnya membuat model ARIMA menggunakan fungsi auto.arima, fungsi otomatis ini akan memberikan hasil yang optimal berdasarkan pola korelasi dalam data dan memilih nilai p, d, dan q yang sesuai untuk model ARIMA.

library(forecast)
## Warning: package 'forecast' was built under R version 4.3.2
model_arima <- auto.arima(x,
           trace = TRUE)
## 
##  Fitting models using approximations to speed things up...
## 
##  ARIMA(2,0,2) with non-zero mean : 654.9776
##  ARIMA(0,0,0) with non-zero mean : 657.2161
##  ARIMA(1,0,0) with non-zero mean : 659.8263
##  ARIMA(0,0,1) with non-zero mean : 658.8124
##  ARIMA(0,0,0) with zero mean     : 657.2787
##  ARIMA(1,0,2) with non-zero mean : 660.1477
##  ARIMA(2,0,1) with non-zero mean : 659.5466
##  ARIMA(3,0,2) with non-zero mean : 657.666
##  ARIMA(2,0,3) with non-zero mean : 657.1008
##  ARIMA(1,0,1) with non-zero mean : 659.3288
##  ARIMA(1,0,3) with non-zero mean : 662.244
##  ARIMA(3,0,1) with non-zero mean : 661.611
##  ARIMA(3,0,3) with non-zero mean : 659.3892
##  ARIMA(2,0,2) with zero mean     : 655.786
## 
##  Now re-fitting the best model(s) without approximations...
## 
##  ARIMA(2,0,2) with non-zero mean : Inf
##  ARIMA(2,0,2) with zero mean     : Inf
##  ARIMA(2,0,3) with non-zero mean : Inf
##  ARIMA(0,0,0) with non-zero mean : 657.2161
## 
##  Best model: ARIMA(0,0,0) with non-zero mean

Model yang kita peroleh adalah ARIMA (1,1,2)

Melakukan Prediksi untuk 10 Tahun Kedepan

prediksi <- forecast(model_arima, h =10)

print(prediksi)
##     Point Forecast     Lo 80    Hi 80     Lo 95    Hi 95
## 237     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 238     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 239     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 240     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 241     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 242     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 243     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 244     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 245     0.09121372 -1.148747 1.331174 -1.805142 1.987569
## 246     0.09121372 -1.148747 1.331174 -1.805142 1.987569
plot(prediksi)