Turunnya harga saham di pasar modal disebabkan oleh aksi penarikan dana secara besar-besaran oleh para investor, yang menyebabkan nilai saham turun termasuk saham-saham di sektor perbankan. Saham didefinisikan sebagai dokumen berharga yang diterbitkan oleh suatu Perseroan Terbatas (PT) atau emiten (Kusuma dkk., 2022). Salah satu bank yang terdampak cukup signifikan selama masa pandemi adalah PT Bank Negara Indonesia (Persero) Tbk. dengan kode perusahaan BBNI termasuk dalam jajaran BUMN yang mengalami penurunan harga saham secara drastis. Sebagai ilustrasi, harga penutupan saham BNI pada 27 Desember 2019 tercatat sebesar Rp7.925 per lembar, sementara pada masa pandemi, harga tersebut merosot tajam hingga menyentuh Rp3.390 per lembar (Yolanda & Asfar, 2021).
Penurunan ini mencerminkan tekanan besar yang dialami sektor perbankan akibat krisis global yang dipicu oleh pandemi COVID-19, serta meningkatnya kekhawatiran investor terhadap ketidakstabilan ekonomi nasional dan global. Oleh karena itu, dibutuhkan pendekatan analisis yang mampu mengukur dampak langsung peristiwa tersebut terhadap harga saham, salah satunya melalui analisis intervensi. Analisis intervensi merupakan salah satu metode dalam analisis deret waktu yang bertujuan untuk mengidentifikasi dan mengukur dampak suatu kejadian, baik yang berasal dari faktor eksternal maupun internal, terhadap pola data deret waktu. Secara umum, analisis intervensi terbagi menjadi dua jenis, yaitu intervensi dengan fungsi step dan intervensi dengan fungsi pulse (Saputra dkk., 2021). Analisis intervensi fungsi step digunakan pada intervensi yang bersifat jangka panjang seperti, kebijakan pemerintah, kebijakan perusahaan, pergantian presiden, dan travel warning. Analisis intervensi fungsi pulse digunakan pada intervensi yang bersifat sementara seperti, bencana alam, bom, perang, promo potongan harga, dan demonstrasi (Wei, 2006). Saputra dkk., (2021) memperoleh hasil model terbaik sebelum intervensi adalah SARIMA (0, 1, 1)(0, 1, 1)12. Fungsi intervensi diidentifikasi dari grafik residual dengan parameter \(b=0\), \(r = 0\), \(s = 0\). Hasil peramalan menunjukkan peningkatan hotspot di Kalimantan Timur dari Juli hingga puncaknya pada September 2019 sebanyak 249 hotspot, lalu menurun pada Oktober yaitu 183 hotspot dan turun drastis pada November menjadi hanya 13 hotspot.
Meskipun analisis intervensi mampu menangkap dampak kejadian tertentu terhadap perubahan pola data, metode ini memiliki keterbatasan dalam menghadapi pola yang kompleks dan non-linear. Oleh karena itu, dibutuhkan pendekatan alternatif yang lebih fleksibel dan adaptif, salah satunya adalah metode Neural Network (NN). Neural Network atau biasa dikenal Artificial Neural Network (ANN) merupakan sistem yang tersusun atas sejumlah unit pemroses yang dirancang menyerupai cara kerja jaringan saraf manusia. Proses pelatihannya melibatkan penyesuaian terhadap bobot (weight) dan bias berdasarkan kesalahan (error) yang muncul. Setelah proses ini dilakukan, jaringan neural yang terbentuk akan siap digunakan untuk melakukan pemrosesan secara berulang. Ada dua metode ANN yang paling popular yaitu multi-layer perceptron (MLP) dan radial basis function (RBF) (Afrianto dkk., 2013). Siregar & Riksakamora (2016), mengembangkan aplikasi web untuk prediksi harga saham menggunakan Moving Average, Exponential Smoothing, dan Artificial Neural Network (ANN). Hasilnya menunjukkan ANN dengan model JST 2 sebagai metode terakurat, diikuti Simple Moving Average dengan komposisi data 90% pelatihan. Penelitian ini menjadi dasar pengembangan prediksi saham berbasis web dengan pendekatan komparatif metode.
Perbandingan antara analisis intervensi dan NN dipilih karena masing-masing metode memiliki kekuatan yang saling melengkapi dalam menangani pergerakan harga saham. Analisis intervensi efektif dalam mengukur dampak langsung dari peristiwa eksternal, seperti pandemi, terhadap harga saham. Sementara itu, NN lebih unggul dalam menangkap pola-pola non-linear dan fluktuasi kompleks yang sering muncul di pasar saham, terutama dalam periode ketidakpastian tinggi seperti yang terjadi selama pandemi. Oleh karena itu, dengan memadukan kedua pendekatan ini, diharapkan dapat diperoleh prediksi harga saham yang lebih akurat dan dapat diandalkan.
library(car)
library(forecast)
library(fracdiff)
library(fUnitRoots)
library(lmtest)
library(MASS)
library(Metrics)
library(MLmetrics)
library(neuralnet)
library(Rssa)
library(TSA)
library(tseries)
library(tsoutliers)
library(urca)
library(quadprog)
library(zoo)
Data yang digunakan merupakan data terakhir harga saham BBNI di Indonesia dari 3 Februari 2019 sampai dengan 26 Desember 2021 yang diperoleh dari website https://www.investing.com berdasarkan mingguan. Pada pembagian data dilakukan dengan rasio in sample dan out sample, yaitu 70:30. Adapun hasil pembagian data sebagai berikut:
##### Input Data #####
data <- read.csv(file.choose(), header = T, sep = ";", dec = ",")
head(data)
## Tanggal Terakhir Pembukaan Tertinggi Terendah
## 1 03/02/2019 4488 4625 4638 4463
## 2 10/02/2019 4388 4475 4538 4325
## 3 17/02/2019 4363 4400 4525 4325
## 4 24/02/2019 4488 4388 4488 4350
## 5 03/03/2019 4338 4450 4500 4338
## 6 10/03/2019 4525 4400 4563 4263
dataterakhir<-ts(as.numeric(data$Terakhir))
length(dataterakhir)
## [1] 151
head(as.matrix(dataterakhir, ncol = 1))
## [,1]
## [1,] 4488
## [2,] 4388
## [3,] 4363
## [4,] 4488
## [5,] 4338
## [6,] 4525
##### Pembagian Data In Sample dan Out Sample #####
dataterakhir_in <- ts(dataterakhir[1:round((length(dataterakhir)*70/100),0)])
length(dataterakhir_in)
## [1] 106
head(as.matrix(dataterakhir_in, ncol = 1))
## [,1]
## [1,] 4488
## [2,] 4388
## [3,] 4363
## [4,] 4488
## [5,] 4338
## [6,] 4525
dataterakhir_out <- ts(dataterakhir[(length(dataterakhir_in)+1):length(dataterakhir)])
length(dataterakhir_out)
## [1] 45
head(as.matrix(dataterakhir_out, ncol = 1))
## [,1]
## [1,] 2975
## [2,] 3000
## [3,] 3075
## [4,] 3075
## [5,] 3025
## [6,] 2838
##### Grafik Data Keseluruhan #####
plot(dataterakhir, main="Harga Saham BBNI", xlab="Waktu", ylab="Harga")
points(dataterakhir[1:length(dataterakhir)],cex=1,col="black",pch=19)
##### Grafik Data In Sample #####
plot(dataterakhir_in, main="Harga Saham BBNI (In Sample)", xlab="Waktu", ylab="Harga")
points(dataterakhir_in[1:length(dataterakhir_in)],cex=1,col="black",pch=19)
##### Grafik Data Out Sample #####
plot(dataterakhir_out, main="Harga Saham BBNI (Out Sample)", xlab="Waktu", ylab="Harga")
points(dataterakhir_out[1:length(dataterakhir_out)],cex=1,col="black",pch=19)
Berdasarkan grafik runtun waktu data keseluruhan terlihat bahwa harga saham BBNI dari 3 Februari 2019 sampai dengan 26 Desember 2021 (mingguan) cenderung mengalami tren turun. Pada grafik terlihat bahwa setelah periode ke-55 harga saham mengalami penurunan yang menyebabkan harga saham mencapai harga terendah, yaitu pada 10 Mei 2020 sebesar 1.670. Penurunan harga saham tersebut dapat terjadi dikarenakan dampak dari suatu peristiwa atau intervensi eksternal seperti COVID-19.
Berdasarkan grafik runtun waktu data in sample terlihat bahwa setelah periode 55 pada harga saham BBNI mengalami penurunan yang cukup jauh dari harga saham BBNI sebelumnya. Oleh sebab itu, dilakukan pembagian dimana data sebelum intervensi mulai dari periode 1 hingga periode 55 dimana periode 55 merupakan titik potong sebelum intervensi. Adapun hasil pembagian data sebelum intervensi ditunjukkan pada grafik runtun waktu sebagai berikut:
##### Pembagian Data Sebelum Intervensi #####
sebelum <- ts(dataterakhir_in[1:55])
plot(sebelum, main="Harga Saham BBNI", xlab="Waktu", ylab="Harga")
points(sebelum[1:length(sebelum)],cex=1,col="black",pch=19)
Pada pemodelan ARIMA perlu dipastikan bahwa data telah stasioner
dalam varians dan rata-rata. Kestasioneran data tersebut dapat
dipastikan dengan menggunakan grafik yang dapat ditampilkan menggunakan
boxcox untuk stasioner dalam varians serta grafik
Autocorrelation Function (ACF) dan uji dengan menggunakan
summary dari ur.df() untuk stasioner dalam
rata-rata. Adapun hasil pemeriksaan kestasioneran data sebelum
intervensi, yaitu:
##### Kestasioneran Data Sebelum Intervensi #####
# Stasioneritas Varians
boxcox(sebelum~1)
p<-powerTransform(sebelum)
p
## Estimated transformation parameter
## sebelum
## -1.87026
y<-(sebelum^p$lambda)
boxcox(y~1)
p1<-powerTransform(y)
p1
## Estimated transformation parameter
## y
## 0.9999819
# Stasioneritas Rata-Rata
acf(y, length(y))
testy=ur.df(y)
summary(testy)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.978e-08 -9.050e-09 -8.420e-10 8.982e-09 3.997e-08
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 0.005968 0.010006 0.596 0.553
## z.diff.lag 0.061067 0.154597 0.395 0.694
##
## Residual standard error: 1.308e-08 on 51 degrees of freedom
## Multiple R-squared: 0.01097, Adjusted R-squared: -0.02782
## F-statistic: 0.2828 on 2 and 51 DF, p-value: 0.7548
##
##
## Value of test-statistic is: 0.5965
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.6 -1.95 -1.61
datadiff=diff(y,differences=1)
testdiff=ur.df(datadiff)
summary(testdiff)
##
## ###############################################
## # Augmented Dickey-Fuller Test Unit Root Test #
## ###############################################
##
## Test regression none
##
##
## Call:
## lm(formula = z.diff ~ z.lag.1 - 1 + z.diff.lag)
##
## Residuals:
## Min 1Q Median 3Q Max
## -2.357e-08 -7.486e-09 -3.700e-11 9.645e-09 4.015e-08
##
## Coefficients:
## Estimate Std. Error t value Pr(>|t|)
## z.lag.1 -1.0525 0.2061 -5.106 5.15e-06 ***
## z.diff.lag 0.1415 0.1578 0.897 0.374
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Residual standard error: 1.315e-08 on 50 degrees of freedom
## Multiple R-squared: 0.4242, Adjusted R-squared: 0.4011
## F-statistic: 18.42 on 2 and 50 DF, p-value: 1.017e-06
##
##
## Value of test-statistic is: -5.106
##
## Critical values for test statistics:
## 1pct 5pct 10pct
## tau1 -2.6 -1.95 -1.61
Berdasarkan pemeriksaan kestasioneran data sebelum intervensi, dapat diketahui bahwa pada data perlu dilakukan transformasi serta perlu dilakukan satu kali differencing agar diperoleh data yang stasioner dalam varians dan rata-rata.
##### Identifikasi Orde ARIMA Data Sebelum Intervensi #####
acf(datadiff, length(datadiff))
pacf(datadiff, length(datadiff))
Data sebelum intervensi yang telah stasioner dimana pada data dilakukan differencing satu kali, terlihat bahwa grafik ACF dan Partial ACF (PACF) tidak memiliki lag yang keluar dari batas sehingga model ARIMA yang diperoleh dari data sebelum intervensi adalah ARIMA (0, 1, 0).
##### Pengujian Signifikansi Parameter #####
fit1=arima(x=y,order=c(0,1,0))
fit1
##
## Call:
## arima(x = y, order = c(0, 1, 0))
##
##
## sigma^2 estimated as 1.642e-16: log likelihood = 904.7, aic = -1809.39
Persamaan yang terbentuk dari model ARIMA (0, 1, 0) adalah \(\hat{Z}_t=Z_{t-1}+a_t\)
##### Pemeriksaan Diagnostik Model ARIMA #####
tsdiag(fit1, (length(y)-1))
ks.test(resid(fit1),"pnorm",mean(resid(fit1)),sd(resid(fit1)))
## Warning in ks.test.default(resid(fit1), "pnorm", mean(resid(fit1)),
## sd(resid(fit1))): ties should not be present for the one-sample
## Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: resid(fit1)
## D = 0.074388, p-value = 0.9211
## alternative hypothesis: two-sided
Berdasarkan pemeriksaan asumsi white noise dengan
tsdiag() pada fit1 atau ARIMA (0, 1, 0)
terlihat bahwa pada grafik pvalue untuk uji
Ljung-Box berada diatas garis pembatas, yaitu taraf
signifikansi sebesar 0,05. Oleh sebab itu, dapat diketahui bahwa ARIMA
(0, 1, 0) telah memenuhi asumsi white noise. Selain itu, pada
pengujian normalitas residual dengan ks.test() terlihat
bahwa pvalue dari uji Kolmogorov-Smirnov lebih besar
dari 0,05 sehingga dapat disimpulkan bahwa residual model ARIMA (0, 1,
0) berdistribusi normal.
Pada model ARIMA (0, 1, 0) data sebelum intervensi perlu dilakukan prediksi dan peramalan untuk memperoleh nilai residual yang nanti akan digunakan dalam mengidentifikasi orde model intervensi ARIMA.
##### Prediksi Model ARIMA (0, 1, 0) #####
Pred<-fitted.values(fit1)
Prediksi<-Pred^(1/p$lambda)
##### Peramalan Model ARIMA (0, 1, 0) #####
res1 = resid(fit1)
mean_res = mean(res1)
sd_res = sd(res1)
min_res = min(res1)
max_res = max(res1)
rtnorm <- function(n, mean, sd, a = -Inf, b = Inf){
qnorm(runif(n, pnorm(a, mean, sd), pnorm(b, mean, sd)), mean, sd)
}
n = length(dataterakhir_in) - length(sebelum)
set.seed(1)
nilai <- rtnorm(n = n, mean = mean_res, sd = sd_res, a = min_res, b = max_res)
prediksisesudah = predict(fit1, n.ahead=n)
x=prediksisesudah$pred+nilai
Peramalan<-(x)^(1/p$lambda)
predikramal<-c(Prediksi,Peramalan)
predikramal<-ts(data.frame(predikramal))
##### Identifikasi Orde Model Intervensi ARIMA dari Grafik Residual #####
aktualpred<-data.frame(dataterakhir_in, predikramal)
ressesudah<-aktualpred$dataterakhir_in-aktualpred$predikramal
error_idintv <- rep(0,length(dataterakhir_in))
error_idintv[1:length(sebelum)] <- sebelum-Prediksi
error_idintv[(length(sebelum)+1):length(dataterakhir_in)] <-ressesudah[(length(sebelum)+1):length(dataterakhir_in)]
min_e = abs(min(error_idintv))
max_e = abs(max(error_idintv))
if (max_e > min_e){
batasp = max_e
} else {
batasp = min_e
}
plot(error_idintv,xlim=c((length(sebelum)-10),length(dataterakhir_in)),ylim=c(-batasp,batasp),type="h", xlab="Time", ylab = "Residual", xaxt = "n")
grid()
RMSE(dataterakhir_in,predikramal)
## [1] 766.1701
abline(h=c(-RMSE(dataterakhir_in,predikramal), RMSE(dataterakhir_in,predikramal)), col="blue", lty=2)
abline(v = length(sebelum), col = "red", lty = 3, lwd = 1.5)
d = 2
abline(v = (length(sebelum)+d), col = "orange", lty = 3, lwd = 1.5)
loc_lab = c(length(sebelum)-20, length(sebelum)-10, length(sebelum), length(sebelum)+10, length(sebelum)+20, length(sebelum)+30, length(sebelum)+40, length(sebelum)+50)
axis(1, at = loc_lab,labels = c("T-20", "T-10", "T", "T+10", "T+20", "T+30", "T+40", "T+50"))
text(x = length(sebelum)-1, , y = abs(mean(error_idintv)), labels = "T", col = "red", pos = 3)
text(x = length(sebelum)+d+1, , y = abs(mean(error_idintv)), labels = "T+2", col = "orange", pos = 3)
Berdasarkan grafik nilai residual dari ARIMA (0, 1, 0), terlihat bahwa nilai residual melewati batas nilai RMSE pada 2 periode setelah titik potong sebelum intervensi yang ada pada periode ke-55. Oleh sebab itu, dapat diketahui orde model intervensi ARIMA (0, 1, 0) yang terbentuk adalah \(b=2\), \(r=0\), dan \(s=0\).
##### Estimasi dan Pengujian Signifikansi Parameter Model Intervensi ARIMA #####
mo_ao=outliers("LS",length(sebelum)+d)
ao=outliers.effects(mo_ao, length(dataterakhir_in))
intervensi=arima(dataterakhir_in, order=c(0,1,0),xreg = ao)
intervensi
##
## Call:
## arima(x = dataterakhir_in, order = c(0, 1, 0), xreg = ao)
##
## Coefficients:
## LS57
## -600.0000
## s.e. 165.7951
##
## sigma^2 estimated as 27488: log likelihood = -685.62, aic = 1373.24
coeftest(intervensi, df = length(dataterakhir_in)-1)
##
## t test of coefficients:
##
## Estimate Std. Error t value Pr(>|t|)
## LS57 -600.0 165.8 -3.6189 0.0004569 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Model intervensi ARIMA (0, 1, 0) menunjukkan bahwa pada parameter \(\omega_0=-600\) memiliki pvalue yang lebih kecil dari 0,05 maka dapat disimpulkan bahwa parameter signifikan terhadap model.
##### Pemeriksaan Diagnostik Model Intervensi ARIMA #####
tsdiag(intervensi, length(dataterakhir_in))
ks.test(resid(intervensi),"pnorm",mean(resid(intervensi)),sd(resid(intervensi)))
## Warning in ks.test.default(resid(intervensi), "pnorm", mean(resid(intervensi)),
## : ties should not be present for the one-sample Kolmogorov-Smirnov test
##
## Asymptotic one-sample Kolmogorov-Smirnov test
##
## data: resid(intervensi)
## D = 0.082384, p-value = 0.4681
## alternative hypothesis: two-sided
Berdasarkan pemeriksaan asumsi white noise dengan
tsdiag() pada intervensi terlihat bahwa grafik
pvalue untuk uji Ljung-Box berada diatas
garis pembatas, yaitu taraf signifikansi sebesar 0,05. Selain itu, pada
pengujian normalitas residual dengan ks.test() terlihat
bahwa pvalue dari uji Kolmogorov-Smirnov lebih besar
dari 0,05. Oleh sebab itu, dapat disimpulkan bahwa model intervensi
ARIMA (0, 1, 0) telah memenuhi asumsi white noise dan
normalitas residual.
##### Prediksi Model Intervensi ARIMA (0, 1, 0) #####
step_in=filter(1*(seq(dataterakhir_in)>=length(sebelum)+d), filter =0, method = "rec", sides=1)*intervensi$coef[1]
saham_arima_in <- arima(dataterakhir_in,order=c(0,1,0), xreg=step_in)
prediksi_akhir = fitted.values(saham_arima_in)
as.matrix(prediksi_akhir, ncol = 1)
## [,1]
## [1,] 4483.512
## [2,] 4488.000
## [3,] 4388.000
## [4,] 4363.000
## [5,] 4488.000
## [6,] 4338.000
## [7,] 4525.000
## [8,] 4800.000
## [9,] 4700.000
## [10,] 4813.000
## [11,] 4825.000
## [12,] 4925.000
## [13,] 4825.000
## [14,] 4625.000
## [15,] 4300.000
## [16,] 4050.000
## [17,] 4325.000
## [18,] 4200.000
## [19,] 4250.000
## [20,] 4425.000
## [21,] 4600.000
## [22,] 4600.000
## [23,] 4600.000
## [24,] 4450.000
## [25,] 4213.000
## [26,] 4050.000
## [27,] 3963.000
## [28,] 3963.000
## [29,] 3813.000
## [30,] 3850.000
## [31,] 3800.000
## [32,] 3925.000
## [33,] 3825.000
## [34,] 3713.000
## [35,] 3438.000
## [36,] 3488.000
## [37,] 3738.000
## [38,] 3913.000
## [39,] 3838.000
## [40,] 3838.000
## [41,] 3725.000
## [42,] 3825.000
## [43,] 3750.000
## [44,] 3788.000
## [45,] 3825.000
## [46,] 3900.000
## [47,] 3963.000
## [48,] 3900.000
## [49,] 3863.000
## [50,] 3888.000
## [51,] 3850.000
## [52,] 3600.000
## [53,] 3675.000
## [54,] 3763.000
## [55,] 3888.000
## [56,] 3513.000
## [57,] 2600.000
## [58,] 2600.000
## [59,] 1820.000
## [60,] 1995.000
## [61,] 2005.000
## [62,] 1995.000
## [63,] 2080.000
## [64,] 1900.000
## [65,] 2050.000
## [66,] 1900.000
## [67,] 1670.000
## [68,] 1800.000
## [69,] 1915.000
## [70,] 2125.000
## [71,] 2235.000
## [72,] 2240.000
## [73,] 2290.000
## [74,] 2280.000
## [75,] 2335.000
## [76,] 2335.000
## [77,] 2305.000
## [78,] 2300.000
## [79,] 2310.000
## [80,] 2500.000
## [81,] 2525.000
## [82,] 2625.000
## [83,] 2613.000
## [84,] 2435.000
## [85,] 2370.000
## [86,] 2300.000
## [87,] 2255.000
## [88,] 2320.000
## [89,] 2405.000
## [90,] 2425.000
## [91,] 2370.000
## [92,] 2480.000
## [93,] 2825.000
## [94,] 2838.000
## [95,] 3175.000
## [96,] 3175.000
## [97,] 3288.000
## [98,] 3325.000
## [99,] 3125.000
## [100,] 3088.000
## [101,] 3238.000
## [102,] 3163.000
## [103,] 3138.000
## [104,] 2775.000
## [105,] 3150.000
## [106,] 3100.000
Setelah dilakukan prediksi dengan menggunakan model intervensi ARIMA (0, 1, 0) maka dapat diperoleh ukuran akurasi model dengan menggunakan nilai Mean Absolute Percentage Error (MAPE), Symmetric MAPE (SMAPE), dan Root Mean Squared Error (RMSE) sebagai berikut:
MAPE_In <- MAPE(prediksi_akhir, dataterakhir_in)*100
SMAPE_In <- smape(dataterakhir_in, prediksi_akhir)*100
RMSE_In <- RMSE(prediksi_akhir, dataterakhir_in)
data.frame(MAPE_In, SMAPE_In, RMSE_In)
## MAPE_In SMAPE_In RMSE_In
## 1 3.912431 3.842473 165.0117
##### Grafik Perbandingan Data In Sample dan Data Prediksi #####
ts.plot(dataterakhir_in,col="black",type="o",main="Perbandingan Data In Sample dan Data Prediksi Model Intervensi",xlab="Waktu",ylab="Harga", lwd=1, xlim = c(0, length(dataterakhir_in)))
lines(prediksi_akhir,col="blue",type="o",lwd=1)
legend('topright',legend=c("In Sample","Prediksi"),col=c("black","blue"),lty=1, cex = 1.05)
Grafik perbandingan data in sample dan data prediksi dari model intervensi ARIMA (0, 1, 0) menunjukkan bahwa pola data prediksi dapat mengikuti pola data in sample yang berarti model dapat mengikuti perubahan pola yang terjadi akibat intervensi pada data aktual. Selain itu, dapat diketahui bahwa model intervensi ARIMA (0, 1, 0) untuk data in sample memiliki MAPE sebesar 3,9124 dan SMAPE sebesar 3,8425 yang berarti bahwa model sangat baik digunakan untuk memprediksi pola data dari harga saham BBNI.
Pada pemodelan dengan menggunakan model Neural Network (NN) perlu dilakukan standarisasi pada data terlebih dahulu dengan proses standarisasi sebagai berikut:
##### Standarisasi Data In Sample #####
max<-max(dataterakhir_in)
min<-min(dataterakhir_in)
newmax<-0.9
newmin<-(-0.9)
Yt<-(((dataterakhir_in-min)/(max-min))*(newmax-newmin))+newmin
Selanjutnya dilakukan penentuan input dan output yang nanti digunakan pada model NN berdasarkan grafik ACF dan PACF dari data in sample.
##### Penentuan Input dan Output #####
acf(dataterakhir_in, length(dataterakhir_in))
pacf(dataterakhir_in, length(dataterakhir_in))
X<-Yt[1:length(dataterakhir_in)-1]
Y<-Yt[2:length(dataterakhir_in)]
Data<-cbind(Y,X)
##### Destandarisasi Prediksi #####
Prediksi1<-(((Predict1-newmin)/(newmax-newmin))*(max-min))+min
Prediksi2<-(((Predict2-newmin)/(newmax-newmin))*(max-min))+min
Prediksi3<-(((Predict3-newmin)/(newmax-newmin))*(max-min))+min
##### Pemilihan Model NN Terbaik ####
MAPE_1 <- MAPE(Prediksi1[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])*100
MAPE_2 <- MAPE(Prediksi2[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])*100
MAPE_3 <- MAPE(Prediksi3[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])*100
SMAPE_1 <- smape(dataterakhir_in[2:length(dataterakhir_in)], Prediksi1[1:length(dataterakhir_in)-1])*100
SMAPE_2 <- smape(dataterakhir_in[2:length(dataterakhir_in)], Prediksi2[1:length(dataterakhir_in)-1])*100
SMAPE_3 <- smape(dataterakhir_in[2:length(dataterakhir_in)], Prediksi3[1:length(dataterakhir_in)-1])*100
RMSE_1 <- RMSE(Prediksi1[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])
RMSE_2 <- RMSE(Prediksi2[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])
RMSE_3 <- RMSE(Prediksi3[1:length(dataterakhir_in)-1],dataterakhir_in[2:length(dataterakhir_in)])
data.frame(
Model = c("1 Neuron", "2 Neuron", "3 Neuron"),
MAPE_NN = c(MAPE_1, MAPE_2, MAPE_3),
SMAPE_NN = c(SMAPE_1, SMAPE_2, SMAPE_3),
RMSE_NN = c(RMSE_1, RMSE_2, RMSE_3),
stringsAsFactors = FALSE
)
## Model MAPE_NN SMAPE_NN RMSE_NN
## 1 1 Neuron 4.039994 3.953459 174.2690
## 2 2 Neuron 4.021631 3.934963 173.7011
## 3 3 Neuron 4.073029 3.986035 173.8012
Berdasarkan perbandigan ukuran akurasi model dengan menggunakan nilai MAPE, SMAPE, dan RMSE terlihat bahwa nilai terkecil dari MAPE, SMAPE, dan RMSE terdapat pada model NN dengan 2 Neuron. Oleh sebab itu, dapat disimpulkan model NN dengan 2 neuron pada hidden layer merupakan model yang lebih baik daripada model NN dengan 1 neuron dan 3 neuron.
Setelah diperoleh model terbaik dari model intervensi dan model NN dengan data in sample maka dapat dilakukan peramalan pada data aktual berdasarkan model terbaik yang telah diperoleh dari masing-masing model dimana peramalan dilakukan selama 12 periode ke depan.
##### Peramalan Model Intervensi ARIMA (0, 1, 0) #####
step=filter(1*(seq(dataterakhir)>=length(sebelum)+d), filter =0, method = "rec", sides=1)*intervensi$coef[1]
saham_arima <- arima(dataterakhir,order=c(0,1,0), xreg=step)
xreg.rob=forecast(auto.arima(step),h=12)$mean
prediksi_intervensi = fitted.values(saham_arima)
peramalan_intervensi = predict(saham_arima,newxreg = xreg.rob)
Hasil_Intervensi = c(prediksi_intervensi , peramalan_intervensi$pred)
as.matrix(Hasil_Intervensi, ncol = 1)
## [,1]
## [1,] 4483.512
## [2,] 4488.000
## [3,] 4388.000
## [4,] 4363.000
## [5,] 4488.000
## [6,] 4338.000
## [7,] 4525.000
## [8,] 4800.000
## [9,] 4700.000
## [10,] 4813.000
## [11,] 4825.000
## [12,] 4925.000
## [13,] 4825.000
## [14,] 4625.000
## [15,] 4300.000
## [16,] 4050.000
## [17,] 4325.000
## [18,] 4200.000
## [19,] 4250.000
## [20,] 4425.000
## [21,] 4600.000
## [22,] 4600.000
## [23,] 4600.000
## [24,] 4450.000
## [25,] 4213.000
## [26,] 4050.000
## [27,] 3963.000
## [28,] 3963.000
## [29,] 3813.000
## [30,] 3850.000
## [31,] 3800.000
## [32,] 3925.000
## [33,] 3825.000
## [34,] 3713.000
## [35,] 3438.000
## [36,] 3488.000
## [37,] 3738.000
## [38,] 3913.000
## [39,] 3838.000
## [40,] 3838.000
## [41,] 3725.000
## [42,] 3825.000
## [43,] 3750.000
## [44,] 3788.000
## [45,] 3825.000
## [46,] 3900.000
## [47,] 3963.000
## [48,] 3900.000
## [49,] 3863.000
## [50,] 3888.000
## [51,] 3850.000
## [52,] 3600.000
## [53,] 3675.000
## [54,] 3763.000
## [55,] 3888.000
## [56,] 3513.000
## [57,] 2600.000
## [58,] 2600.000
## [59,] 1820.000
## [60,] 1995.000
## [61,] 2005.000
## [62,] 1995.000
## [63,] 2080.000
## [64,] 1900.000
## [65,] 2050.000
## [66,] 1900.000
## [67,] 1670.000
## [68,] 1800.000
## [69,] 1915.000
## [70,] 2125.000
## [71,] 2235.000
## [72,] 2240.000
## [73,] 2290.000
## [74,] 2280.000
## [75,] 2335.000
## [76,] 2335.000
## [77,] 2305.000
## [78,] 2300.000
## [79,] 2310.000
## [80,] 2500.000
## [81,] 2525.000
## [82,] 2625.000
## [83,] 2613.000
## [84,] 2435.000
## [85,] 2370.000
## [86,] 2300.000
## [87,] 2255.000
## [88,] 2320.000
## [89,] 2405.000
## [90,] 2425.000
## [91,] 2370.000
## [92,] 2480.000
## [93,] 2825.000
## [94,] 2838.000
## [95,] 3175.000
## [96,] 3175.000
## [97,] 3288.000
## [98,] 3325.000
## [99,] 3125.000
## [100,] 3088.000
## [101,] 3238.000
## [102,] 3163.000
## [103,] 3138.000
## [104,] 2775.000
## [105,] 3150.000
## [106,] 3100.000
## [107,] 3000.000
## [108,] 2975.000
## [109,] 3000.000
## [110,] 3075.000
## [111,] 3075.000
## [112,] 3025.000
## [113,] 2838.000
## [114,] 3000.000
## [115,] 2975.000
## [116,] 2888.000
## [117,] 2850.000
## [118,] 2800.000
## [119,] 2763.000
## [120,] 2663.000
## [121,] 2600.000
## [122,] 2813.000
## [123,] 2838.000
## [124,] 2470.000
## [125,] 2380.000
## [126,] 2415.000
## [127,] 2320.000
## [128,] 2405.000
## [129,] 2538.000
## [130,] 2390.000
## [131,] 2563.000
## [132,] 2550.000
## [133,] 2713.000
## [134,] 2650.000
## [135,] 2725.000
## [136,] 2725.000
## [137,] 2650.000
## [138,] 2550.000
## [139,] 2675.000
## [140,] 3075.000
## [141,] 3375.000
## [142,] 3725.000
## [143,] 3500.000
## [144,] 3475.000
## [145,] 3450.000
## [146,] 3513.000
## [147,] 3438.000
## [148,] 3363.000
## [149,] 3388.000
## [150,] 3375.000
## [151,] 3363.000
## [152,] 3375.000
## [153,] 3375.000
## [154,] 3375.000
## [155,] 3375.000
## [156,] 3375.000
## [157,] 3375.000
## [158,] 3375.000
## [159,] 3375.000
## [160,] 3375.000
## [161,] 3375.000
## [162,] 3375.000
## [163,] 3375.000
##### Perbandingan Ukuran Akurasi Model #####
perbandingan.akurasi <- data.frame(
Model = c("Model Intervensi", "Model NN"),
MAPE = c(MAPE(Hasil_Intervensi[1:(length(Hasil_Intervensi)-12)], dataterakhir) * 100,
MAPE(Hasil_NN[1:(length(Hasil_NN)-12)], dataterakhir) * 100),
SMAPE = c(smape(dataterakhir, Hasil_Intervensi[1:(length(Hasil_Intervensi)-12)]) * 100,
smape(dataterakhir, Hasil_NN[1:(length(Hasil_NN)-12)]) * 100),
RMSE = c(RMSE(Hasil_Intervensi[1:(length(Hasil_Intervensi)-12)], dataterakhir),
RMSE(Hasil_NN[1:(length(Hasil_NN)-12)], dataterakhir)),
stringsAsFactors = FALSE
)
perbandingan.akurasi
## Model MAPE SMAPE RMSE
## 1 Model Intervensi 3.7856570 3.7424824 157.9902
## 2 Model NN 0.8826426 0.8791257 37.1754
Berdasarkan ukuran akurasi model terlihat bahwa nilai MAPE, SMAPE, dan RMSE terkecil ada pada model NN dengan 2 neuron pada hidden layer. Hal ini mengindikasikan bahwa model NN lebih baik daripada model intervensi dalam memprediksi dan meramalkan harga saham BBNI.
##### Grafik Perbandingan Data Aktual dan Data Peramalan #####
ts.plot(dataterakhir,col="black",type="o",main="Peramalan Harga Saham BBNI",xlab="Waktu",ylab="Harga", lwd=1, xlim = c(0, length(Hasil_Intervensi)))
lines(Hasil_Intervensi,col="green",type="o",lwd=1)
lines(Hasil_NN,col="blue",type="o",lwd=1)
legend('topright',legend=c("Aktual","Model Intervensi","Model NN"),col=c("black","green","blue"),lty=1, cex = 1.05)
Grafik peramalan harga saham BBNI dengan menggunakan model intervensi dan model NN menunjukkan bahwa kedua model memiliki pola data prediksi yang telah mengikuti pola data aktual. Hal ini berarti kedua model dapat digunakan untuk menangkap pola perubahan yang terjadi pada data aktual yang disebabkan pengaruh dari suatu peristiwa atau intervensi eksternal. Selain itu, pada model intervensi memiliki pola peramalan yang cenderung konstan. Sedangkan, pada model NN terlihat bahwa peramalan cenderung mengalami tren turun.
Berdasarkan hasil analisis pada data harga saham BBNI di Indonesia dari 3 Februari 2019 sampai dengan 26 Desember 2021 dengan menggunakan model intervensi dan model NN, dapat diketahui bahwa kedua model dapat mengikuti pola perubahan data aktual yang mengalami perubahan akibat dampak suatu peristiwa atau intervensi eksternal. Pada model intervensi diperoleh model intervensi ARIMA (0, 1, 0) dan model NN diperoleh model NN terbaik, yaitu model NN dengan 2 neuron pada hidden layer. Kedua model memiliki prediksi yang cenderung mengikuti pola data aktual serta nilai MAPE dan SMAPE yang cenderung kecil sehingga dapat dikatakan bahwa model sangat baik digunakan untuk memprediksi harga saham BBNI.
Kedua model memiliki nilai MAPE dan SMAPE yang kecil, akan tetapi
model NN dengan 2 neuron pada hidden layer lebih baik
dibandingkan model intervensi ARIMA (0, 1, 0). Hal ini terlihat dari
ukuran akurasi model, yaitu perbandingan.akurasi dimana
nilai MAPE, SMAPE, dan RMSE model NN lebih kecil daripada model
intervensi. Pada peramalan terlihat bahwa Hasil_Intervensi
cenderung konstan dan Hasil_NN cenderung mengalami tren
turun. Oleh sebab itu, dapat disimpulkan bahwa dalam prediksi dan
peramalan harga saham BBNI dapat menggunakan model intervensi dan model
NN karena dapat menangkap pola perubahan yang terjadi pada harga saham,
akan tetapi model NN cenderung lebih baik dikarenakan memiliki
error yang lebih kecil sehingga meningkatkan akurasi prediksi
dan peramalan harga saham BBNI.
Afrianto, R. B., Tjandrasa, H., Arieshanti, I., Informatika, T., & Informasi, F. T. (2013). PREDIKSI PERGERAKAN HARGA SAHAM Menggunakan Metode Back Propagation Neural Network. Simantec, 3(3).
Kusuma, W., Sumantri, F., & Zahra, S. A. (2022). Pengaruh Suku Bunga Deposito, Kurs dan Dividen Terhadap Harga Saham PT BNI (Persero) Tbk. Jurnal Online Program Studi Pendidikan Ekonomi, 7(3), 63–70.
Saputra, A. R., Wahyuningsih, S., & Siringoringo, M. (2021). Peramalan Jumlah Titik Panas Provinsi Kalimantan Timur Menggunakan Analisis Intervensi Fungsi Pulse. EKSPONENSIAL, 12(1). https://doi.org/10.30872/eksponensial.v12i1.766.
Siregar, R. A., & Riksakamora, E. (2016). PEMBANGUNAN APLIKASI BERBASIS WEB UNTUK PERAMALAN HARGA SAHAM DENGAN METODE MOVING AVERAGE, EXPONENTIAL SMOOTHING, DAN ARTIFICIAL NEURAL NETWORK. Jurnal Teknik ITS, 5(2). https://doi.org/10.12962/j23373539.v5i2.17070.
Wei, W. W. S. (2006). Time Series Analysis Univariate and Multivariate Methods (2nd Edition). Dalam New introduction to Multiple Time Series Analysis.
Yolanda, A., & Asfar, A. H. (2021). PERBANDINGAN HARGA SAHAM PT BANK NEGARA INDONESIA (PERSERO) TBK SEBELUM DAN SESUDAH PANDEMI COVID-19 DI INDONESIA. National Conference on Applied Business, Education, & Technology (NCABET), 1(1). https://doi.org/10.46306/ncabet.v1i1.18.