Library
library(quantmod)
## Loading required package: xts
## Loading required package: zoo
##
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
##
## as.Date, as.Date.numeric
## Loading required package: TTR
## Registered S3 method overwritten by 'quantmod':
## method from
## as.zoo.data.frame zoo
library(PortfolioAnalytics)
## Loading required package: foreach
## Loading required package: PerformanceAnalytics
##
## Attaching package: 'PerformanceAnalytics'
## The following object is masked from 'package:graphics':
##
## legend
## Registered S3 method overwritten by 'PortfolioAnalytics':
## method from
## print.constraint ROI
library(ROI)
## ROI: R Optimization Infrastructure
## Registered solver plugins: nlminb, symphony, quadprog.
## Default solver: auto.
##
## Attaching package: 'ROI'
## The following objects are masked from 'package:PortfolioAnalytics':
##
## is.constraint, objective
library(ROI.plugin.quadprog)
library(PerformanceAnalytics)
library(corrplot)
## corrplot 0.95 loaded
library(ggplot2)
library(CVXR)
##
## Attaching package: 'CVXR'
## The following objects are masked from 'package:ROI':
##
## constraints, objective, solution
## The following object is masked from 'package:PortfolioAnalytics':
##
## objective
## The following objects are masked from 'package:stats':
##
## power, sd, var
## The following objects are masked from 'package:base':
##
## diag, norm, outer
Memuat Data
# 4 Saham Pertambangan
saham_4 <- c("ADRO.JK", "PTBA.JK", "INCO.JK", "ANTM.JK")
getSymbols("ADRO.JK", src = "yahoo", from = "2026-01-01", to = "2026-03-31")
## [1] "ADRO.JK"
getSymbols("PTBA.JK", src = "yahoo", from = "2026-01-01", to = "2026-03-31")
## [1] "PTBA.JK"
getSymbols("INCO.JK", src = "yahoo", from = "2026-01-01", to = "2026-03-31")
## [1] "INCO.JK"
getSymbols("ANTM.JK", src = "yahoo", from = "2026-01-01", to = "2026-03-31")
## [1] "ANTM.JK"
# 3 Saham Pertambangan (subset)
saham_3 <- c("ADRO.JK", "PTBA.JK", "INCO.JK")
HARGA PENUTUPAN & RETURN HARIAN
# Gabungkan harga penutupan
harga_4 <- merge(Cl(ADRO.JK), Cl(PTBA.JK), Cl(INCO.JK), Cl(ANTM.JK))
colnames(harga_4) <- c("ADRO", "PTBA", "INCO", "ANTM")
harga_3 <- harga_4[, 1:3]
# Return harian (log return)
ret_4 <- na.omit(Return.calculate(harga_4, method = "log"))
ret_3 <- na.omit(Return.calculate(harga_3, method = "log"))
a. STATISTIKA DESKRIPTIF
cat("\n STATISTIKA DESKRIPTIF - PORTOFOLIO 3 SAHAM \n")
##
## STATISTIKA DESKRIPTIF - PORTOFOLIO 3 SAHAM
desc_3 <- data.frame(
Saham = colnames(ret_3),
Mean = round(colMeans(ret_3) * 100, 4),
Std.Dev = round(apply(ret_3, 2, sd) * 100, 4),
Min = round(apply(ret_3, 2, min) * 100, 4),
Max = round(apply(ret_3, 2, max) * 100, 4),
Skewness = round(apply(ret_3, 2, skewness), 4),
Kurtosis = round(apply(ret_3, 2, kurtosis), 4)
)
print(desc_3)
## Saham Mean Std.Dev Min Max Skewness Kurtosis
## ADRO ADRO 0.6874 2.6951 -4.2742 7.4874 0.4726 0.1004
## PTBA PTBA 0.5770 2.1208 -5.5570 8.2419 0.9328 3.5769
## INCO INCO -0.0726 4.7371 -10.6132 11.7289 0.1628 -0.1980
cat("\nSTATISTIKA DESKRIPTIF - PORTOFOLIO 4 SAHAM \n")
##
## STATISTIKA DESKRIPTIF - PORTOFOLIO 4 SAHAM
desc_4 <- data.frame(
Saham = colnames(ret_4),
Mean = round(colMeans(ret_4) * 100, 4),
Std.Dev = round(apply(ret_4, 2, sd) * 100, 4),
Min = round(apply(ret_4, 2, min) * 100, 4),
Max = round(apply(ret_4, 2, max) * 100, 4),
Skewness = round(apply(ret_4, 2, skewness), 4),
Kurtosis = round(apply(ret_4, 2, kurtosis), 4)
)
print(desc_4)
## Saham Mean Std.Dev Min Max Skewness Kurtosis
## ADRO ADRO 0.6874 2.6951 -4.2742 7.4874 0.4726 0.1004
## PTBA PTBA 0.5770 2.1208 -5.5570 8.2419 0.9328 3.5769
## INCO INCO -0.0726 4.7371 -10.6132 11.7289 0.1628 -0.1980
## ANTM ANTM 0.1632 4.3943 -9.9833 10.9699 -0.0383 0.1966
b. RETURN & RISIKO - BOBOT SAMA (Equal Weight)
modal <- 120000000 # Rp 120.000.000
# Bobot sama
w3 <- rep(1/3, 3)
w4 <- rep(1/4, 4)
# Return portofolio harian
ret_porto3_eq <- as.numeric(ret_3 %*% w3)
ret_porto4_eq <- as.numeric(ret_4 %*% w4)
# Return & Risiko Bulanan (Jan-Mar 2026 = ~3 bulan = 63 hari kerja)
cat("\n====== BOBOT SAMA - PORTOFOLIO 3 SAHAM ======\n")
##
## ====== BOBOT SAMA - PORTOFOLIO 3 SAHAM ======
mu3 <- colMeans(ret_3)
cov3 <- cov(ret_3)
rp3_eq <- sum(w3 * mu3) # return harian
risk3_eq <- sqrt(t(w3) %*% cov3 %*% w3) # risiko harian
cat("Return Harian Portofolio :", round(rp3_eq * 100, 4), "%\n")
## Return Harian Portofolio : 0.3973 %
cat("Risiko Harian Portofolio :", round(risk3_eq * 100, 4), "%\n")
## Risiko Harian Portofolio : 2.4201 %
cat("Return Bulanan (x22) :", round(rp3_eq * 22 * 100, 4), "%\n")
## Return Bulanan (x22) : 8.7406 %
cat("Risiko Bulanan (x sqrt22) :", round(risk3_eq * sqrt(22) * 100, 4), "%\n")
## Risiko Bulanan (x sqrt22) : 11.3511 %
cat("\n====== BOBOT SAMA - PORTOFOLIO 4 SAHAM ======\n")
##
## ====== BOBOT SAMA - PORTOFOLIO 4 SAHAM ======
mu4 <- colMeans(ret_4)
cov4 <- cov(ret_4)
rp4_eq <- sum(w4 * mu4)
risk4_eq <- sqrt(t(w4) %*% cov4 %*% w4)
cat("Return Harian Portofolio :", round(rp4_eq * 100, 4), "%\n")
## Return Harian Portofolio : 0.3388 %
cat("Risiko Harian Portofolio :", round(risk4_eq * 100, 4), "%\n")
## Risiko Harian Portofolio : 2.6132 %
cat("Return Bulanan (x22) :", round(rp4_eq * 22 * 100, 4), "%\n")
## Return Bulanan (x22) : 7.453 %
cat("Risiko Bulanan (x sqrt22) :", round(risk4_eq * sqrt(22) * 100, 4), "%\n")
## Risiko Bulanan (x sqrt22) : 12.2568 %
c. METODE MEAN-VARIANCE (MV) - MINIMUM VARIANCE
# --- Portofolio 3 Saham ---
port3 <- portfolio.spec(assets = colnames(ret_3))
port3 <- add.constraint(port3, type = "full_investment") # sum bobot = 1
port3 <- add.constraint(port3, type = "long_only") # bobot >= 0
port3 <- add.objective(port3, type = "risk", name = "var") # minimasi variansi
opt3 <- optimize.portfolio(ret_3, port3, optimize_method = "ROI")
cat("\nMETODE MV - PORTOFOLIO 3 SAHAM \n")
##
## METODE MV - PORTOFOLIO 3 SAHAM
w3_mv <- opt3$weights
rp3_mv <- sum(w3_mv * mu3)
risk3_mv <- sqrt(t(w3_mv) %*% cov3 %*% w3_mv)
cat("Bobot Optimal:\n"); print(round(w3_mv, 4))
## Bobot Optimal:
## ADRO PTBA INCO
## 0.1342 0.7516 0.1141
cat("Return Harian :", round(rp3_mv * 100, 4), "%\n")
## Return Harian : 0.5177 %
cat("Risiko Harian :", round(risk3_mv * 100, 4), "%\n")
## Risiko Harian : 1.969 %
cat("Return Bulanan:", round(rp3_mv * 22 * 100, 4), "%\n")
## Return Bulanan: 11.3897 %
cat("Risiko Bulanan:", round(risk3_mv * sqrt(22) * 100, 4), "%\n")
## Risiko Bulanan: 9.2356 %
# --- Portofolio 4 Saham ---
port4 <- portfolio.spec(assets = colnames(ret_4))
port4 <- add.constraint(port4, type = "full_investment")
port4 <- add.constraint(port4, type = "long_only")
port4 <- add.objective(port4, type = "risk", name = "var")
opt4 <- optimize.portfolio(ret_4, port4, optimize_method = "ROI")
cat("\nMETODE MV - PORTOFOLIO 4 SAHAM \n")
##
## METODE MV - PORTOFOLIO 4 SAHAM
w4_mv <- opt4$weights
rp4_mv <- sum(w4_mv * mu4)
risk4_mv <- sqrt(t(w4_mv) %*% cov4 %*% w4_mv)
cat("Bobot Optimal:\n"); print(round(w4_mv, 4))
## Bobot Optimal:
## ADRO PTBA INCO ANTM
## 0.1054 0.7448 0.0825 0.0673
cat("Return Harian :", round(rp4_mv * 100, 4), "%\n")
## Return Harian : 0.5072 %
cat("Risiko Harian :", round(risk4_mv * 100, 4), "%\n")
## Risiko Harian : 1.9551 %
cat("Return Bulanan:", round(rp4_mv * 22 * 100, 4), "%\n")
## Return Bulanan: 11.159 %
cat("Risiko Bulanan:", round(risk4_mv * sqrt(22) * 100, 4), "%\n")
## Risiko Bulanan: 9.1703 %
d. VALUE AT RISK (VaR)
alpha <- 0.05 # tingkat kepercayaan 95%
# Return portofolio harian dengan bobot MV
ret_porto3_mv <- as.numeric(ret_3 %*% w3_mv)
ret_porto4_mv <- as.numeric(ret_4 %*% w4_mv)
# VaR Historis
VaR3_eq_hist <- quantile(ret_porto3_eq, alpha)
VaR4_eq_hist <- quantile(ret_porto4_eq, alpha)
VaR3_mv_hist <- quantile(ret_porto3_mv, alpha)
VaR4_mv_hist <- quantile(ret_porto4_mv, alpha)
# VaR Parametrik (Normal)
VaR3_eq_par <- rp3_eq - qnorm(1-alpha) * as.numeric(risk3_eq)
VaR4_eq_par <- rp4_eq - qnorm(1-alpha) * as.numeric(risk4_eq)
VaR3_mv_par <- rp3_mv - qnorm(1-alpha) * as.numeric(risk3_mv)
VaR4_mv_par <- rp4_mv - qnorm(1-alpha) * as.numeric(risk4_mv)
cat("\nVALUE AT RISK (VaR) pada alpha = 5% \n")
##
## VALUE AT RISK (VaR) pada alpha = 5%
cat("-- Portofolio 3 Saham (Bobot Sama) --\n")
## -- Portofolio 3 Saham (Bobot Sama) --
cat(" VaR Historis :", round(VaR3_eq_hist * 100, 4), "% = Rp", round(abs(VaR3_eq_hist) * modal), "\n")
## VaR Historis : -2.6883 % = Rp 3225948
cat(" VaR Parametrik :", round(VaR3_eq_par * 100, 4), "% = Rp", round(abs(VaR3_eq_par) * modal), "\n")
## VaR Parametrik : -3.5833 % = Rp 4300011
cat("-- Portofolio 4 Saham (Bobot Sama) --\n")
## -- Portofolio 4 Saham (Bobot Sama) --
cat(" VaR Historis :", round(VaR4_eq_hist * 100, 4), "% = Rp", round(abs(VaR4_eq_hist) * modal), "\n")
## VaR Historis : -4.2326 % = Rp 5079080
cat(" VaR Parametrik :", round(VaR4_eq_par * 100, 4), "% = Rp", round(abs(VaR4_eq_par) * modal), "\n")
## VaR Parametrik : -3.9595 % = Rp 4751385
cat("-- Portofolio 3 Saham (MV) --\n")
## -- Portofolio 3 Saham (MV) --
cat(" VaR Historis :", round(VaR3_mv_hist * 100, 4), "% = Rp", round(abs(VaR3_mv_hist) * modal), "\n")
## VaR Historis : -1.823 % = Rp 2187632
cat(" VaR Parametrik :", round(VaR3_mv_par * 100, 4), "% = Rp", round(abs(VaR3_mv_par) * modal), "\n")
## VaR Parametrik : -2.7211 % = Rp 3265297
cat("-- Portofolio 4 Saham (MV) --\n")
## -- Portofolio 4 Saham (MV) --
cat(" VaR Historis :", round(VaR4_mv_hist * 100, 4), "% = Rp", round(abs(VaR4_mv_hist) * modal), "\n")
## VaR Historis : -2.0069 % = Rp 2408244
cat(" VaR Parametrik :", round(VaR4_mv_par * 100, 4), "% = Rp", round(abs(VaR4_mv_par) * modal), "\n")
## VaR Parametrik : -2.7086 % = Rp 3250379