Tujuan dari penelitian ini adalah menggunakan metode time series forecasting untuk kasus data Bitcoin di USA.
::include_graphics("assets/bitcoin.jpeg") knitr
<- read.csv("data_input/BTC_USD.csv")
data 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.
# Ubah tipe data
$Date <- as.Date(data$Date)
datasummary(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 :
1 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.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
.
<- arrange(data, Date)
btc_data head(btc_data)
# Pembuatan Data Time Series
<- ts(btc_data$Closing.Price..USD., frequency = 1)
btc_ts
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
:
💡 Untuk kasus ini, kita abaikan pola musiman yang tidak signifikan,
karena tujuan kali ini ialah hanya untuk 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(btc_ts)
mean_ts <- var(btc_ts)
var_ts cat("Mean:", mean_ts, "\n")
#> Mean: 6529.845
cat("Variance:", var_ts, "\n")
#> Variance: 118545222
ADF Test.
# Menggunakan library "tseries"
library(tseries)
# Melakukan ADF test
<- adf.test(btc_ts)
adf_test 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
.# 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.
# melihat plot acf dan pacf menggunakan `tsdisplay()`
%>%
btc_ts diff() %>%
tsdisplay() #untuk garfik ACF dan PACF
ARIMA (p, 1, q)
Kombinasi yang terbentuk : + ARIMA[2,1,2] + ARIMA[3,1,3] + ARIMA[0,1,0]
# buat model
<- Arima(y = btc_ts, order = c(2,1,2))
no_arima1 <- Arima(y = btc_ts, order = c(3,1,3))
no_arima2 <- Arima(y = btc_ts, order = c(0,1,0)) no_arima3
<- auto.arima(btc_ts)
btc_auto 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
Untuk pemilihan model terbaik, kita bisa gunakan nilai AIC. 💡 Ingat: Nilai AIC yaitu information loss -> sehingga nilai yang terkecil yang diinginkan.
$aic no_arima1
#> [1] 42835.13
$aic no_arima2
#> [1] 42858.47
$aic no_arima3
#> [1] 42897.57
$aic btc_auto
#> [1] 42835.13
Insight: dari goodness of fit yang dihasilkan, model yang terbaik adalah dengan p,d,q -> 2,1,2
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.
Langkah selanjutnya adalah melakukan visualisasi dengan memperbarui jendela waktu menggunakan data bulan terakhir. Model ARIMA dibangun menggunakan data bulan terakhir untuk membuat prediksi.
# Memperbarui window dengan data tahun terakhir
<- tail(btc_ts, 365)
btc_ts_last_month
# Membuat model ARIMA dengan data bulan terakhir
<- Arima(btc_ts_last_month, order = c(2, 1, 2))
model_last_month
# 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.
<- head(btc_ts, n = length(btc_ts) - 30) # Data train tidak termasuk data test terakhir
data_train <- tail(btc_ts, n = 30) # Data test terakhir data_test
%>% adf.test() data_train
#>
#> 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
<- auto.arima(data_train)
train_auto_arima 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
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(train_auto_arima, h =30) forecast
# 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.
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.