Pendahuluan

Latar Belakang

Tujuan

Tujuan dari penelitian ini adalah menggunakan metode time series forecasting untuk kasus data Bitcoin di USA.

knitr::include_graphics("assets/bitcoin.jpeg")

Tahapan Proses Data Analytics

Eksplorasi Data (EDA) & Pre-Processing

Pengenalan Dataset

data <- read.csv("data_input/BTC_USD.csv")
glimpse(data)
#> Rows: 2,787
#> Columns: 6
#> $ Currency            <chr> "BTC", "BTC", "BTC", "BTC", "BTC", "BTC", "BTC", "…
#> $ Date                <chr> "2013-10-01", "2013-10-02", "2013-10-03", "2013-10…
#> $ Closing.Price..USD. <dbl> 123.6550, 125.4550, 108.5848, 118.6747, 121.3387, …
#> $ X24h.Open..USD.     <dbl> 124.3047, 123.6550, 125.4550, 108.5848, 118.6747, …
#> $ X24h.High..USD.     <dbl> 124.7517, 125.7585, 125.6657, 118.6750, 121.9363, …
#> $ X24h.Low..USD.      <dbl> 122.56349, 123.63383, 83.32833, 107.05816, 118.005…
# levels(data$Currency)
  • Metadata dari dataset tersebut adalah sebagai berikut :

  • Currency : Merepresentasikan mata uang yang digunakan dalam data (“BTC” untuk Bitoin)

  • Date : tanggal data dalam format “YYYY-MM-DD”.

  • Closing.Price..USD. : Harga penutupan Bitcoin dalam USD.

  • X24h.Open..USD. : Harga pembukaan Bitccoin daalm USD pada periode 24 jam sebelumnya

  • X24h.High..USD. : Harga tertinggi, periode sehari sbeelumnya.

  • X24h.Low..USD. : Harga terendah, periode sehari sebelumnya.

Analisis Statistik deskriptif Awal

# Ubah tipe data
data$Date <- as.Date(data$Date) 
summary(data)
#>    Currency              Date            Closing.Price..USD. X24h.Open..USD.  
#>  Length:2787        Min.   :2013-10-01   Min.   :  108.6     Min.   :  108.6  
#>  Class :character   1st Qu.:2015-08-28   1st Qu.:  460.1     1st Qu.:  459.4  
#>  Mode  :character   Median :2017-07-25   Median : 2780.2     Median : 2772.4  
#>                     Mean   :2017-07-25   Mean   : 6529.9     Mean   : 6513.6  
#>                     3rd Qu.:2019-06-21   3rd Qu.: 8506.9     3rd Qu.: 8496.9  
#>                     Max.   :2021-05-18   Max.   :63346.8     Max.   :63562.7  
#>  X24h.High..USD.   X24h.Low..USD.    
#>  Min.   :  118.7   Min.   :   83.33  
#>  1st Qu.:  469.7   1st Qu.:  450.82  
#>  Median : 2874.7   Median : 2696.46  
#>  Mean   : 6710.1   Mean   : 6302.42  
#>  3rd Qu.: 8763.3   3rd Qu.: 8221.06  
#>  Max.   :64801.8   Max.   :62094.63

💡 Insight :

  • Dataset ini mencakup rentang waktu mulai dari1 Oktober 2013 hingga 18 Mei 2021.
  • Closing.Price..USD.: Nilai minimum dari harga penutupan Bitcoin dalam USD adalah 108.6, sedangkan nilai maksimum adalah 63.346.8. Nilai rata-rata adalah 6.529.9.
  • X24h.Open..USD.: Nilai minimum dari harga pembukaan Bitcoin dalam USD pada periode 24 jam sebelumnya adalah 108.6, sedangkan nilai maksimum adalah 63.562.7. Nilai rata-rata (Mean) adalah 6.513.6.
  • X24h.High..USD. : Nilai minimum dari harga tertinggi Bitcoin dalam USD pada periode 24 jam sebelumnya adalah 118.7, sedangkan nilai maksimum adalah 64.801.8. Dengan rata-rata adalah 6.710.1.
  • X24h.Low..USD. : Nilai minimum dari harga terendah Bitcoin dalam USD pada periode 24 jam sebelumnya adalah 83.33, sedangkan nilai maksimum adalah 62.094.63. Nilai rata-rata adalah 6.302.42.

Visual Time Series Awal

Sebelum masuk tahapan selanjutnya, cek apakah ada missing value atau tidak

colSums(is.na(data))
#>            Currency                Date Closing.Price..USD.     X24h.Open..USD. 
#>                   0                   0                   0                   0 
#>     X24h.High..USD.      X24h.Low..USD. 
#>                   0                   0

💡 Tidak ada Missing Value.

btc_data <- arrange(data, Date)
head(btc_data)
# Pembuatan Data Time Series
btc_ts <- ts(btc_data$Closing.Price..USD., frequency = 1)

plot(btc_ts, main = "Time Series Plot : Harga Penutupan dari BTC")

Dalam contoh ini, kita menggunakan frekuensi 1 karena data yang kita punya termaasuk tipe data harian. Berdasarkan plot diatas data memiliki trend dan teramsuk multiplikatif, pola musiman dalam data sulit diidentifikasi, sehingga analisa lanjutan yang tepat ialah menggunakan model ARIMA. Namun, ada beberapa yang perlu diperhatikan :

  • Meskipun pola musiman tidak terlihat dalam plot, tetap ada kemungkinan bahwa ada fluktuasi musiman yang lebih subtil dalam data yang tidak terlihat secara kasat mata.
  • Perlu dilakukan lebih banyak analisis dan eksplorasi data untuk memastikan apakah benar-benar tidak ada pola musiman yang signifikan dalam data.

💡 Untuk kasus ini, kita abaikan pola musiman yang tidak signifikan, karena tujuan kali ini ialah hanya untuk forecasting.

Forecasting

💡 Pendekatan yang tepat dalam kasus ini adalah menggunakan model ARIMA untuk melakukan analisis dan prediksi. Model ARIMA dapat membantu mengidentifikasi pola, tren, dan fluktuasi dalam data time series. Dengan mempertimbangkan ketidakadaan pola musiman yang jelas dalam data harian

# Menghitung mean dan varians
mean_ts <- mean(btc_ts)
var_ts <- var(btc_ts)
cat("Mean:", mean_ts, "\n")
#> Mean: 6529.845
cat("Variance:", var_ts, "\n")
#> Variance: 118545222
  • Syarat agar data dapat diolah menggunakan ARIMA ialah dat harus bersifat stasioner, maka perlu di lakukan tes menggunakan ADF Test.
# Menggunakan library "tseries"
library(tseries)

# Melakukan ADF test
adf_test <- adf.test(btc_ts)
cat("ADF Test Results:\n")
#> ADF Test Results:
print(adf_test)
#> 
#>  Augmented Dickey-Fuller Test
#> 
#> data:  btc_ts
#> Dickey-Fuller = -0.20282, Lag order = 14, p-value = 0.99
#> alternative hypothesis: stationary

💡 Hasil uji ADF menunjukkan bahwa nilai p adalah 0,99, yang lebih besar dari tingkat signifikansi 0,05. Oleh karena itu, kita gagal menolak hipotesis nol bahwa data tidak stasioner. Ini menunjukkan bahwa kemungkinan data tersebut tidak stasioner.

Differencing

  • Untuk membuat data menjadi stasioner, kita dapat menggunakan differencing.
# differencing 1 kali
btc_ts %>% 
  diff() %>% 
  adf.test()
#> 
#>  Augmented Dickey-Fuller Test
#> 
#> data:  .
#> Dickey-Fuller = -14.728, Lag order = 14, p-value = 0.01
#> alternative hypothesis: stationary

💡 Berdasarkan hasil uji ADF, nilai p-value sebesar 0.01 yang artinya data termasuk stasioner.

Tunning Model

# melihat plot acf dan pacf menggunakan `tsdisplay()`
btc_ts %>% 
  diff() %>% 
  tsdisplay()  #untuk garfik ACF dan PACF

ARIMA (p, 1, q)

  • nilai p yang diperoleh dari 5 lag pertama yang keluar dari plot pacf
    • p -> 2, 3, 0
  • nilai q yang diperoleh dari 5 lag pertama yang kelaur dari plot acf
    • q -> 2, 3, 0

Kombinasi yang terbentuk : + ARIMA[2,1,2] + ARIMA[3,1,3] + ARIMA[0,1,0]

# buat model
no_arima1 <- Arima(y = btc_ts, order = c(2,1,2)) 
no_arima2 <- Arima(y = btc_ts, order = c(3,1,3)) 
no_arima3 <- Arima(y = btc_ts, order = c(0,1,0)) 

Model Auto ARIMA

btc_auto <- auto.arima(btc_ts)
btc_auto
#> Series: btc_ts 
#> ARIMA(2,1,2) 
#> 
#> Coefficients:
#>          ar1      ar2      ma1     ma2
#>       1.2821  -0.8522  -1.3010  0.9247
#> s.e.  0.0266   0.0277   0.0198  0.0202
#> 
#> sigma^2 = 277892:  log likelihood = -21412.56
#> AIC=42835.13   AICc=42835.15   BIC=42864.79

Goodness of Fit (Pemilihan model terbaik)

Untuk pemilihan model terbaik, kita bisa gunakan nilai AIC. 💡 Ingat: Nilai AIC yaitu information loss -> sehingga nilai yang terkecil yang diinginkan.

no_arima1$aic
#> [1] 42835.13
no_arima2$aic
#> [1] 42858.47
no_arima3$aic
#> [1] 42897.57
btc_auto$aic
#> [1] 42835.13

Insight: dari goodness of fit yang dihasilkan, model yang terbaik adalah dengan p,d,q -> 2,1,2

Evaluasi Model

Setelah melakukan fitting model ARIMA, langkah selanjutnya adalah melakukan evaluasi kualitas model. Pada bagian ini, kita akan menggunakan fungsi accuracy() dari package forecast untuk melihat MAPE

accuracy(no_arima1$fitted, btc_ts)
#>                ME     RMSE      MAE       MPE     MAPE        ACF1 Theil's U
#> Test set 13.99946 526.6811 199.9135 0.1061939 2.824984 -0.01629329  1.010184
library(MLmetrics)
MAPE(y_pred = no_arima1$fitted, 
     y_true = btc_ts)*100
#> [1] 2.824984

💡 Hasil MAPE sebesar 2.824984 menunjukkan bahwa rata-rata persentase kesalahan dalam prediksi harga Bitcoin adalah sekitar2.82%. Semakin rendah nilai MAPE, semakin baik kualitas prediksi.

Visualisasi Forecasting

Langkah selanjutnya adalah melakukan visualisasi dengan memperbarui jendela waktu menggunakan data bulan terakhir. Model ARIMA dibangun menggunakan data bulan terakhir untuk membuat prediksi.

Forecasting dengan Data Tahun Terakhir

  • Pertama, kita akan memperbarui jendela waktu dengan menggunakan data Tahun terakhir. Hal ini dilakukan untuk membangun model ARIMA dengan menggunakan data terbaru dan melakukan prediksi untuk periode ke depan.
# Memperbarui window dengan data tahun terakhir
btc_ts_last_month <- tail(btc_ts, 365)

# Membuat model ARIMA dengan data bulan terakhir
model_last_month <- Arima(btc_ts_last_month, order = c(2, 1, 2))

# Plot time series dan fitted values
autoplot(btc_ts_last_month) +
  autolayer(fitted(model_last_month), lwd = 0.7) +
  labs(x = "Tanggal", y = "Harga Bitcoin", title = "Time Series Plot dengan Fitted Values") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, max(btc_ts_last_month, na.rm = TRUE) * 1.1))

Selanjutnya, data dibagi menjadi data training (sebagian besar data asli) dan data testing (30 data terakhir) untuk evaluasi model. Data training diuji menggunakan uji ADF untuk memastikan bahwa data stasioner.

data_train <- head(btc_ts, n = length(btc_ts) - 30)  # Data train tidak termasuk data test terakhir
data_test <- tail(btc_ts, n = 30)  # Data test terakhir
data_train %>% adf.test()
#> 
#>  Augmented Dickey-Fuller Test
#> 
#> data:  .
#> Dickey-Fuller = 3.9734, Lag order = 14, p-value = 0.99
#> alternative hypothesis: stationary
data_train %>% 
  diff(lag = 1, differences = 1) %>% 
  adf.test()
#> 
#>  Augmented Dickey-Fuller Test
#> 
#> data:  .
#> Dickey-Fuller = -15.323, Lag order = 14, p-value = 0.01
#> alternative hypothesis: stationary
train_auto_arima <- auto.arima(data_train)
train_auto_arima
#> Series: data_train 
#> ARIMA(5,2,0) 
#> 
#> Coefficients:
#>           ar1      ar2      ar3      ar4      ar5
#>       -0.8733  -0.6799  -0.4756  -0.3388  -0.2123
#> s.e.   0.0187   0.0243   0.0261   0.0245   0.0189
#> 
#> sigma^2 = 261488:  log likelihood = -21090.36
#> AIC=42192.71   AICc=42192.74   BIC=42228.24

Forecasting untuk Periode ke Depan

Selanjutnya, kita akan melakukan forecasting harga Bitcoin untuk periode ke depan. Kita akan menggunakan model ARIMA yang telah dibangun sebelumnya untuk melakukan prediksi selama 30 hari ke depan.

forecast <- forecast(train_auto_arima, h =30)
# Visualisasi
autoplot(btc_ts) +
  autolayer(fitted(train_auto_arima), series = "Fitted Data") +
  autolayer(forecast, series = "Forecast") +
  autolayer(data_test, series = "Test Data") +
  labs(x = "Tanggal", y = "Harga Bitcoin", title = "Forecasting Harga Bitcoin") +
  theme_minimal() +
  scale_y_continuous(limits = c(0, max(btc_ts, na.rm = TRUE) * 1.1))

Grafik tersebut menampilkan prediksi harga Bitcoin selama 30 hari ke depan berdasarkan model ARIMA yang telah dibangun. Garis biru merupakan prediksi harga Bitcoin, sedangkan area abu-abu menggambarkan interval prediksi.

Dengan melakukan forecasting, kita dapat memperoleh informasi tentang kemungkinan pergerakan harga Bitcoin di masa mendatang. Namun, perlu diingat bahwa prediksi ini masih bersifat perkiraan dan dapat dipengaruhi oleh banyak faktor eksternal. Oleh karena itu, pengambilan keputusan investasi yang berdasarkan prediksi ini sebaiknya dilakukan dengan hati-hati dan mempertimbangkan risiko yang ada.

Penutup

Dalam penelitian ini, telah dilakukan analisis time series untuk kasus data harga Bitcoin di USA. Berdasarkan hasil analisis, ditemukan beberapa insight penting tentang pola dan tren harga Bitcoin. Model ARIMA telah dibangun dan dievaluasi untuk melakukan prediksi harga Bitcoin ke depan. Prediksi ini dapat memberikan gambaran tentang kemungkinan pergerakan harga Bitcoin di masa mendatang, namun tetap perlu diperhatikan bahwa prediksi ini masih memiliki tingkat ketidakpastian.

Dalam analisis lanjutan, dapat dilakukan pengembangan lebih lanjut seperti eksplorasi pola musiman yang lebih detail, pengujian model dengan metrik lain, atau penggunaan model time series lainnya. Selain itu, pemikiran tentang penggunaan model time series dalam bidang keuangan atau cryptocurrency juga dapat menjadi pertimbangan untuk penelitian selanjutnya.