Menggunakan Library quantmod yang terhubung ke yahoo
finance, Kita akan melakukan analisis terhadap 5 emiten saham di
Indonesia. Yaitu: 1. Adaro Energy Tbk. (ADRO) di bidang Energy
2. Barito Pacific Tbk. (BRPT) di bidang Energy 3. Indofood
CBP Sukses Makmur Tbk. (ICBP) di bidang Produksi Pangan 4. PT.
Saratoga Investama Sedaya (SRTG) di bidang Investasi 5. Sumber
Alfaria Trijaya Tbk (AMRT) di bidang Perdagangan, Jasa dan Investasi
ADRO Average Daily Returns: -3.665193e-05
BRPT Average Daily Returns: 0.001058828
ICBP Average Daily Returns: 0.0009467992
SRTG Average Daily Returns: -0.001548596
AMRT Average Daily Returns: 0.001415377
Portfolio Returns: 7.853956
Portfolio Volatility: 0.3421226
If a portfolio has a return of 7.85%, it means that over a specific period (in this case 2 years), the value of the portfolio has increased by 7.85% compared to its initial value. With the standard Deviation of 0.34%. Which brings us to the growth interval of 7.5 - 8.2%.
Diversification Ratio: 0.3592792
[,1]
[1,] 0.02117186
Dengan nilai 2% artinya, hanya sekitar 2% daripada total aset portofolio kita yang dipertaruhkan, apakah akan hilang atau bertambah.
Menggunakan Copula Didapatkan Juga Bahwa VAR sekitar -2.2%
---
title: "Indonesia Stocks Analysis Dashboards"
output:
flexdashboard::flex_dashboard:
vertical_layout: scroll
theme: united
source_code: embed
---
```{r setup, include=FALSE}
# Library Import
library(flexdashboard)
library(tidyverse)
library(highcharter)
library(gt)
library(htmltools)
library(viridis)
library(DT)
library(tidyquant)
library(plotly)
library(timetk)
library(lubridate)
library(zoo)
library(tidyr)
```
Menggunakan Library `quantmod` yang terhubung ke yahoo finance, Kita akan melakukan analisis terhadap 5 emiten saham di Indonesia. Yaitu: </br>
1. Adaro Energy Tbk. (ADRO) di bidang Energy </br>
2. Barito Pacific Tbk. (BRPT) di bidang Energy </br>
3. Indofood CBP Sukses Makmur Tbk. (ICBP) di bidang Produksi Pangan</br>
4. PT. Saratoga Investama Sedaya (SRTG) di bidang Investasi </br>
5. Sumber Alfaria Trijaya Tbk (AMRT) di bidang Perdagangan, Jasa dan Investasi
```{r, include = FALSE}
library(quantmod)
library(plotly)
library(PerformanceAnalytics)
tick = c('ADRO.JK', 'BRPT.JK', 'ICBP.JK','SRTG.JK', 'AMRT.JK')
ticklabel = c("Adaro Energy Tbk.", "Barito Pacific Renewable Energy", "Indofood CBP Sukses Makmur Tbk.", " PT. Saratoga Investama Sedaya ", "Sumber Alfaria Trijaya Tbk.")
stocksss = getSymbols(tick, from="2022-05-01", to="2024-05-01", src="yahoo", adjust=F)
stocksss
```
Visualisasi Harga Saham {data-orientation=columns}
=======================================================================
## Candlestick Chart {.tabset .tabset-fade data-height=1080}
-----------------------------------------------------------------------
### Adaro Energy Tbk. {data-width=1920}
```{r}
priceadaro = tq_get('ADRO.JK',
from='2022-05-01' ,
to="2024-05-01",
get='stock.prices')
priceadaro %>% plot_ly(x=~date,
type = 'candlestick',
open = ~open,
close = ~close,
high = ~high,
low = ~low) %>%
layout(title = "Chart Harga Saham per lembar Adaro Energy Tbk. Sejak Mei 2022", xaxis = list(rangeslider = list(visible= F)))
```
### Barito Pacific Tbk. {data-width=1920}
```{r}
pricebayan = tq_get('BRPT.JK',
from='2022-05-01' ,
to="2024-05-01",
get='stock.prices')
pricebayan %>% plot_ly(x=~date,
type = 'candlestick',
open = ~open,
close = ~close,
high = ~high,
low = ~low) %>%
layout(title = "Chart Harga Saham per lembar Barito Pacific Tbk. Sejak Mei 2022", xaxis = list(rangeslider = list(visible= F)))
```
### Indofood CBP Sukses Makmur Tbk. {data-width=1920}
```{r}
priceICBP = tq_get('ICBP.JK',
from='2022-05-01' ,
to="2024-05-01",
get='stock.prices')
priceICBP %>% plot_ly(x=~date,
type = 'candlestick',
open = ~open,
close = ~close,
high = ~high,
low = ~low) %>%
layout(title = "Chart Harga Saham per lembar Indofood CBP Sukses Makmur Tbk. Sejak Mei 2022", xaxis = list(rangeslider = list(visible= F)))
```
### PT Saratoga Investama Sedaya Tbk. {data-width=1920}
```{r}
priceSRTG = tq_get('SRTG.JK',
from='2022-05-01' ,
to="2024-05-01",
get='stock.prices')
priceSRTG %>% plot_ly(x=~date,
type = 'candlestick',
open = ~open,
close = ~close,
high = ~high,
low = ~low) %>%
layout(title = "Chart Harga Saham per lembar Sarataga Investama Sedaya Tbk. Sejak Mei 2022", xaxis = list(rangeslider = list(visible= F)))
```
### Sumber Alfaria Trijaya Tbk {data-width=1920}
```{r}
priceAMRT = tq_get('AMRT.JK',
from='2022-05-01' ,
to="2024-05-01",
get='stock.prices')
priceAMRT %>% plot_ly(x=~date,
type = 'candlestick',
open = ~open,
close = ~close,
high = ~high,
low = ~low) %>%
layout(title = "Chart Harga Saham per lembar Alfaria Trijaya Tbk. Sejak Mei 2022", xaxis = list(rangeslider = list(visible= F)))
```
Visualisasi daily Return {data-orientation=columns}
=======================================================================
## Daily Return {.tabset .tabset-fade data-height=1000}
-----------------------------------------------------------------------
```{r, include=FALSE}
## Calculate daily returns and Combine (B&C)
closing = NULL
for (stock in tick) { closing = cbind(closing, Cl(get(stock)))}
return = Return.calculate(closing)
return = data.frame(return)
head (return)
```
### ADRO Return Plot
```{r}
plot_ly(x = priceadaro$date, y = ~as.numeric(return$ADRO.JK.Close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Return'))
```
#### ADARO Average Returns
```{r}
cat("ADRO Average Daily Returns:", mean(na.omit(return$ADRO.JK.Close)), "\n")
```
### BRPT Return Plot
```{r}
plot_ly(x = pricebayan$date, y = ~as.numeric(return$BRPT.JK.Close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Return'))
```
```{r}
cat("BRPT Average Daily Returns:", mean(na.omit(return$BRPT.JK.Close)), "\n")
```
### ICBP Retrun Plot
```{r}
plot_ly(x = priceICBP$date, y = ~as.numeric(return$ICBP.JK.Close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Return'))
```
```{r}
cat("ICBP Average Daily Returns:", mean(na.omit(return$ICBP.JK.Close)), "\n")
```
### Daily Return of Saratgo
```{r}
plot_ly(x = priceSRTG$date, y = ~as.numeric(return$SRTG.JK.Close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Return'))
```
```{r}
cat("SRTG Average Daily Returns:", mean(na.omit(return$SRTG.JK.Close)), "\n")
```
### Daily Return of AMRT
```{r}
plot_ly(x = priceAMRT$date, y = ~as.numeric(return$AMRT.JK.Close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Return'))
```
```{r}
cat("AMRT Average Daily Returns:", mean(na.omit(return$AMRT.JK.Close)), "\n")
```
Correlation Heatmap {data-orientation=columns}
=======================================================================
## Correlation Analysis {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
```{r}
return = na.omit(return)
corstock = cor(na.omit(return))
mask = matrix(F, nrow=nrow(corstock), ncol=ncol(corstock))
mask[lower.tri(mask)] = T
heatmap = plot_ly(z=corstock, x=ticklabel, y=ticklabel, type="heatmap")
heatmap = heatmap %>%
layout(title = "Correlation Heatmap of Indonesian Stocks Return Price",
xaxis = list(title=""),
yaxis=list(title=""),
colorscale= "Inferno",
margin = list(l=60, r=80, t=100, b=60))
heatmap
```
Portofolio Return and Volatility {data-orientation=columns}
=======================================================================
## Portofolio Return {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
```{r}
num_stocks <- length(closing)
weights <- rep(1/num_stocks, num_stocks)
portfolio_returns <- rowSums(closing * weights)
portfolio_sd <- sqrt(var(portfolio_returns))
cat("Portfolio Returns:", mean(portfolio_returns), "\n")
cat("Portfolio Volatility:", portfolio_sd, "\n")
```
If a portfolio has a return of 7.85%, it means that over a specific period (in this case 2 years), the value of the portfolio has increased by 7.85% compared to its initial value. With the standard Deviation of 0.34%. Which brings us to the growth interval of 7.5 - 8.2%.
Diversification Ratio {data-orientation=columns}
=======================================================================
## Diversification Ratio {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
### Diversification Ratio for Each Stocks
```{r}
return = na.omit(return)
column_mean = apply(return, 2, mean, na.rm=T)
column_sd <- apply(return, 2, sd, na.rm = TRUE)
column_sd = as.data.frame(column_sd)
fig <- plot_ly(x = tick, y = column_sd$column_sd, type = 'bar',
marker = list(color = 'rgb(158,202,225)',
line = list(color = 'rgb(8,48,107)',
width = 1.5)))
fig <- fig %>% layout(title = "Diversification ratio",
xaxis = list(title = ""),
yaxis = list(title = ""))
fig
```
### Diversification Joint Ratio
```{r}
calculate_diversification_ratio <- function(portfolio_sd, column_sd) {
weighted_avg_individual_sd <- sum(column_sd) / length(column_sd)
# Calculate diversification ratio
diversification_ratio <- weighted_avg_individual_sd / portfolio_sd
return(diversification_ratio)
}
diversification_ratio <- calculate_diversification_ratio(portfolio_sd, column_sd)
cat("Diversification Ratio:", diversification_ratio, "\n")
```
Optimal Weights {data-orientation=columns}
=======================================================================
## Optimal Weights for Each Stocks {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
### Optimal Distribution
```{r}
library(quadprog)
# Example data (replace with your actual data)
expected_returns <- c(7.854, 7.854, 7.854, 7.854, 7.854 ) # Expected returns for assets
cov_matrix <- matrix(corstock, nrow=5) # Covariance matrix
library(Matrix)
pd_D_mat <- nearPD(cov_matrix)
# Use the positive definite matrix for optimization
D_mat <- as.matrix(pd_D_mat$mat)
d_vec <- rep(0, length(expected_returns))
A_mat <- cbind(rep(1, length(expected_returns)), diag(length(expected_returns)))
b_vec <- c(1, d_vec)
# Solve quadratic programming problem
library(quadprog)
output <- solve.QP(Dmat = D_mat, dvec = d_vec, Amat = A_mat, bvec = b_vec, meq = 1)
# Optimal portfolio weights
optimal_weights <- output$solution
pie <- plot_ly(labels = ticklabel, values = optimal_weights, type = "pie")
pie <- pie %>% layout(title = "Optimized Portfolio Weight", xaxis = list(title = ""), yaxis = list(title = ""))
pie
```
Stock Forecasting {data-orientation=columns}
=======================================================================
## Stocks Forecasting using ARIMA {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
### Adaro Energy Tbk.
```{r}
library(tseries)
library(forecast)
arimaadaro = auto.arima(priceadaro$close)
fcadaro = forecast(arimaadaro)
start = ymd("2024-05-02")
end = ymd("2024-05-11")
fdate = seq(start, end, by = "day")
plot_time_series <- plot_ly(x = as.Date(priceadaro$date), y = ~as.numeric(priceadaro$close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace( x = as.Date(fdate),y = fcadaro$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Stock Price'))
plot_time_series
```
### Barito Pacific Energy Tbk.
```{r}
library(tseries)
library(forecast)
arimabayan = auto.arima(pricebayan$close)
fcbayan = forecast(arimabayan)
start = ymd("2024-05-02")
end = ymd("2024-05-11")
fdate = seq(start, end, by = "day")
plot_time_series <- plot_ly(x = as.Date(pricebayan$date), y = ~as.numeric(pricebayan$close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace( x = as.Date(fdate),y = fcbayan$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Stock Price'))
plot_time_series
```
### Indofood CBP Sukses Makmur
```{r}
library(tseries)
library(forecast)
arimaicbp = auto.arima(priceICBP$close)
fcicbp = forecast(arimaicbp)
start = ymd("2024-05-02")
end = ymd("2024-05-11")
fdate = seq(start, end, by = "day")
plot_time_series <- plot_ly(x = as.Date(priceICBP$date), y = ~as.numeric(priceICBP$close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace( x = as.Date(fdate),y = fcicbp$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Stock Price'))
plot_time_series
```
### Saratoga Investama
```{r}
library(tseries)
library(forecast)
arimasrtg = auto.arima(priceSRTG$close)
fcsrtg = forecast(arimasrtg)
start = ymd("2024-05-02")
end = ymd("2024-05-11")
fdate = seq(start, end, by = "day")
plot_time_series <- plot_ly(x = as.Date(priceSRTG$date), y = ~as.numeric(priceSRTG$close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace( x = as.Date(fdate),y = fcsrtg$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Stock Price'))
plot_time_series
```
### Alfamart Trijaya Tbk.
```{r}
library(tseries)
library(forecast)
arimaamrt = auto.arima(priceAMRT$close)
fcamrt = forecast(arimaamrt)
start = ymd("2024-05-02")
end = ymd("2024-05-11")
fdate = seq(start, end, by = "day")
plot_time_series <- plot_ly(x = as.Date(priceAMRT$date), y = ~as.numeric(priceAMRT$close), type = 'scatter', mode = 'lines', name = 'Actual') %>%
add_trace( x = as.Date(fdate),y = fcamrt$mean, mode = 'lines', name = 'Predicted (ARIMA)') %>%
layout(title = 'Actual vs. ARIMA Forecast',
xaxis = list(title = 'Time'),
yaxis = list(title = 'Stock Price'))
plot_time_series
```
Value At Risk {data-orientation=columns}
=======================================================================
## Value at Risk {.tabset .tabset-fade data-height=640}
-----------------------------------------------------------------------
### Portofolio VAR
```{r}
# Define portfolio weights
weights <- optimal_weights
# Calculate covariance matrix
cov_matrix <- cov(return)
# Calculate portfolio variance
port_variance <- t(weights) %*% cov_matrix %*% weights
# Calculate portfolio standard deviation
port_sd <- sqrt(port_variance)
# Define confidence level and time horizon
confidence_level <- 0.95
time_horizon <- 1 # 1 day
# Calculate VaR
VaR <- qnorm(confidence_level) * port_sd * sqrt(time_horizon)
VaR
```
Dengan nilai 2% artinya, hanya sekitar 2% daripada total aset portofolio kita yang dipertaruhkan, apakah akan hilang atau bertambah.
### VAR By Copula
```{r}
library(copula)
library(fitdistrplus)
library(plotly)
# Fit marginal distributions to the returns
fit_ADRO <- fitdist(as.vector(return[, 1]), "norm")
fit_BRPT <- fitdist(as.vector(return[, 2]), "norm")
fit_ICBP <- fitdist(as.vector(return[, 3]), "norm")
fit_SRTG <- fitdist(as.vector(return[, 4]), "norm")
fit_AMRT <- fitdist(as.vector(return[, 5]), "norm")
# Transform returns to uniform using the CDF of the fitted distributions
u_ADRO <- pnorm(return[, 1], mean = fit_ADRO$estimate["mean"], sd = fit_ADRO$estimate["sd"])
u_BRPT <- pnorm(return[, 2], mean = fit_BRPT$estimate["mean"], sd = fit_BRPT$estimate["sd"])
u_ICBP <- pnorm(return[, 3], mean = fit_ICBP$estimate["mean"], sd = fit_ICBP$estimate["sd"])
u_SRTG <- pnorm(return[, 4], mean = fit_SRTG$estimate["mean"], sd = fit_SRTG$estimate["sd"])
u_AMRT <- pnorm(return[, 5], mean = fit_AMRT$estimate["mean"], sd = fit_AMRT$estimate["sd"])
# Combine the uniform margins
u_matrix <- cbind(u_ADRO, u_BRPT, u_ICBP, u_SRTG, u_AMRT)
# Fit a Gaussian copula to the uniform data
cop <- fitCopula(normalCopula(dim = 5), u_matrix, method = "ml")
# Simulate from the fitted copula
set.seed(123)
n_sim <- 1000
u_sim <- rCopula(n_sim, cop@copula)
# Transform back to the original margins
sim_ADRO <- qnorm(u_sim[,1], mean = fit_ADRO$estimate["mean"], sd = fit_ADRO$estimate["sd"])
sim_BRPT <- qnorm(u_sim[,2], mean = fit_BRPT$estimate["mean"], sd = fit_BRPT$estimate["sd"])
sim_ICBP <- qnorm(u_sim[,3], mean = fit_ICBP$estimate["mean"], sd = fit_ICBP$estimate["sd"])
sim_SRTG <- qnorm(u_sim[,4], mean = fit_SRTG$estimate["mean"], sd = fit_SRTG$estimate["sd"])
sim_AMRT <- qnorm(u_sim[,5], mean = fit_AMRT$estimate["mean"], sd = fit_AMRT$estimate["sd"])
# Combine simulated returns
sim_returns <- cbind(sim_ADRO, sim_BRPT, sim_ICBP, sim_SRTG, sim_AMRT)
colnames(sim_returns) <- ticklabel
# Define portfolio weights (equal weighting as an example)
weights <- optimal_weights
# Calculate portfolio returns from simulated data
sim_port_returns <- rowSums(sim_returns * weights)
# Define confidence level
confidence_level <- 0.95
# Calculate VaR
VaR_copula <- quantile(sim_port_returns, probs = 1 - confidence_level)
plot_ly(x = ~sim_port_returns, type = "histogram", name = "Simulated Portfolio Returns") %>%
layout(
shapes = list(
list(
type = "line",
x0 = VaR_copula, x1 = VaR_copula,
y0 = 0, y1 = max(hist(sim_port_returns, plot=FALSE)$density),
line = list(color = "red", width = 2),
xref = "x", yref = "y"
)
),
title = "Simulated Portfolio Returns with VaR",
xaxis = list(title = "Returns"),
yaxis = list(title = "Frequency")
)
```
Menggunakan Copula Didapatkan Juga Bahwa VAR sekitar -2.2%