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

Visualisasi Harga Saham

## Candlestick Chart

Adaro Energy Tbk.

Barito Pacific Tbk.

Indofood CBP Sukses Makmur Tbk.

PT Saratoga Investama Sedaya Tbk.

Sumber Alfaria Trijaya Tbk

Visualisasi daily Return

## Daily Return

ADRO Return Plot

ADARO Average Returns

ADRO Average Daily Returns: -3.665193e-05 

BRPT Return Plot

BRPT Average Daily Returns: 0.001058828 

ICBP Retrun Plot

ICBP Average Daily Returns: 0.0009467992 

Daily Return of Saratgo

SRTG Average Daily Returns: -0.001548596 

Daily Return of AMRT

AMRT Average Daily Returns: 0.001415377 

Correlation Heatmap

## Correlation Analysis

Portofolio Return and Volatility

## Portofolio Return

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

## Diversification Ratio

Diversification Ratio for Each Stocks

Diversification Joint Ratio

Diversification Ratio: 0.3592792 

Optimal Weights

## Optimal Weights for Each Stocks

Optimal Distribution

Stock Forecasting

## Stocks Forecasting using ARIMA

Adaro Energy Tbk.

Barito Pacific Energy Tbk.

Indofood CBP Sukses Makmur

Saratoga Investama

Alfamart Trijaya Tbk.

Value At Risk

## Value at Risk

Portofolio VAR

           [,1]
[1,] 0.02117186

Dengan nilai 2% artinya, hanya sekitar 2% daripada total aset portofolio kita yang dipertaruhkan, apakah akan hilang atau bertambah.

VAR By Copula

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%