Pendahuluan
Latar Belakang
Kurs jual adalah harga jual mata uang yang dipakai oleh bank yang digunakan untuk penukaran mata uang asing dan yang digunakan oleh para pedagang valuta asing untuk menjual valuta asing. Misalnya adalah ketika menukarkan rupiah (Rp) dengan dolar Amerika (USD), kurs yang digunakan adalah kurs jual. Ada tiga jenis kurs, sistem kurs tetap, sistem kurs bebas atau mengambang, dan sistem kurs mengambang terkendali. Dilansir dari laman resmi Bank Indonesia (BI), Indonesia menganut sistem kurs mengambang (free floating). Peran kestabilan kurs sangat penting dalam mencapai stabilitas harga dan sistem keuangan (Salim 2022). Oleh karena itu, forecasting penting digunakan untuk meramalkan keuangan negara di masa yang akan datang. GBP (Great Britain Poundsterling) merupakan mata uang yang berasal dari Britania Raya dan merupakan mata uang dengan nilai kurs jual yang tinggi di Indonesia.
Tuujuan
- Menentukan persamaan model menggunakan metode Autoregressive Lag
- Memperoleh peramalan nilai kurs jual GBP di masa mendatang
Analisis Data
Install Packagaes
library(readxl)
library(forecast)
library(TTR)
library(imputeTS)
library(tseries)
library(ggplot2)
library(dplyr)
library(graphics)
library(TSA)
library(tidyverse)
library(lubridate)
library(gridExtra)
library(ggfortify)
library(cowplot)
library(graphics)
library(lmtest)
library(stats)
library(MASS)
library(FinTS)
library(orcutt)
Import Data
Data yang digunakan pada proses forecasting adalah Kurs Transaksi Mata Uang yang dilakukan oleh Bank Indonesia pada rentang periode 1 tahun dengan perhitungan data harian, 1 Januari hingga 31 Desember 2021 terhadap mata uang Britania Raya, Pound sterling.
data <- read_excel("~/Downloads/kurs transaksi GBP.xlsx")
ts.data <- ts(data)
str(data)
## tibble [256 × 2] (S3: tbl_df/tbl/data.frame)
## $ Tanggal : POSIXct[1:256], format: "2021-01-04" "2021-01-05" ...
## $ Kurs_Jual: num [1:256] 19128 19038 19044 19024 19158 ...
kableExtra::kable(head(data) ,caption = 'Kurs Transaksi Mata Uang Pound sterling')
| Tanggal | Kurs_Jual |
|---|---|
| 2021-01-04 | 19128.38 |
| 2021-01-05 | 19037.61 |
| 2021-01-06 | 19043.85 |
| 2021-01-07 | 19023.84 |
| 2021-01-08 | 19157.96 |
| 2021-01-11 | 19224.72 |
Eksplorasi Data
data$Tanggal <- as.Date(data$Tanggal)
ggplot(data, aes(x=Tanggal, y= Kurs_Jual))+
geom_line()+
scale_x_date(date_breaks = "2 month", date_labels = "%Y %b %d") +
labs(title = "Plot Time Series Data Kurs Transaksi GBP",
subtitle = "(Januari 2021 sd Desember 2021)",
y="Kurs Jual GBP") +
theme(plot.title = element_text(face = "bold", hjust=.5),
plot.subtitle = element_text(hjust=.5))
p=0.8
freq_train=as.integer(p*nrow(data))
data$Tanggal <- as.Date(data$Tanggal)
ggplot(data, aes(x=Tanggal, y=Kurs_Jual)) +
geom_line() +
scale_x_date(date_breaks = "2 month", date_labels = "%Y %b %d") +
labs(title = "Plot Time Series Data Kurs Transaksi GBP",
subtitle = "(Januari 2021 sd Desember 2021)",
y="Kurs Jual GBP") +
geom_vline(aes(xintercept = Tanggal[freq_train],
col="Frequency_Train_Data"), lty=2, lwd=.7) +
theme(plot.title = element_text(face = "bold", hjust=.5),
plot.subtitle = element_text(hjust=.5),
legend.position = "bottom") +
scale_color_manual(name = "", values = c(Frequency_Train_Data="red"))
data[freq_train,1]
## # A tibble: 1 × 1
## Tanggal
## <date>
## 1 2021-10-19
Berdasarkan hasil eksplorasi, terlihat bahwa sebaran data cenderung mengikuti pola siklik. Sekilas terlihat mirip namun pola siklik berbeda dengan pola musiman, pada pola musiman mempunyai panjang gelombang yang tetap dan terjadi pada waktu yang tetap, sedangkan pola siklik memiliki jarak waktu yang bervariasi dari satu siklus ke siklus lainnya (Ilham 2016). Pola data siklik tersebut menunjukkan bahwa siklus transaksi Kurs Mata Uang terus berfluktuasi dalam jangka panjang. Walaupun di bagian akhir periode, data cenderung mengalami penurunan, tetapi datanya tetap berfluktuasi sehingga lebih tepat dikatakan siklik daripada tren menurun.
Splitting Data
training <- data[1:232,]
testing<-data[233:256,]
training.ts<-ts(training)
testing.ts<-ts(testing)
Dari keseluruhan dataset dilakukan pengaturan komposisi menjadi 2 sub bagian yaitu data training dan testing dengan presentase 80 : 20 dengan tujuan menghindari adanya overfitting.
Plot Data Training
plot(training.ts, col="blue",main="Plot Data Training")
points(training.ts)
Plot Data Testing
plot(testing.ts, col="blue",main="Plot dataTtraining")
points(testing.ts)
Time Series Plot Data Training dan Testing
p=0.8
freq_train=as.integer(p*nrow(data))
data$Tanggal <- as.Date(data$Tanggal)
ggplot(data, aes(x=Tanggal, y=Kurs_Jual)) +
geom_line() +
scale_x_date(date_breaks = "2 month", date_labels = "%Y %b %d") +
labs(title = "Plot Time Series Data Kurs Transaksi GBP",
subtitle = "(Januari 2021 sd Desember 2021)",
y="Kurs Jual GBP") +
geom_vline(aes(xintercept = Tanggal[freq_train],
col="Frequency_Train_Data"), lty=2, lwd=.7) +
theme(plot.title = element_text(face = "bold", hjust=.5),
plot.subtitle = element_text(hjust=.5),
legend.position = "bottom") +
scale_color_manual(name = "", values = c(Frequency_Train_Data="red"))
Pemulusan
Parameter Optimum SMA dan DMA
pemulusan <- function(x,min,max,method=c("SMA","DMA"),
metrik=c("SSE","MSE","RMSE","MAD","MAPE")){
df.master <- data.frame()
z <- max-min+1
temp <- sqrt(z)
a <- round(temp)
b=a
if(a*b<z){
b=b+1
}
par(mfrow=c(a,b))
if(method=="SMA"){
for(i in min:max) {
sma <- TTR::SMA(x,i)
ramal <- c(NA,sma)
df <- cbind(aktual=c(x,NA),mulus=c(sma,NA),ramal)
error <- df[,1]-df[,3]
sse <- sum(error^2,na.rm=T)
mse <- mean(error^2,na.rm=T)
rmse <- sqrt(mse)
mad <- mean(abs(error),na.rm=T)
rerror <- error/df[,1]*100
mape <- mean(abs(rerror),na.rm=T)
ak <- data.frame(n=i,SSE=sse,MSE=mse,RMSE=rmse,MAD=mad,MAPE=mape)
df.master <- rbind(df.master,ak)
ts.plot(x,col="gray",main=paste("Single Moving Average n =",i))
lines(sma,col="green",lwd=2)
lines(ramal,col="red",lwd=1)
}
}
else if(method=="DMA") {
for(i in min:max) {
df_ts_sma <- TTR::SMA(x, n=i)
df_ts_dma <- TTR::SMA(df_ts_sma, n=i)
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(x,NA), pemulusan_dma=c(pemulusan_dma,NA), ramal_dma)
error.dma <- df_dma[, 1] - df_dma[, 3]
SSE.dma <- sum(error.dma^2, na.rm = T)
MSE.dma <- mean(error.dma^2, na.rm = T)
RMSE.dma <- sqrt(mean(error.dma^2, na.rm = T))
MAD.dma <- mean(abs(error.dma), na.rm = T)
r.error.dma <- (error.dma/df_dma[, 1])*100
MAPE.dma <- mean(abs(r.error.dma), na.rm = T)
ak <- data.frame(n=i,SSE=SSE.dma,MSE=MSE.dma,RMSE=RMSE.dma,
MAD=MAD.dma,MAPE=MAPE.dma)
df.master <- rbind(df.master,ak)
ts.plot(x,main=paste("Double Moving Average n =",i))
lines(pemulusan_dma,col="green",lwd=2)
lines(ramal_dma,col="red",lwd= 2)
}
}
opt <- df.master$n[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("n optimum adalah",opt)))
}
Parameter Optimum SES dan DES
pemulusan2 <- function(x,alfa=NULL,beta=NULL,method=c("SES","DES"),
metrik=c("SSE","MSE","RMSE")){
df.master <- data.frame()
if(method=="SES"){
for(i in alfa){
df_ses <- HoltWinters(x, alpha = i, beta=F, gamma=F)
sse <- df_ses$SSE
mse <- sse/length(x)
rmse <-sqrt(mse)
ak <- data.frame(Alpha=i,SSE=sse,MSE=mse,RMSE=rmse)
df.master <- rbind(df.master,ak)
datases <- data.frame(x, c(NA, df_ses$fitted[,1]))
colnames(datases) = c("y","yhat")
ts.plot(x, xlab="Periode waktu", ylab="Yt", col="blue", lty=3,main=paste("Single Exponential Smoothing Alpha=",i))
points(x)
lines(datases[,2], col="red",lwd=2) #nilai dugaan
}
}
else if(method=="DES"){
for (i in alfa) {
for (j in beta) {
df_des <- HoltWinters(x, alpha = i, beta=j, gamma=F)
sse <- df_des$SSE
mse <- sse/length(x)
rmse <-sqrt(mse)
ak <- data.frame(Alpha=i,Beta=j,SSE=sse,MSE=mse,RMSE=rmse)
df.master <- rbind(df.master,ak)
datades <- data.frame(x, c(NA, NA, df_des$fitted[,1]))
colnames(datades) = c("y","yhat")
ts.plot(x,xlab="periode waktu", ylab="Yt", col="blue", lty=3,main=paste("Double Exponential Smoothing (Alpha=",i,"Beta=",j))
points(x)
lines (datades[,2], col="red",lwd=2)
}
}
}
if(method=="SES"){
opt <- df.master$Alpha[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("Alpha optimum adalah",opt)))
}
else if(method=="DES"){
opt <- df.master$Alpha[which.min(df.master[,metrik])]
opt2 <- df.master$Beta[which.min(df.master[,metrik])]
return(list(Akurasi=df.master,n.optimum=paste("Alpha optimum adalah",opt,
",Beta optimum adalah",opt2)))
}
}
SAS
par(mar=c(1,1,1,1))
pemulusan(x=data$Kurs_Jual,min=2,max=10,method = "SMA",metrik = "MSE")
## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 1571354 6186.431 78.65387 63.05423 0.3185231
## 2 3 1956408 7732.837 87.93655 69.81639 0.3528312
## 3 4 2331726 9252.882 96.19190 75.33272 0.3805974
## 4 5 2671985 10645.357 103.17634 80.28536 0.4054753
## 5 6 2992723 11970.892 109.41157 84.10787 0.4246626
## 6 7 3246460 13037.991 114.18402 87.28620 0.4403455
## 7 8 3455174 13932.153 118.03454 90.66235 0.4571334
## 8 9 3703719 14994.814 122.45331 94.56226 0.4766684
## 9 10 3967532 16128.178 126.99677 98.11385 0.4945390
##
## $n.optimum
## [1] "n optimum adalah 2"
DMA
par(mar=c(1,1,1,1))
pemulusan(x=data$Kurs_Jual,min=2,max=10,method = "DMA",metrik = "MSE")
## $Akurasi
## n SSE MSE RMSE MAD MAPE
## 1 2 1565904 6189.344 78.67239 62.89745 0.3173407
## 2 3 2140060 8526.136 92.33708 75.58943 0.3817482
## 3 4 2790207 11205.650 105.85674 83.83842 0.4233595
## 4 5 3435454 13908.720 117.93524 94.27952 0.4760195
## 5 6 3917089 15988.117 126.44413 101.74941 0.5133435
## 6 7 4310675 17739.402 133.18935 103.90173 0.5232927
## 7 8 4585508 19027.003 137.93840 108.43651 0.5456519
## 8 9 4882720 20429.791 142.93282 115.36217 0.5802503
## 9 10 5295199 22342.611 149.47445 122.07013 0.6142200
##
## $n.optimum
## [1] "n optimum adalah 2"
masih kecilan sma anatar sma dma kecilan ses anatara ses des masih kecilan ses dari sma (rmse)
SES
pemulusan2(x=data$Kurs_Jual,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
method="SES",metrik="MSE")
## $Akurasi
## Alpha SSE MSE RMSE
## 1 0.1 5823358 22747.493 150.82272
## 2 0.2 3146003 12289.075 110.85610
## 3 0.3 2316206 9047.681 95.11930
## 4 0.4 1901653 7428.330 86.18776
## 5 0.5 1653383 6458.529 80.36497
## 6 0.6 1491548 5826.358 76.33058
## 7 0.7 1383478 5404.211 73.51334
## 8 0.8 1313546 5131.040 71.63128
## 9 0.9 1273686 4975.335 70.53605
##
## $n.optimum
## [1] "Alpha optimum adalah 0.9"
DES
pemulusan2(x=data$Kurs_Jual,alfa=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),
beta=c(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9),method="DES",metrik="MSE")