Pendahuluan

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 AverageExponential 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.

Analisis Intervensi dan Neural Network dengan R

Import Library

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)

Import Dataset dan Pembagian Data

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 Runtun Waktu

##### 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.

Model ARIMA Sebelum Intervensi Menggunakan Data In Sample

Pembagian Data Sebelum Intervensi

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)

Kestasioneran Data Sebelum Intervensi

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 Model ARIMA Sebelum Intervensi

##### 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).

Model ARIMA (0, 1, 0) Sebelum Intervensi

##### 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 (0, 1, 0)

##### 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.

Prediksi dan Peramalan Model ARIMA (0, 1, 0) Sebelum Intervensi

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))

Model Intervensi ARIMA (0, 1, 0) Menggunakan Data In Sample

Identifikasi Orde Model Intervensi ARIMA (0, 1, 0)

##### 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\).

Model Intervensi ARIMA (0, 1, 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 (0, 1, 0)

##### 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)

##### 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.

Model Neural Network Menggunakan Data In Sample

Standarisasi Data In Sample

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

Penentuan Input dan Output

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)

Model NN dengan 1 Neuron pada Hidden Layer

##### Model 1 Neuron pada Hidden Layer #####
set.seed(1000)
nn1=neuralnet(Y~X,data=Data,hidden=1,act.fct="tanh",threshold=0.05,
              algorithm="rprop+",stepmax=10000,startweights=NULL,
              learningrate=0.01,linear.output=T)
plot(nn1,cex=1)
knitr::include_graphics("nn1.png") # Alternatif untuk memanggil plot NN

Predict1<-ts(nn1$net.result[[1]])

Model NN dengan 2 Neuron pada Hidden Layer

##### Model 2 Neuron pada Hidden Layer #####
set.seed(1000)
nn2=neuralnet(Y~X,data=Data,hidden=2,act.fct="tanh",threshold=0.05,
              algorithm="rprop+",stepmax=10000,startweights=NULL,
              learningrate=0.01,linear.output=T)
plot(nn2,cex=1)
knitr::include_graphics("nn2.png")

Predict2=ts(nn2$net.result[[1]])

Model NN dengan 3 Neuron pada Hidden Layer

##### Model 3 Neuron pada Hidden Layer #####
set.seed(1000)
nn3=neuralnet(Y~X,data=Data,hidden=3,act.fct="tanh",threshold=0.05,
              algorithm="rprop+",stepmax=10000,startweights=NULL,
              learningrate=0.01,linear.output=T)
plot(nn3,cex=1)
knitr::include_graphics("nn3.png")

Predict3<-ts(nn3$net.result[[1]])

Pemilihan Model NN pada Data In Sample

##### 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.

Prediksi Model NN dengan 2 Neuron pada Hidden Layer

##### Grafik Perbandingan Data In Sample dan Data Prediksi #####
ts.plot(dataterakhir_in[1:length(dataterakhir_in)-1],col="black",type="o",main="Perbandingan Data In Sample dan Data Prediksi Model NN",xlab="Waktu",ylab="Harga", lwd=1, xlim = c(0, length(dataterakhir_in)))
lines(Prediksi2,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 NN dengan 2 neuron menunjukkan bahwa pola data prediksi dapat mengikuti pola data in sample yang berarti model dapat mengikuti perubahan pola yang terjadi pada data aktual. Selain itu, dapat diketahui bahwa model NN dengan 2 neuron untuk data in sample memiliki MAPE sebesar 4,0216 dan SMAPE sebesar 3,9350 yang berarti bahwa model sangat baik digunakan untuk memprediksi pola data dari harga saham BBNI.

Peramalan Harga Saham BBNI dengan Model Intervensi dan Model NN

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)

##### 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

Peramalan Model NN dengan 2 Neuron pada Hidden Layer

##### Peramalan Model NN dengan 2 Neuron pada Hidden Layer #####
max<-max(dataterakhir)
min<-min(dataterakhir)
newmax<-0.9
newmin<-(-0.9)
YtSaham<-(((dataterakhir-min)/(max-min))*(newmax-newmin))+newmin

XSaham<-YtSaham[1:length(dataterakhir)-1]
YSaham<-YtSaham[2:length(dataterakhir)]
DataSaham<-cbind(YSaham,XSaham)

set.seed(1000)
nnSaham=neuralnet(YSaham~XSaham,data=DataSaham,hidden=2,act.fct="tanh",threshold=0.05,
              algorithm="rprop+",stepmax=10000,startweights=NULL,
              learningrate=0.01,linear.output=T)
plot(nnSaham,cex=1)
knitr::include_graphics("nnSaham.png")

PredictSaham<-ts(nnSaham$net.result[[1]])
PrediksiSaham<-(((PredictSaham-newmin)/(newmax-newmin))*(max-min))+min

Ytest=c(YSaham,rep(0,13))
k=13
for (i in (length(dataterakhir)+1):(length(dataterakhir)+k)){ 
  Xtest=t(matrix(c(Ytest[i-1]),byrow=FALSE))
  Ytest[i]=compute(nnSaham,covariate=Xtest)$net.result
}
Ytest=ts(Ytest[(length(dataterakhir)+1):(length(dataterakhir)+k)])

PeramalanNN<-(((Ytest-newmin)/(newmax-newmin))*(max-min))+min
Hasil_NN<-ts(c(PrediksiSaham, PeramalanNN))
as.matrix(Hasil_NN, ncol = 1)
##            [,1]
##   [1,] 4470.598
##   [2,] 4384.505
##   [3,] 4361.974
##   [4,] 4470.598
##   [5,] 4339.064
##   [6,] 4500.733
##   [7,] 4693.851
##   [8,] 4629.964
##   [9,] 4701.633
##  [10,] 4708.712
##  [11,] 4763.876
##  [12,] 4708.712
##  [13,] 4577.300
##  [14,] 4303.546
##  [15,] 4053.041
##  [16,] 4327.005
##  [17,] 4206.449
##  [18,] 4255.615
##  [19,] 4417.128
##  [20,] 4558.835
##  [21,] 4558.835
##  [22,] 4558.835
##  [23,] 4438.666
##  [24,] 4219.343
##  [25,] 4053.041
##  [26,] 3961.254
##  [27,] 3961.254
##  [28,] 3800.993
##  [29,] 3840.602
##  [30,] 3787.082
##  [31,] 3920.791
##  [32,] 3813.838
##  [33,] 3694.229
##  [34,] 3407.144
##  [35,] 3458.402
##  [36,] 3720.852
##  [37,] 3907.983
##  [38,] 3827.755
##  [39,] 3827.755
##  [40,] 3707.001
##  [41,] 3813.838
##  [42,] 3733.651
##  [43,] 3774.246
##  [44,] 3813.838
##  [45,] 3894.096
##  [46,] 3961.254
##  [47,] 3894.096
##  [48,] 3854.518
##  [49,] 3881.267
##  [50,] 3840.602
##  [51,] 3574.817
##  [52,] 3653.887
##  [53,] 3747.528
##  [54,] 3881.267
##  [55,] 3484.199
##  [56,] 3169.122
##  [57,] 2598.409
##  [58,] 1906.005
##  [59,] 2053.171
##  [60,] 2061.772
##  [61,] 2053.171
##  [62,] 2126.863
##  [63,] 1972.458
##  [64,] 2100.706
##  [65,] 1972.458
##  [66,] 1785.633
##  [67,] 1889.626
##  [68,] 1985.077
##  [69,] 2166.379
##  [70,] 2264.253
##  [71,] 2268.740
##  [72,] 2313.786
##  [73,] 2304.753
##  [74,] 2354.570
##  [75,] 2354.570
##  [76,] 2327.356
##  [77,] 2322.830
##  [78,] 2331.885
##  [79,] 2505.757
##  [80,] 2528.856
##  [81,] 2621.673
##  [82,] 2610.501
##  [83,] 2445.920
##  [84,] 2386.436
##  [85,] 2322.830
##  [86,] 2282.223
##  [87,] 2340.951
##  [88,] 2418.419
##  [89,] 2436.745
##  [90,] 2386.436
##  [91,] 2487.311
##  [92,] 2809.158
##  [93,] 2821.431
##  [94,] 3144.639
##  [95,] 3144.639
##  [96,] 3256.038
##  [97,] 3292.949
##  [98,] 3095.925
##  [99,] 3060.079
## [100,] 3206.509
## [101,] 3132.918
## [102,] 3108.560
## [103,] 2762.057
## [104,] 3120.241
## [105,] 3071.687
## [106,] 2975.432
## [107,] 2951.524
## [108,] 2975.432
## [109,] 3047.522
## [110,] 3047.522
## [111,] 2999.398
## [112,] 2821.431
## [113,] 2975.432
## [114,] 2951.524
## [115,] 2868.744
## [116,] 2832.770
## [117,] 2785.587
## [118,] 2750.776
## [119,] 2657.109
## [120,] 2598.409
## [121,] 2797.839
## [122,] 2821.431
## [123,] 2478.099
## [124,] 2395.563
## [125,] 2427.578
## [126,] 2340.951
## [127,] 2418.419
## [128,] 2540.885
## [129,] 2404.698
## [130,] 2564.049
## [131,] 2551.999
## [132,] 2703.867
## [133,] 2644.976
## [134,] 2715.112
## [135,] 2715.112
## [136,] 2644.976
## [137,] 2551.999
## [138,] 2668.317
## [139,] 3047.522
## [140,] 3343.200
## [141,] 3707.001
## [142,] 3470.771
## [143,] 3445.032
## [144,] 3419.405
## [145,] 3484.199
## [146,] 3407.144
## [147,] 3331.100
## [148,] 3356.336
## [149,] 3343.200
## [150,] 3331.100
## [151,] 3265.493
## [152,] 3233.694
## [153,] 3202.262
## [154,] 3171.342
## [155,] 3141.064
## [156,] 3111.541
## [157,] 3082.866
## [158,] 3055.118
## [159,] 3028.354
## [160,] 3002.618
## [161,] 2977.938
## [162,] 2954.331
## [163,] 2931.802

Perbandingan Ukuran Akurasi Model

##### 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 Peramalan 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.

Kesimpulan

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.

Daftar Pustaka

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.