Kelompok 5
Nama Anggota :- Faadiyah Ramadhani (G1401201009)
- Muhammad Farhan Zahid (G1401201010)
- Nabila Cahyati (G1401201011)
- Pandu Henanda Saputra (G1401201043)
- 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.
forecast
TTR
graphics
TSA
aTSA
tseries
lmtestdplyrFinTSbstsreadrggplot2
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 normalH1 : 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 normalH1 : 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 autokorelasiH1 : 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 nolH1 : 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 homogenH1 : 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.