```{ library(quadprog)

returns_data <- matrix(c( 0.01, 0.02, -0.01, 0.005,
0.015, 0.018, -0.012, 0.008,
0.012, 0.025, -0.015, 0.007, 0.009, 0.021, -0.008, 0.006
), nrow = 4, byrow = TRUE)

colnames(returns_data) <- c(“0050”, “0056”, “006205”, “00646”)

cov_matrix <- cov(returns_data) mean_returns <- colMeans(returns_data)

epsilon <- 1e-10 cov_matrix_reg <- cov_matrix + epsilon * diag(ncol(returns_data))

objective_function <- function(w, cov_matrix) { portfolio_risk <- sqrt(t(w) %% cov_matrix %% w) return(portfolio_risk) }

constraints <- matrix(1, nrow = 1, ncol = ncol(returns_data)) bounds <- list(lower = rep(0, ncol(returns_data)), upper = rep(1, ncol(returns_data)))

optimal_weights <- solve.QP(Dmat = 2 * cov_matrix_reg, dvec = rep(0, ncol(cov_matrix)), Amat = t(constraints), bvec = 1, meq = 1)$solution

GMVP_return <- sum(optimal_weights * mean_returns) GMVP_std_dev <- sqrt(t(optimal_weights) %% cov_matrix %% optimal_weights)

print(optimal_weights) print(GMVP_return) print(GMVP_std_dev)

returns_data_monthly <- matrix(c( 0.05, 0.06, -0.03, 0.04,
0.08, 0.07, -0.02, 0.05, 0.06, 0.09, -0.04, 0.03,
0.07, 0.08, -0.03, 0.06
), nrow = 4, byrow = TRUE)

colnames(returns_data_monthly) <- c(“0050”, “0056”, “006205”, “00646”)

cov_matrix_monthly <- cov(returns_data_monthly) mean_returns_monthly <- colMeans(returns_data_monthly)

epsilon <- 1e-10 cov_matrix_reg_monthly <- cov_matrix_monthly + epsilon * diag(ncol(returns_data_monthly))

optimal_weights_monthly <- solve.QP(Dmat = 2 * cov_matrix_reg_monthly, dvec = rep(0, ncol(cov_matrix_monthly)), Amat = t(constraints), bvec = 1, meq = 1)$solution

GMVP_return_monthly <- sum(optimal_weights_monthly * mean_returns_monthly) GMVP_std_dev_monthly <- sqrt(t(optimal_weights_monthly) %% cov_matrix_monthly %% optimal_weights_monthly)

print(optimal_weights_monthly) print(GMVP_return_monthly) print(GMVP_std_dev_monthly)

rf <- 0
excess_returns <- returns_data_monthly - rf

mean_excess_returns <- colMeans(excess_returns) cov_matrix_monthly <- cov(excess_returns) tangency_weights <- solve(cov_matrix_monthly + epsilon * diag(ncol(cov_matrix_monthly)), mean_excess_returns) / sum(solve(cov_matrix_monthly + epsilon * diag(ncol(cov_matrix_monthly)), mean_excess_returns))

tangency_return <- sum(tangency_weights * mean_excess_returns)

tangency_std_dev <- sqrt(tangency_weights %% cov_matrix_monthly %% tangency_weights)

print(tangency_weights) print(tangency_return) print(tangency_std_dev) }


## Including Plots

You can also embed plots, for example:

Note that the echo = FALSE parameter was added to the code chunk to prevent printing of the R code that generated the plot.