Penerapan Analisis Time Series pada Harga Price Cryptocurrency Periode 1 November 2021 - 31 Agustus 2022

Kelompok 5 Paralel 1

2022-12-21

Kelompok 5

Nama Anggota :

  1. Faadiyah Ramadhani (G1401201009)

  2. Muhammad Farhan Zahid (G1401201010)

  3. Nabila Cahyati (G1401201011)

  4. Pandu Henanda Saputra (G1401201043)

  5. Muhammad Zhillan Zakiyyan (G1401201092)

Latar Belakang

Teknologi dan informasi pada era digital saat ini berkembang pesat dan tidak dapat dihindari. Seiring berkembangnya teknologi dan informasi, bidang ekonomi juga mengalami peningkatan, salah satunya investasi. Investasi merupakan kegiatan seorang investor menaruh hartanya berupa uang atau bentuk lain yang bernilai kepada suatu pihak atau lembaga tertentu dengan harapan menghasilkan keuntungan setelah jangka waktu tertentu (Disemadi dan Delvin, 2021). Pada era digital ini, investasi tidak hanya dilakukan dengan yang berbentuk fisik, seperti emas, rumah, dan obligasi. Saat ini investasi dapat dilakukan dalam bentuk virtual, salah satunya dengan cryptocurrency.Cryptocurrency atau mata uang virtual merupakan suatu bentuk investasi baru yang tidak berwujud dan tidak diterbitkan oleh suatu negara atau bank sentral negara tertentu (Setiawan, 2020). Cryptocurrency dapat digunakan sebagai alat pembayaran elektronik serta dapat digunakan untuk melakukan investasi maupun trading (Marliyah, 2021). Salah satu bentuk cryptocurrency adalah Dogecoin. Menurut Tjahyana (2021), Dogecoin merupakan cryptocurrency yang diciptakan oleh Billy Markus, Oregon, dan Jackson Palmer pada tahun 2013. Pada awalnya, Dogecoin dianggap sebagai gurauan yang dikenal dengan “joke currency”. Walaupun dianggap hanya sebagai gurauan, Dogecoin mencapai popularitas pada awal tahun 2021 (Tjahyana, 2021). Pada bulan Mei 2020, harga Dogecoin hanya sekitar 30 rupiah per koin dan mengalami peningkatan menjadi sekitar 9000 rupiah per koin pada Mei 2021. Hal ini menunjukkan bahwa Dogecoin mengalami peningkatan hingga 30000% hanya dalam waktu satu tahun. Cryptocurrency memiliki pergerakan yang tidak tetap atau fluktuatif. Hal ini disebabkan oleh harga suatu koin kripto yang bergantung pada supply (persediaan) dan demand (permintaan). Jika permintaan mata uang kripto tinggi dan jumlah persediaannya terbatas, harga dari kripto akan semakin tinggi (Disemadi dan Delvin, 2021). Sebaliknya, jika persediaan banyak tetapi permintaan sedikit, harga mata uang kripto akan cenderung rendah. Hal ini dapat menyebabkan terjadinya penurunan harga di saat bersamaan yang dikenal dengan sebutan “crypto market crash” seperti yang terjadi selama satu tahun terakhir ini. Kenaikan harga cryptocoin yang erat dengan konsep supply-demand membuat harga crypto erat dengan sentimen masyarakat. Beberapa crypto yang terkenal di masyarakat cenderung mempunyai influencer yang dapat membuat harganya melambung tinggi, seperti Bitcoin, Ethereum, dan Dogecoin yang ketiganya memiliki nama Elon Musk di belakangnya. Hyunh (2021) menyatakan bahwa melalui sentimen analysis, diketahui bahwa sikap maupun pernyataan Elon Musk dapat membuat Bitcoin kembali pada fase trading singkat. Fase trading singkat ini dapat menaikkan harga dan membuat volatilitas selama beberapa periode kemudian. Sentimen ini yang membuat Dogecoin kembali naik pada pertengahan Maret hingga Mei 2022. Mekanisme kenaikan dan penurunan harga yang sangat drastis, ketiadaan kebijakan moneter untuk standarisasi pengamanan harga, dan penamaan yang sengaja dibuat sama dengan salah satu meme membuat Dogecoin menarik diteliti. Penelitian ini dibuat untuk menentukan metode pemulusan atau pemodelan yang paling optimal untuk meramal pergerakan harga mata uang kripto Dogecoin ke depannya.

Data Preparation

Packages & Library

Pada praktikum kali ini, memerlukan packages sebagai berikut.

  1. forecast
  2. TTR
  3. graphics
  4. TSA
  5. aTSA
  6. tseries
  7. lmtest
  8. dplyr
  9. FinTS
  10. bsts
  11. readr
  12. ggplot2

Data

Deklarasi & Deskripsi Data

Data yang digunakan merupakan data Dogecoin harian yang bersumber dari investing.com selama sepuluh bulan terakhir dimulai pada periode 1 November 2021 sampai 31 Agustus 2022 dengan jumlah observasi 304. Data yang digunakan hanya data harga penutupan mata uang kripto (closing price) Dogecoin. Harga penutupan yang dimaksud adalah harga mata uang kripto yang diperdagangkan pada akhir hari perdagangan, sehingga dianggap valuasi yang paling akurat dari suatu jenis mata uang kripto dan sangat berguna bagi para trader untuk mengakses perubahan yang terjadi pada harga jenis mata uang kripto. Data dapat diakses pada link berikut (https://www.investing.com/crypto/dogecoin/historical-data).

doge.main <- read.csv("D:/IPB University/Semester 5/STA1341 MPDW/Pertemuan 8/Dogecoin Historical Data - Investing.com (4).csv")
head(doge.main)
##           Date    Price     Open     High      Low    Vol. Change..
## 1 Aug 31, 2022 0.061323 0.061505 0.063418 0.060768 943.83M   -0.29%
## 2 Aug 30, 2022 0.061503 0.063815 0.064372 0.060242 969.52M   -3.61%
## 3 Aug 29, 2022 0.063809 0.061646 0.064013 0.060917 982.15M    3.50%
## 4 Aug 28, 2022 0.061650 0.063382 0.064149 0.061336 916.32M   -2.69%
## 5 Aug 27, 2022 0.063352 0.063316 0.063973 0.062231   1.21B    0.03%
## 6 Aug 26, 2022 0.063331 0.068790 0.069127 0.062709   1.95B   -7.86%

Pembuatan Peubah Tanggal

Untuk mengubah peubah X pada data time series yang sebelumnya berupa angka menjadi tanggal dilakukan sebagai berikut.

doge.ts.full <- ts(doge.main[304:1,]$Price)
doge.ts.full.2 <- ts(doge.ts.full, start=c(2021, 11, 1), end=c(2022, 8, 31), frequency=306)
doge.date <- seq(as.Date("2021-11-01"), by="day", along=doge.ts.full.2)
doge.df <- data.frame("Date"=doge.date, "Price"=doge.main$Price[304:1]); head(doge.df)
##         Date    Price
## 1 2021-11-01 0.271736
## 2 2021-11-02 0.273301
## 3 2021-11-03 0.268912
## 4 2021-11-04 0.263591
## 5 2021-11-05 0.260855
## 6 2021-11-06 0.261630

Pembagian Data Training dan Data Testing

Data training merupakan data yang digunakan untuk membangun sebuah model, sedangkan data testing merupakan data yang digunakan untuk mengetahui akurasi dari model tersebut (Nasution et al. 2019). Sebelum melakukan pemodelan ARIMA diperlukan untuk membagi data aktual menjadi data training dan data testing. Proporsi data training dan data testing yang digunakan adalah 90:10, di mana data trainingnya sebanyak 9 bulan (1 November 2021 - 31 Juli 2022). Sedangkan, data testing sebanyak 1 bulan (1 Agustus 2022 - 31 Agustus 2022).

doge.train <- doge.df[1:273,]
doge.test <- doge.df[274:304,]
doge.ts <- ts(doge.train$Price)
doge.ts.train.2 <- ts(doge.ts, start=c(2021, 11, 1), end=c(2022, 7, 31), frequency=276)
doge.ts.test.2 <- ts(ts(doge.test$Price), start=c(8, 1), end=c(8, 31), frequency=31)
doge.train.ts <- ts(doge.train$Price)
doge.test.ts <- ts(doge.test$Price)

Eksplorasi Data

summary(doge.ts.full)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
## 0.05287 0.07283 0.13226 0.12852 0.15900 0.28224
sd(doge.ts.full)
## [1] 0.05509237

Plot Time Series

doge.df$Data <- ifelse(doge.df$Date > doge.df$Date[273],"Data Testing", "Data Training")
Dateframe <- doge.df %>% group_by(Data) %>% summarize(minDate = min(Date), maxDate = max(Date))

#Plot Seluruh Data
ggplot(doge.df, aes(x=Date, y=Price)) +
  geom_line(lwd=1, col="black") +
  geom_vline(xintercept=doge.df$Date[273], col="red", lwd=1, lty=3) +
  labs(x="Date`", y="Doge Price", title = "Dogecoin Price", subtitle="Periode 1 November 2021 - 31 Agustus 2022") +
  scale_x_date(date_breaks="1 month", date_minor_breaks= "1 day", date_labels="%b") +
  scale_y_continuous(breaks=c(seq(0, 0.3, by=0.05)), labels = scales::dollar, limits=c(0, 0.3)) +
  theme(panel.grid.major.x=element_blank())

Pemulusan

Data yang kami gunakan akan dilakukan pemulusan dengan menggunakan metode Double Exponential Smoothing (DES) dan Double Moving Average (DMA).

Double Exponential Smoothing (DES)

Metode DES digunakan untuk mencari nilai aplha dan beta yang optimal dilakukan dengan cara melakukan iterasi serta mencari nilai MSE yang paling kecil.

DES Optimal

ts_des = ts(doge.train$Price,frequency = 1, start= 1)
df.utamades = data.frame()
aw = 0.1
ak = 0.9
small.rmse.des = 99
for (x in seq(aw,ak,by=0.01) ){
  for (y in seq(0.1,0.9,by = 0.01)){
    df_des <- HoltWinters(ts_des, alpha = x, beta=y, gamma=F)
    sse <- df_des$SSE 
    mse <- sse/length(ts_des)
    rmse <-sqrt(mse)
    akurasi <- c("Alpha"=x,"Beta"=y,"SSE"=sse, "MSE"=mse, "RMSE"=rmse)
    df.utamades <- rbind(df.utamades,akurasi)
    if (small.rmse.des > rmse){
      small.rmse.des = rmse
      AlphaOpt = x
      BetaOpt = y
    }
  }
}
NilaioptDES <- cbind(AlphaOpt,BetaOpt)
NilaioptDES
##      AlphaOpt BetaOpt
## [1,]     0.82     0.1
colnames(df.utamades) <-  c("Alpha","Beta","SSE","MSE","RMSE")
df.pilih <- arrange(.data=df.utamades, RMSE)
df.pilih <- df.pilih[1:5,c(1:2,5)]
df.pilih
##   Alpha Beta        RMSE
## 1  0.82  0.1 0.006948231
## 2  0.81  0.1 0.006948424
## 3  0.83  0.1 0.006948898
## 4  0.80  0.1 0.006949478
## 5  0.84  0.1 0.006950420

Berdasarkan iterasi di atas, didapatkan bahwa nilai alpha yang optimal adalah 0.82 dan beta yang optimal adalah 0.1.

ts_des.tr <- ts(doge.train,frequency = 1, start= 1)
df_des <- HoltWinters(ts_des, alpha = 0.82, beta=0.1, gamma=F) 
sse.des <- df_des$SSE 
mse.des <- sse/length(ts_des)
rmse.des <-sqrt(mse)
des_fitted.tr <- data.frame(ts_des.tr,c(NA,NA,df_des$fitted[,1]))
colnames(des_fitted.tr) = c("y","yhat")
ramal_des <- forecast::forecast(df_des,h=31)
df_ramal_des.tr <- data.frame(ramal_des)
ts.plot(doge.ts.full, col="black", xlim=c(244,305), ylim=c(0.05, 0.1), lwd=4, ylab="Doge Price")
lines(des_fitted.tr[,2], col="red", lwd=2)
lines(ts(df_ramal_des.tr$Point.Forecast, start=274), col="yellow", lwd=2)
legend("topleft", c("Aktual", "Smooth DES", "Forecast DES"), lty=c(1,1,1), lwd=c(4,2,2), col=c("black", "red", "yellow"), cex=0.85, text.col="black")

ts.plot(doge.ts.full, col="black", ylim=c(0, 0.3), lwd=4, ylab="Doge Price")
lines(ts(df_ramal_des.tr$Point.Forecast, start=274), col="red", lwd=2)
legend("topright", c("Aktual", "Forecast DES"), lty=c(1,1), lwd=c(4,2), col=c("black", "red"), cex=0.85, text.col="black")

Double Moving Average (DMA)

DMA Optimal

#Iterasi ukuran Kekuatan DMA
df.utama = data.frame()
awd = 2
akd = 20
small.mape.dma = 99
for (x in awd:akd){
  # Ukuran Keakuratan
    df_ts_sma <- TTR::SMA(doge.train.ts,  n=x)
    ramal_sma <- c(NA,df_ts_sma)
    df_sma <- cbind(df_aktual=c(doge.train.ts,NA), pemulusan=c(df_ts_sma,NA), ramal_sma)
    df_ts_dma <- TTR::SMA(doge.train.ts, n=x)
    At <- 2*df_ts_sma-df_ts_dma
    Bt <- df_ts_sma-df_ts_dma
    pemulusan_dma <- At+Bt
    ramal_dma <- c(NA, pemulusan_dma)
    df_dma <- cbind(df_aktual=c(doge.train.ts,NA), pemulusan_dma=c(pemulusan_dma,NA), ramal_dma)
    # Ukuran Keakuratan
    error.dma <- df_dma[, 1] - df_dma[, 3]
    
    ## SSE (Sum Square Error)
    SSE.dma <- sum(error.dma^2, na.rm = T)
    
    ## MSE (Mean Squared Error)
    MSE.dma <- mean(error.dma^2, na.rm = T)
    
    ## RMSE (Root Mean Square Error)
    RMSE.dma <- sqrt(mean(error.dma^2, na.rm = T))
    
    ## MAD (Mean Absolute Deviation)
    MAD.dma <- mean(abs(error.dma), na.rm = T)
    
    ## MAPE (Mean Absolute Percentage Error)
    r.error.dma <- (error.dma/df_dma[, 1])*100 # Relative Error
    MAPE.dma <- mean(abs(r.error.dma), na.rm = T)
    if (MAPE.dma < small.mape.dma) {
      small.mape.dma = MAPE.dma
      noptimumDMA = x
    }
  databarudma = data.frame(i=x, SSE = SSE.dma, MSE = MSE.dma, RMSE = RMSE.dma, MAD = MAD.dma,MAPE = MAPE.dma)
  df.utama <- rbind(df.utama,databarudma)
  
} 
df.utama
##     i        SSE          MSE        RMSE         MAD      MAPE
## 1   2 0.01404946 5.184302e-05 0.007200210 0.005014897  3.866823
## 2   3 0.01697293 6.286271e-05 0.007928601 0.005515401  4.280503
## 3   4 0.02009156 7.468981e-05 0.008642326 0.006113128  4.752715
## 4   5 0.02301129 8.586304e-05 0.009266231 0.006571142  5.151794
## 5   6 0.02564759 9.605837e-05 0.009800937 0.007012459  5.552024
## 6   7 0.02852832 1.072493e-04 0.010356124 0.007462579  5.930796
## 7   8 0.03108834 1.173145e-04 0.010831182 0.007852640  6.278824
## 8   9 0.03377471 1.279345e-04 0.011310814 0.008258688  6.615460
## 9  10 0.03656970 1.390483e-04 0.011791873 0.008643621  6.953158
## 10 11 0.03946083 1.506139e-04 0.012272484 0.009040284  7.291999
## 11 12 0.04242456 1.625462e-04 0.012749362 0.009433292  7.625891
## 12 13 0.04572942 1.758824e-04 0.013262065 0.009864356  7.988442
## 13 14 0.04934063 1.905044e-04 0.013802332 0.010303284  8.357134
## 14 15 0.05281131 2.046950e-04 0.014307166 0.010727652  8.719152
## 15 16 0.05566871 2.166098e-04 0.014717669 0.011092821  9.068633
## 16 17 0.05860174 2.289130e-04 0.015129873 0.011457065  9.414750
## 17 18 0.06054631 2.374365e-04 0.015408975 0.011733744  9.706926
## 18 19 0.06339560 2.495890e-04 0.015798385 0.012028684  9.999515
## 19 20 0.06625863 2.618918e-04 0.016183072 0.012295319 10.263102
noptimumDMA
## [1] 2

DMA n=2

df_ts_sma <- TTR::SMA(doge.train.ts,  n=2)
df_ts_dma <- TTR::SMA(df_ts_sma, n=2)
At <- 2*df_ts_sma-df_ts_dma
Bt <- df_ts_sma-df_ts_dma
pemulusan_dma <- At+Bt ## grafik pemulusan
ramal_dma <- c(NA, pemulusan_dma)
as.data.frame(pemulusan_dma)
df_dma <- cbind(df_aktual=c(doge.train,NA), pemulusan_dma=c(pemulusan_dma,NA), ramal_dma)
## Warning in cbind(df_aktual = c(doge.train, NA), pemulusan_dma =
## c(pemulusan_dma, : number of rows of result is not a multiple of vector length
## (arg 1)
ts.plot(doge.train.ts,xlab="Time",ylab="Doge Price",lty=1,col="black",main=paste("Double Moving Average n = ",2))
lines(pemulusan_dma,col="blue",lty=2)
lines(ramal_dma,col="red",lty=1)
legend("topright",legend=c ("Real","Smooth DMA","Forecast DMA"), lty=1, col=c("black","blue","red"))

Perbandingan Ukuran Keakuratan

Perbandingan <-matrix(c(df.utama[1,3],df.utama[1,4],mse.des,rmse.des),nrow=2,ncol=2)
row.names(Perbandingan)<- c("MSE","RMSE")
colnames(Perbandingan) <- c("DMA","DES")
Perbandingan
##               DMA          DES
## MSE  5.184302e-05 0.0000807335
## RMSE 7.200210e-03 0.0089851820

Berdasarkan perbandingan ukuran keakuratan RMSE, didapatkan bahwa model pemulusan dan peramalan terbaik adalah dengan metode Double Moving Average (DMA) karena memiliki nilai RMSE yang lebih kecil dibandingkan dengan Double Exponential Smoothing (DES).

Pemodelan ARIMA

#_Data Preparation_
doge.full <- read.csv("D:/IPB University/Semester 5/STA1341 MPDW/Pertemuan 8/Dogecoin Historical Data - Investing.com (4).csv")
doge.ts <- ts(doge.full$Price)
doge.train <- ts(doge.full[304:32,]$Price)
doge.test <- ts(doge.full[31:1,]$Price)

Cek Kestasioneran Data

acf(doge.ts,lag.max = 20)

acf(doge.train.ts,lag.max = 20)

pacf(doge.ts,lag.max = 20)

Berdasarkan plot ACF di atas menunjukkan bahwa adanya tails off yang mengindikasikan bahwa data tidak stasioner.

#menggunakan ADF Test
adf.test(doge.ts) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  doge.ts
## Dickey-Fuller = -1.4329, Lag order = 6, p-value = 0.8154
## alternative hypothesis: stationary
adf.test(doge.test) 
## 
##  Augmented Dickey-Fuller Test
## 
## data:  doge.test
## Dickey-Fuller = -1.5058, Lag order = 3, p-value = 0.763
## alternative hypothesis: stationary

Berdasarkan uji ADF Test di atas, nilai p-value > 0.05, maka tak tolak H0. Artinya, cukup bukti untuk menyatakan bahwa data tidak stasioner pada taraf nyata 5%.

Differencing

Berdasarkan ADF Test sebelumnya, diketahui bahwa data masih tidak stationer, maka perlu dilakukan differencing data time series dimulai pada ordo d ke-1.

#differencing=1
doge.tsd1<-diff(doge.train.ts, differences = 1)
#cek kestasioneran
plot.ts(doge.tsd1,lty=1,ylab=expression(Ydif[t]))

acf(doge.tsd1,lag.max = 20)

Berdasarkan tampilan plot time series, terlihat bahwa pola data sudah stationer setelah dilakukan differencing dengan ordo d ke-1. Kemudian, pada plot ACF di atas, menunjukkan sudah tidak adanya tails off yang mengindikasikan bahwa data sudah stasioner.

Penentuan Ordo Model

acf(doge.tsd1,lag.max = 20)

pacf(doge.tsd1,lag.max = 20) 

eacf(doge.tsd1)
## 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  o  x 
## 1 x o o o o o o o o o o  o  o  x 
## 2 x o o o o o o o o o o  o  o  x 
## 3 x x o o o o o o o o o  o  o  x 
## 4 x x o x o o o o o o o  o  o  x 
## 5 x o x o o o o o o o o  o  o  x 
## 6 x o x x o o o o o o o  o  o  x 
## 7 x x x x o o o o o o o  o  o  x
Diperoleh kandidat model ARIMA sebagai berikut :

1. ARIMA(1,1,0)

2. ARIMA(0,1,1)

3. ARIMA(1,1,1)

Pemilihan Model Terbaik

Spesifikasi model yang dapat digunakan adalah ARIMA(1,1,0), ARIMA(0,1,1), ARIMA(1,1,1). Kemudian, akan dipilih model terbaik berdasarkan nilai AIC yang paling kecil.

doge.arima1 <- Arima(doge.train.ts,order = c(0,1,1),method ="ML")
doge.arima2 <- Arima(doge.train.ts,order = c(1,1,1),method ="ML")
doge.arima4 <- Arima(doge.train.ts,order = c(1,1,0),method ="ML")
#Fungsi Auto ARIMA
auto.arima(doge.train.ts)
## Series: doge.train.ts 
## ARIMA(0,1,1) with drift 
## 
## Coefficients:
##           ma1   drift
##       -0.1616  -7e-04
## s.e.   0.0578   3e-04
## 
## sigma^2 = 4.584e-05:  log likelihood = 973.73
## AIC=-1941.46   AICc=-1941.37   BIC=-1930.64

Signifikansi Dari Tiap Model

#ARIMA(0,1,1)
coeftest(doge.arima1)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)  
## ma1 -0.143753   0.056763 -2.5325  0.01132 *
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Semua parameter signifikan.

#ARIMA(1,1,1)
coeftest(doge.arima2)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)
## ar1 -0.36446    0.30377 -1.1998   0.2302
## ma1  0.21011    0.31728  0.6622   0.5078

Tidak ada parameter yang signifikan.

#ARIMA(1,1,0)
coeftest(doge.arima4)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)   
## ar1 -0.158784   0.059764 -2.6568 0.007888 **
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Semua parameter signifikan.

Perbandingan AIC

aic_model <- data.frame(
          "Nama Model" = c("Model 1 ARIMA(0,1,1)", "Model 2 ARIMA(1,1,1)", "Model 3 ARIMA(1,1,0)"), 
          "AIC" = c(doge.arima1$aic,doge.arima2$aic,doge.arima4$aic))
dplyr::arrange(.data=aic_model, AIC)
##             Nama.Model       AIC
## 1 Model 3 ARIMA(1,1,0) -1939.526
## 2 Model 1 ARIMA(0,1,1) -1938.832
## 3 Model 2 ARIMA(1,1,1) -1937.978

Terlihat bahwa nilai AIC pada model 4 ARIMA(1,1,0) adalah -1939.526 yang merupakan nilai AIC terkecil dan memiliki parameter yang koefisiennya juga signifikan sehingga dapat disimpulkan bahwa model 1 ARIMA(1,1,0) adalah model terbaik.

Overfitting

Model 1a ARIMA(2,1,0)

model1a <- arima(doge.train.ts, order=c(2,1,0), method="ML")
summary(model1a)
## 
## Call:
## arima(x = doge.train.ts, order = c(2, 1, 0), method = "ML")
## 
## Coefficients:
##           ar1     ar2
##       -0.1516  0.0448
## s.e.   0.0605  0.0604
## 
## sigma^2 estimated as 4.607e-05:  log likelihood = 972.04,  aic = -1940.08
## 
## Training set error measures:
##                        ME         RMSE          MAE         MPE        MAPE
## Training set 0.0002717359 0.0002717359 0.0002717359 0.001358679 0.001358679
##              MASE ACF1
## Training set  NaN   NA
coeftest(model1a)
## 
## z test of coefficients:
## 
##      Estimate Std. Error z value Pr(>|z|)  
## ar1 -0.151645   0.060464  -2.508  0.01214 *
## ar2  0.044815   0.060400   0.742  0.45810  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Terdapat 1 parameter yang tidak signifikan.

Model 1b ARIMA(1,1,1)

model1b <- arima(doge.train.ts, order=c(1,1,1), method="ML")
summary(model1b)
## 
## Call:
## arima(x = doge.train.ts, order = c(1, 1, 1), method = "ML")
## 
## Coefficients:
##           ar1     ma1
##       -0.3645  0.2101
## s.e.   0.3038  0.3173
## 
## sigma^2 estimated as 4.609e-05:  log likelihood = 971.99,  aic = -1939.98
## 
## Training set error measures:
##                        ME         RMSE          MAE         MPE        MAPE
## Training set 0.0002717359 0.0002717359 0.0002717359 0.001358679 0.001358679
##              MASE ACF1
## Training set  NaN   NA
coeftest(model1b)
## 
## z test of coefficients:
## 
##     Estimate Std. Error z value Pr(>|z|)
## ar1 -0.36446    0.30377 -1.1998   0.2302
## ma1  0.21011    0.31728  0.6622   0.5078

tidak ada parameter yang signifikan.

Perbandingan Model

df.model <- data.frame("Model" = c("Model Awal ARIMA(1,1,0)", "Model 1a ARIMA(2,1,0)", "Model 1b ARIMA(1,1,1)"), "AIC" = c(doge.arima4$aic,model1a$aic, model1b$aic))
dplyr::arrange(.data=df.model, AIC)
##                     Model       AIC
## 1   Model 1a ARIMA(2,1,0) -1940.076
## 2   Model 1b ARIMA(1,1,1) -1939.978
## 3 Model Awal ARIMA(1,1,0) -1939.526

Berdasarkan hasil di atas, model awal ARIMA(1,1,0) dipilih sebagai model terbaik karena menghasilkan seluruh parameter yang signifikan.

Uji Diagnostik Model Terbaik

Eksplorasi Data

sisaan <- doge.arima1$residuals
sisaanfit <- model1a$residuals
par(mfrow = c(2,2))
qqnorm(sisaan)
qqline(sisaan, col = "blue", lwd = 2)
plot(sisaan, type="o", 
     ylab = "Sisaan", xlab = "Order", main = "Sisaan vs Order")
abline(h = 0, col='red')
acf(sisaan)
pacf(sisaan)

Hasil dari plot eksploratif QQPlot menunjukkan bahwa data tidak menyebar normal dikarenakan terdapat titik-titik di QQPlot yang terlihat menyimpang. Kemudian, hasil pada plot sisaan vs order terlihat tebaran amatan pada plot terlihat acak. Hal ini menunjukkan bahwa sisaan data bebas autokorelasi. Namun, melihat dari plot ACF maupun plot PACF, pada kedua plot terdapat garis vertikal di lag tertentu yang melebihi tinggi garis biru horizontal. Dengan begitu, menurut kedua plot ini, terdapat autokorelasi pada model. Uji eksploratif pada plot hanya untuk menguji asumsi secara sekilas saja, sehingga perlu dilakukan uji formal agar mendapatkan hasil yang lebih valid.

Jerque Bara

H0 : Sisaan mengikuti sebaran normal

H1 : Sisaan tidak mengikuti sebaran normal

jarque.bera.test(sisaanfit)
## 
##  Jarque Bera Test
## 
## data:  sisaanfit
## X-squared = 214.61, df = 2, p-value < 2.2e-16

Dari hasil pengujian di atas, nilai p-value < 0.05 sehingga Tolak H0. Artinya, cukup bukti untuk menyatakan bahwa sisaan tidak mengikuti sebaran normal pada taraf nyata 5%.

Shapiro Test

H0 : Sisaan mengikuti sebaran normal

H1 : Sisaan tidak mengikuti sebaran normal

shapiro.test(sisaanfit)
## 
##  Shapiro-Wilk normality test
## 
## data:  sisaanfit
## W = 0.92248, p-value = 1.023e-10

Dari hasil pengujian di atas, nilai p-value < 0.05 sehingga Tolak H0. Artinya, cukup bukti untuk menyatakan bahwa sisaan tidak mengikuti sebaran normal pada taraf nyata 5%.

Ljung Test

H0 : Tidak terdapat autokorelasi

H1 : Terdapat autokorelasi

Box.test(sisaanfit, type = "Ljung") 
## 
##  Box-Ljung test
## 
## data:  sisaanfit
## X-squared = 0.068022, df = 1, p-value = 0.7942

Dari hasil pengujian di atas, nilai p-value > 0.05 sehingga Tak Tolak H0. Artinya, cukup bukti untuk menyatakan bahwa tidak terdapat autokorelasi pada taraf nyata 5%.

T-Test

H0 : Nilai tengah sisaan bernilai nol

H1 : Nilah tengah sisaan tak bernilai nol

t.test(sisaanfit, mu = 0, conf.level = 0.95) 
## 
##  One Sample t-test
## 
## data:  sisaanfit
## t = -2.0205, df = 272, p-value = 0.04431
## alternative hypothesis: true mean is not equal to 0
## 95 percent confidence interval:
##  -1.626633e-03 -2.111817e-05
## sample estimates:
##     mean of x 
## -0.0008238756

Dari hasil pengujian di atas, nilai p-value < 0.05 sehingga Tolak H0. Artinya, tidak cukup bukti untuk menyatakan bahwa nilai tengah sisaan bernilai nol pada taraf nyata 5%.

ARCH

H0 : Sisaan homogen

H1 : Sisaan tidak homogen

ArchTest(sisaanfit)
## 
##  ARCH LM-test; Null hypothesis: no ARCH effects
## 
## data:  sisaanfit
## Chi-squared = 19.668, df = 12, p-value = 0.07364

Dari hasil pengujian di atas, nilai p-value > 0.05 sehingga Tak Tolak H0. Artinya, tidak cukup bukti untuk menyatakan bahwa sisaan homogen pada taraf nyata 5%.

Forecasting

Plot Ramalan

ramalanfit <- forecast::forecast(doge.train.ts,model=doge.arima4, h = 31) 
ramalanfit
##     Point Forecast      Lo 80      Hi 80       Lo 95      Hi 95
## 274     0.06834291 0.05961934 0.07706647 0.055001364 0.08168445
## 275     0.06830529 0.05690561 0.07970497 0.050870978 0.08573960
## 276     0.06831126 0.05463349 0.08198903 0.047392919 0.08922960
## 277     0.06831031 0.05269996 0.08392067 0.044436332 0.09218429
## 278     0.06831046 0.05097932 0.08564161 0.041804764 0.09481616
## 279     0.06831044 0.04941492 0.08720596 0.039412234 0.09720865
## 280     0.06831044 0.04797046 0.08865043 0.037203124 0.09941776
## 281     0.06831044 0.04662199 0.08999889 0.035140824 0.10148006
## 282     0.06831044 0.04535260 0.09126829 0.033199447 0.10342144
## 283     0.06831044 0.04414980 0.09247109 0.031359930 0.10526096
## 284     0.06831044 0.04300411 0.09361678 0.029607745 0.10701314
## 285     0.06831044 0.04190809 0.09471280 0.027931523 0.10868936
## 286     0.06831044 0.04085578 0.09576510 0.026322164 0.11029872
## 287     0.06831044 0.03984235 0.09677854 0.024772253 0.11184863
## 288     0.06831044 0.03886378 0.09775711 0.023275652 0.11334523
## 289     0.06831044 0.03791669 0.09870419 0.021827212 0.11479367
## 290     0.06831044 0.03699824 0.09962265 0.020422562 0.11619832
## 291     0.06831044 0.03610597 0.10051491 0.019057955 0.11756293
## 292     0.06831044 0.03523777 0.10138312 0.017730151 0.11889074
## 293     0.06831044 0.03439178 0.10222911 0.016436323 0.12018456
## 294     0.06831044 0.03356638 0.10305450 0.015173989 0.12144690
## 295     0.06831044 0.03276015 0.10386074 0.013940956 0.12267993
## 296     0.06831044 0.03197179 0.10464909 0.012735273 0.12388561
## 297     0.06831044 0.03120018 0.10542070 0.011555197 0.12506569
## 298     0.06831044 0.03044429 0.10617659 0.010399163 0.12622172
## 299     0.06831044 0.02970320 0.10691769 0.009265759 0.12735513
## 300     0.06831044 0.02897607 0.10764482 0.008153705 0.12846718
## 301     0.06831044 0.02826213 0.10835875 0.007061839 0.12955905
## 302     0.06831044 0.02756071 0.10906018 0.005989099 0.13063179
## 303     0.06831044 0.02687115 0.10974974 0.004934515 0.13168637
## 304     0.06831044 0.02619288 0.11042800 0.003897194 0.13272369
data.ramalanfit <- ramalanfit$mean
plot(ramalanfit, xlab="Time", ylab="Doge Price", main="Plot Ramalan Metode ARIMA(1,1,0)")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), doge.test.ts,col="black")

Metode Bayesian Structural Time Series

data_doge_all <- read_csv("D:/IPB University/Semester 5/STA1341 MPDW/PAPER/dogeedit.csv")
## New names:
## Rows: 304 Columns: 3
## ── Column specification
## ──────────────────────────────────────────────────────── Delimiter: "," dbl
## (2): ...1, Price date (1): Date
## ℹ Use `spec()` to retrieve the full column specification for this data. ℹ
## Specify the column types or set `show_col_types = FALSE` to quiet this message.
## • `` -> `...1`
data_doge_tr <- data_doge_all[1:273,]

BSTS Semi Local Linear

#data training
plot(model2, "comp")

pred2 <- predict(model2, horizon = 31)
plot(pred2, xlab="Time", ylab="Doge Price", main="Plot Ramalan BSTS Semi Local Data Training")

BSTS Local Linear

#data training
plot(model1, "comp")

pred1 <- predict(model1, horizon = 31)
plot(pred1, xlab="Time", ylab="Doge Price", main="Plot Ramalan BSTS Local Linear Data Training")

#Prior
model1$prior
## $prior.guess
## [1] 0.05509237
## 
## $prior.df
## [1] 0.01
## 
## $initial.value
## [1] 0.05509237
## 
## $fixed
## [1] FALSE
## 
## $upper.limit
## [1] 0.06611085
## 
## attr(,"class")
## [1] "SdPrior"         "DiffDoubleModel" "DoubleModel"     "Prior"
model2$prior
## $prior.guess
## [1] 0.05416166
## 
## $prior.df
## [1] 0.01
## 
## $initial.value
## [1] 0.05416166
## 
## $fixed
## [1] FALSE
## 
## $upper.limit
## [1] 0.06499399
## 
## attr(,"class")
## [1] "SdPrior"         "DiffDoubleModel" "DoubleModel"     "Prior"

Validasi Metode

Plot Perbandingan Ramalan vs Aktual

par(mfrow=c(1,1))
plot(1:length(doge.train.ts), doge.train.ts, type="l", col="black", xlim=c(1,length(doge.train.ts)+31),
     ylab="Doge Price",ylim=c(0.04,0.3),xlab="Waktu", main=" Plot Perbandingan Metode Ramalan vs Data Aktual")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), doge.test.ts,col="black")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), data.ramalanfit,col="cyan")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), ramal_des$mean,col="red")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), pred1$mean,col="brown")
lines((length(doge.train.ts)+1):(length(doge.train.ts)+31), pred2$mean,col="green")
legend("topright",c("data aktual","Ramalan ARIMA(1,1,0)","Ramalan DES alpha 0.82 beta 0.1","BSTS Local Linear","BSTS Semi Local Linear"), lty=1,col=c("black", "cyan","red","brown","green"))

Ukuran Keakuratan

# MAPE
ramal_des$mean <- as.numeric(ramal_des$mean)
c_ramalanfit <- c(ramalanfit$mean)
c_dogetest <- c(doge.test)
c_des <- c(ramal_des$mean)
c_bsts2 <- c(pred2$mean)
c_bsts1 <- c(pred1$mean)
MAPEForecast <- mean(abs((c_dogetest-c_ramalanfit)/c_dogetest),na.rm=TRUE)*100
MAPEDes <- mean(abs((c_dogetest-c_des)/c_dogetest),na.rm=TRUE)*100
MAPEbsts1 <- mean(abs((c_dogetest-c_bsts1)/c_dogetest),na.rm=TRUE)*100
MAPEbsts2 <- mean(abs((c_dogetest-c_bsts2)/c_dogetest),na.rm=TRUE)*100

MAPE <- data.frame("Metode"=c("DES alpha 0.82 beta 0.1","ARIMA (1,1,0)","BSTS Local Linear", "BSTS Semi Local Linear"),"MAPE"=c(MAPEDes,MAPEForecast,MAPEbsts1,MAPEbsts2))
MAPE
##                    Metode      MAPE
## 1 DES alpha 0.82 beta 0.1  6.686442
## 2           ARIMA (1,1,0)  5.204613
## 3       BSTS Local Linear 19.593203
## 4  BSTS Semi Local Linear 19.036097

Peramalan 2 Minggu ARIMA (1,1,0)

#Prior
doge.arima.real <- Arima(doge.ts.full,order = c(1,1,0),method ="ML")

Plot Ramalan

ramalanall <- forecast::forecast(doge.ts.full,model=doge.arima.real, h = 14) 
ramalanall
##     Point Forecast      Lo 80      Hi 80      Lo 95      Hi 95
## 305     0.06135219 0.05297730 0.06972707 0.04854390 0.07416047
## 306     0.06134745 0.05042149 0.07227342 0.04463763 0.07805728
## 307     0.06134822 0.04824276 0.07445368 0.04130515 0.08139130
## 308     0.06134810 0.04639436 0.07630183 0.03847834 0.08421785
## 309     0.06134812 0.04474816 0.07794807 0.03596068 0.08673555
## 310     0.06134811 0.04325145 0.07944478 0.03367165 0.08902457
## 311     0.06134811 0.04186935 0.08082688 0.03155792 0.09113831
## 312     0.06134811 0.04057903 0.08211720 0.02958454 0.09311169
## 313     0.06134811 0.03936431 0.08333192 0.02772679 0.09496944
## 314     0.06134811 0.03821329 0.08448294 0.02596645 0.09672978
## 315     0.06134811 0.03711687 0.08557935 0.02428963 0.09840660
## 316     0.06134811 0.03606797 0.08662826 0.02268547 0.10001076
## 317     0.06134811 0.03506089 0.08763534 0.02114527 0.10155096
## 318     0.06134811 0.03409099 0.08860524 0.01966193 0.10303429
data.ramalanall <- ramalanall$mean
plot(ramalanall, xlab="Waktu", ylab="Doge Price", main="Plot Ramalan Metode ARIMA(1,1,0)")

Kesimpulan

Analisis yang telah dilakukan pada data Dogecoin Price diperoleh nilai Mean Absolute Percentage Error (MAPE) dari masing-masing metode peramalan. Secara berturut-turut, nilai MAPE dari metode ARIMA(1,1,0), DES(α=0.82 ,β=0.1), dan Bayesian Structural Time Series adalah 5.205, 6.686, dan 19.036. Terlihat bahwa nilai MAPE yang didapatkan pada metode peramalan ARIMA(1,1,0) memiliki nilai yang paling kecil dibandingkan dengan metode peramalan lainnya. Oleh karena itu, dapat disimpulkan bahwa metode peramalan ARIMA(1,1,0) merupakan metode yang terbaik untuk meramal pergerakan harga mata uang kripto Dogecoin ke depannya.

Daftar Pustaka

Nasution DA, Khotimah HH, Chamidah N. 2019. Perbandingan normalisasi data untuk klasifikasi wine menggunakan algoritma k-nn. CESS (Journal of Computer Engineering, System and Science). 4(1):78-82.

Setiawan EP. 2020. Analisis potensi dan risiko investasi cryptocurrency di Indonesia. Jurnal Manajemen Teknologi. 19(2):130-144.