knitr::opts_chunk$set(echo = TRUE)

Install library

library(tseries)
## Warning: package 'tseries' was built under R version 4.3.3
## Registered S3 method overwritten by 'quantmod':
##   method            from
##   as.zoo.data.frame zoo

Akses data saham

Karena data mengandung missing value, perlu dibersihkan terlebih dahulu

price <- get.hist.quote(
  instrument = "KLBF.JK",
  start = "2024-09-15",
  end = "2025-09-15",
  quote = "Close",
  provider = "yahoo",
  compression = "d"
)
## Warning: KLBF.JK contains missing values. Some functions will not work if
## objects contain missing values in the middle of the series. Consider using
## na.omit(), na.approx(), na.fill(), etc to remove or replace them.
## time series starts 2024-09-17
## time series ends   2025-09-12
price_clean <- na.omit(price)

Data Saham KLBF 15/09/24 s.d. 15/09/25

head(price_clean)
##            Close
## 2024-09-17  1705
## 2024-09-18  1750
## 2024-09-19  1730
## 2024-09-20  1720
## 2024-09-23  1735
## 2024-09-24  1745
plot(price_clean)

Menghitung Return saham

returns <- diff(log(price_clean))
head(returns)
##                   Close
## 2024-09-18  0.026050677
## 2024-09-19 -0.011494379
## 2024-09-20 -0.005797118
## 2024-09-23  0.008683123
## 2024-09-24  0.005747142
## 2024-09-25 -0.002869442

Cek distribusi return secara visual

hist(returns)

qqnorm(returns)
qqline(returns, col="red")

Cek distribusi return secara formal

H0 : Return berdistribusi normal

H1 : Return tidak berdistribusi normal

jb <- jarque.bera.test(returns)
pval <- jb$p.value
if (pval < 0.05) {
  keputusan <- paste0("p-value = ", round(pval,4),
                      " < 0.05 → Tolak H0 (return tidak berdistribusi normal).")
} else {
  keputusan <- paste0("p-value = ", round(pval,4),
                      " ≥ 0.05 → Gagal tolak H0 (return berdistribusi normal).")
}

keputusan
## [1] "p-value = 0.2645 ≥ 0.05 → Gagal tolak H0 (return berdistribusi normal)."

Menghitung VaR dengan varian covarian

invest <- 1000000

varcov_var <- function(returns, confidence_level, hp){
  var <- mean(returns) + qnorm(confidence_level) * sd(returns)
  var * sqrt(hp)
}

varcov_var(returns, 0.05, 1)
## [1] -0.04460749

Menghitung kerugian maksimum

kerugian_maksimum_1 <- varcov_var(returns, 0.05, 1) * invest
kerugian_maksimum_5 <- varcov_var(returns, 0.05, 5) * invest
kerugian_maksimum_20 <- varcov_var(returns, 0.05, 20) * invest
kerugian_maksimum_234 <- varcov_var(returns, 0.05, 234) * invest

kerugian_hari <- paste0("Kerugian maksimum dalam waktu 1 hari adalah Rp",format(abs(kerugian_maksimum_1), big.mark=".", decimal.mark=",", scientific=FALSE))
kerugian_minggu <- paste0("Kerugian maksimum dalam waktu 1 minggu adalah Rp",format(abs(kerugian_maksimum_5), big.mark=".", decimal.mark=",", scientific=FALSE))
kerugian_bulan <- paste0("Kerugian maksimum dalam waktu 1 bulan adalah Rp",format(abs(kerugian_maksimum_20), big.mark=".", decimal.mark=",", scientific=FALSE))
kerugian_tahun <- paste0("Kerugian maksimum dalam waktu 1 tahun adalah Rp",format(abs(kerugian_maksimum_234), big.mark=".", decimal.mark=",", scientific=FALSE))

kerugian_hari
## [1] "Kerugian maksimum dalam waktu 1 hari adalah Rp44.607,49"
kerugian_minggu
## [1] "Kerugian maksimum dalam waktu 1 minggu adalah Rp99.745,38"
kerugian_bulan
## [1] "Kerugian maksimum dalam waktu 1 bulan adalah Rp199.490,8"
kerugian_tahun
## [1] "Kerugian maksimum dalam waktu 1 tahun adalah Rp682.363,4"