### Complete Portfolio Construction and Comparison Workflow Source: https://context7.com/ardiad/riskportfolios/llms.txt A comprehensive example demonstrating estimation of returns and covariance, portfolio construction, and performance comparison. ```r library(RiskPortfolios) data("Industry_10") rets <- Industry_10 # ============================================ # STEP 1: Estimate expected returns # ============================================ mu_naive <- meanEstimation(rets, control = list(type = 'naive')) mu_bs <- meanEstimation(rets, control = list(type = 'bs')) # ============================================ # STEP 2: Estimate covariance matrices # ============================================ Sigma_naive <- covEstimation(rets, control = list(type = 'naive')) Sigma_lw <- covEstimation(rets, control = list(type = 'lw')) Sigma_const <- covEstimation(rets, control = list(type = 'const')) # ============================================ # STEP 3: Estimate semideviation for risk-efficient portfolios # ============================================ semiDev <- semidevEstimation(rets, control = list(type = 'naive')) # ============================================ # STEP 4: Construct various portfolios # ============================================ # Equal-weighted benchmark n <- ncol(rets) w_ew <- rep(1/n, n) # Minimum variance with different covariance estimators w_minvol_naive <- optimalPortfolio(Sigma = Sigma_naive, control = list(type = 'minvol', constraint = 'lo')) w_minvol_lw <- optimalPortfolio(Sigma = Sigma_lw, control = list(type = 'minvol', constraint = 'lo')) w_minvol_const <- optimalPortfolio(Sigma = Sigma_const, control = list(type = 'minvol', constraint = 'lo')) # Mean-variance with Bayes-Stein inputs w_mv_bs <- optimalPortfolio(mu = mu_bs, Sigma = Sigma_lw, control = list(type = 'mv', constraint = 'lo', gamma = 1)) # Equal-risk-contribution w_erc <- optimalPortfolio(Sigma = Sigma_lw, control = list(type = 'erc', constraint = 'lo')) # Maximum diversification w_maxdiv <- optimalPortfolio(Sigma = Sigma_lw, control = list(type = 'maxdiv', constraint = 'lo')) # Risk-efficient w_riskeff <- optimalPortfolio(Sigma = Sigma_lw, semiDev = semiDev, control = list(type = 'riskeff', constraint = 'lo')) # ============================================ # STEP 5: Compare portfolio characteristics # ============================================ # Function to compute portfolio volatility portfolio_vol <- function(w, Sigma) { sqrt(as.numeric(crossprod(w, Sigma %*% w))) } # Function to compute diversification ratio div_ratio <- function(w, Sigma) { sig <- sqrt(diag(Sigma)) weighted_vol <- sum(w * sig) port_vol <- portfolio_vol(w, Sigma) weighted_vol / port_vol } # Compare volatilities using Ledoit-Wolf covariance portfolios <- list( "Equal-Weight" = w_ew, "Min-Vol (Naive)" = w_minvol_naive, "Min-Vol (LW)" = w_minvol_lw, "Min-Vol (Const)" = w_minvol_const, "Mean-Var (BS)" = w_mv_bs, "ERC" = w_erc, "Max-Div" = w_maxdiv, "Risk-Eff" = w_riskeff ) # Print comparison cat("Portfolio Comparison:\n") cat("=" , rep("=", 50), "\n", sep = "") for (name in names(portfolios)) { w <- portfolios[[name]] vol <- portfolio_vol(w, Sigma_lw) * sqrt(252) * 100 # Annualized % dr <- div_ratio(w, Sigma_lw) cat(sprintf("%-18s Vol: %5.2f%% Div.Ratio: %.3f\n", name, vol, dr)) } ``` -------------------------------- ### Construct Maximum Decorrelation Portfolios Source: https://context7.com/ardiad/riskportfolios/llms.txt Examples of constructing maximum decorrelation portfolios under different constraint scenarios. ```r # Unconstrained maximum decorrelation w_maxdec <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdec')) # Long-only maximum decorrelation w_maxdec_lo <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdec', constraint = 'lo')) # Maximum decorrelation with bounds w_maxdec_bounds <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdec', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) ``` -------------------------------- ### Construct Maximum Diversification Portfolio with Bounds Source: https://context7.com/ardiad/riskportfolios/llms.txt Constructs a maximum diversification portfolio using specific lower and upper bounds for asset weights. ```r w_maxdiv_bounds <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdiv', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) ``` -------------------------------- ### Construct Risk-Efficient Portfolios Source: https://context7.com/ardiad/riskportfolios/llms.txt Constructs risk-efficient portfolios requiring semideviation estimation, available in unconstrained, long-only, and bounded variants. ```r # Unconstrained risk-efficient (requires semideviation) w_riskeff <- optimalPortfolio(Sigma = Sigma, semiDev = semiDev, control = list(type = 'riskeff')) # Long-only risk-efficient w_riskeff_lo <- optimalPortfolio(Sigma = Sigma, semiDev = semiDev, control = list(type = 'riskeff', constraint = 'lo')) # Risk-efficient with bounds w_riskeff_bounds <- optimalPortfolio(Sigma = Sigma, semiDev = semiDev, control = list(type = 'riskeff', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) ``` -------------------------------- ### Compute Optimal Portfolio Weights Source: https://context7.com/ardiad/riskportfolios/llms.txt Generates portfolio weights based on risk-based methodologies. Supports various constraints like long-only, gross exposure, and user-defined bounds. ```r library(RiskPortfolios) data("Industry_10") rets <- Industry_10 # Step 1: Estimate inputs mu <- meanEstimation(rets) Sigma <- covEstimation(rets) semiDev <- semidevEstimation(rets) # ============================================ # MEAN-VARIANCE PORTFOLIO # ============================================ # Unconstrained mean-variance with default risk aversion gamma = 0.89 w_mv <- optimalPortfolio(mu = mu, Sigma = Sigma) print(round(w_mv, 4)) # Mean-variance with custom risk aversion gamma = 1 w_mv_gamma1 <- optimalPortfolio(mu = mu, Sigma = Sigma, control = list(gamma = 1)) # Long-only mean-variance portfolio w_mv_lo <- optimalPortfolio(mu = mu, Sigma = Sigma, control = list(type = 'mv', constraint = 'lo')) # Mean-variance with user-defined bounds (2% to 80% per asset) w_mv_bounds <- optimalPortfolio(mu = mu, Sigma = Sigma, control = list(type = 'mv', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) # Mean-variance with gross exposure constraint (default 1.6 = 130/30) w_mv_gross <- optimalPortfolio(mu = mu, Sigma = Sigma, control = list(type = 'mv', constraint = 'gross')) # Mean-variance with custom gross exposure (1.2) w_mv_gross12 <- optimalPortfolio(mu = mu, Sigma = Sigma, control = list(type = 'mv', constraint = 'gross', gross.c = 1.2)) # ============================================ # MINIMUM VARIANCE PORTFOLIO # ============================================ # Unconstrained minimum variance w_minvol <- optimalPortfolio(Sigma = Sigma, control = list(type = 'minvol')) # Long-only minimum variance w_minvol_lo <- optimalPortfolio(Sigma = Sigma, control = list(type = 'minvol', constraint = 'lo')) # Minimum variance with bounds w_minvol_bounds <- optimalPortfolio(Sigma = Sigma, control = list(type = 'minvol', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) # Minimum variance with gross exposure constraint w_minvol_gross <- optimalPortfolio(Sigma = Sigma, control = list(type = 'minvol', constraint = 'gross', gross.c = 1.2)) # ============================================ # INVERSE VOLATILITY PORTFOLIO # ============================================ # Inverse volatility weighted (no constraints needed) w_invvol <- optimalPortfolio(Sigma = Sigma, control = list(type = 'invvol')) # ============================================ # EQUAL-RISK-CONTRIBUTION (ERC) PORTFOLIO # ============================================ # ERC with long-only constraint w_erc <- optimalPortfolio(Sigma = Sigma, control = list(type = 'erc', constraint = 'lo')) # ERC with user-defined bounds w_erc_bounds <- optimalPortfolio(Sigma = Sigma, control = list(type = 'erc', constraint = 'user', LB = rep(0.02, 10), UB = rep(0.80, 10))) # ============================================ # MAXIMUM DIVERSIFICATION PORTFOLIO # ============================================ # Unconstrained maximum diversification w_maxdiv <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdiv')) # Long-only maximum diversification w_maxdiv_lo <- optimalPortfolio(Sigma = Sigma, control = list(type = 'maxdiv', constraint = 'lo')) ``` -------------------------------- ### Estimate Semideviation with RiskPortfolios Source: https://context7.com/ardiad/riskportfolios/llms.txt Calculates downside risk using naive or EWMA methods. Requires the RiskPortfolios library and historical return data. ```r library(RiskPortfolios) data("Industry_10") rets <- Industry_10 # Naive semideviation estimation semiDev_naive <- semidevEstimation(rets) print(round(semiDev_naive, 6)) # NoDur Durbl Manuf Enrgy HiTec Telcm Shops Hlth Utils Other # 0.029841 0.044218 0.032672 0.038142 0.041563 0.033891 0.032108 0.031242 0.025674 0.035421 # Explicit naive estimation semiDev_naive2 <- semidevEstimation(rets, control = list(type = 'naive')) # EWMA semideviation with default lambda = 0.94 semiDev_ewma <- semidevEstimation(rets, control = list(type = 'ewma')) # EWMA semideviation with custom lambda = 0.90 semiDev_ewma_fast <- semidevEstimation(rets, control = list(type = 'ewma', lambda = 0.90)) ``` -------------------------------- ### Expected Returns Estimation in R Source: https://context7.com/ardiad/riskportfolios/llms.txt Computes expected returns using arithmetic mean, EWMA, Bayes-Stein shrinkage, and Martellini implied returns. Bayes-Stein shrinks estimates toward the global minimum variance portfolio return. ```r library(RiskPortfolios) data("Industry_10") rets <- Industry_10 # Naive arithmetic mean estimation mu_naive <- meanEstimation(rets) print(round(mu_naive, 6)) ``` ```r # Explicit naive estimation mu_naive2 <- meanEstimation(rets, control = list(type = 'naive')) ``` ```r # EWMA mean with default lambda = 0.94 # More weight on recent observations mu_ewma <- meanEstimation(rets, control = list(type = 'ewma')) ``` ```r # EWMA with faster adaptation (lower lambda) mu_ewma_fast <- meanEstimation(rets, control = list(type = 'ewma', lambda = 0.90)) ``` ```r # Bayes-Stein shrinkage estimation # Shrinks sample mean towards minimum variance portfolio return mu_bs <- meanEstimation(rets, control = list(type = 'bs')) ``` ```r # Martellini implied returns (uses volatility as proxy for expected return) mu_mart <- meanEstimation(rets, control = list(type = 'mart')) ``` -------------------------------- ### Covariance Matrix Estimation in R Source: https://context7.com/ardiad/riskportfolios/llms.txt Estimates covariance matrices using various methods like naive sample, EWMA, Ledoit-Wolf shrinkage, factor models, and Bayes-Stein. Supports ten estimation types, with shrinkage being useful when assets outnumber observations. ```r library(RiskPortfolios) data("Industry_10") rets <- Industry_10 # Naive (sample) covariance estimation - standard unbiased estimator Sigma_naive <- covEstimation(rets) print(round(Sigma_naive[1:3, 1:3], 6)) ``` ```r # EWMA estimation with default decay lambda = 0.94 (RiskMetrics standard) Sigma_ewma <- covEstimation(rets, control = list(type = 'ewma')) ``` ```r # EWMA with custom lambda = 0.90 for faster adaptation to recent data Sigma_ewma_fast <- covEstimation(rets, control = list(type = 'ewma', lambda = 0.90)) ``` ```r # Ledoit-Wolf shrinkage towards one-factor model (market) # Well-conditioned even when N > T Sigma_lw <- covEstimation(rets, control = list(type = 'lw')) ``` ```r # Factor model estimation with K = 3 factors Sigma_factor <- covEstimation(rets, control = list(type = 'factor', K = 3)) ``` ```r # Shrinkage towards constant correlation matrix Sigma_const <- covEstimation(rets, control = list(type = 'const')) ``` ```r # Ledoit-Wolf shrinkage towards constant correlation (alternative) Sigma_cor <- covEstimation(rets, control = list(type = 'cor')) ``` ```r # Shrinkage towards one-parameter matrix (equal variances, zero covariances) Sigma_oneparm <- covEstimation(rets, control = list(type = 'oneparm')) ``` ```r # Shrinkage towards diagonal matrix (zero covariances) Sigma_diag <- covEstimation(rets, control = list(type = 'diag')) ``` ```r # Large-dimensional estimator - optimal for high-dimensional data Sigma_large <- covEstimation(rets, control = list(type = 'large')) ``` ```r # Bayes-Stein covariance estimation Sigma_bs <- covEstimation(rets, control = list(type = 'bs')) ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.