def test_min_volatility_sector_constraints(): sector_mapper = { "T": "auto", "UAA": "airline", "SHLD": "retail", "XOM": "energy", "RRC": "energy", "BBY": "retail", "MA": "fig", "PFE": "pharma", "JPM": "fig", "SBUX": "retail", "GOOG": "tech", "AAPL": "tech", "FB": "tech", "AMZN": "tech", "BABA": "tech", "GE": "utility", "AMD": "tech", "WMT": "retail", "BAC": "fig", "GM": "auto", } sector_upper = { "tech": 0.2, "utility": 0.1, "retail": 0.2, "fig": 0.4, "airline": 0.05, "energy": 0.2, } sector_lower = {"utility": 0.01, "fig": 0.02, "airline": 0.01} # ef = setup_efficient_frontier() ef = EfficientFrontier( *setup_efficient_frontier(data_only=True), weight_bounds=(None, None) ) ef.add_sector_constraints(sector_mapper, sector_lower, sector_upper) weights = ef.min_volatility() for sector in list(set().union(sector_upper, sector_lower)): sector_sum = 0 for t, v in weights.items(): if sector_mapper[t] == sector: sector_sum += v assert sector_sum <= sector_upper.get(sector, 1) + 1e-5 assert sector_sum >= sector_lower.get(sector, 0) - 1e-5
:param skew: expected return of each asset :type skew: np.ndarray :param cov_matrix: covariance matrix :type cov_matrix: np.ndarray :param negative: whether quantity should be made negative (so we can minimise) :type negative: boolean :return: (negative) Sharpe ratio :rtype: float """ sk = w @ skew sign = -1 if negative else 1 return sign * sk ef_skew = EfficientFrontier(exp_ret, S, weight_bounds=(0.0, 0.15)) ef_skew.add_sector_constraints(sector_mapper, sector_lower, sector_upper) ef_skew.add_objective(objective_functions.L2_reg, gamma=20) #ef.add_objective(minimize_negative_skew, skew= skw) ef_skew.convex_objective(minimize_negative_skew, skew=skw) #ef.max_sharpe() weights_skew = ef_skew.clean_weights() weights_skew ef_skew.portfolio_performance(verbose=True) # %% weight_dict = { "Miniumum Variance" : weights_minvol, "Maximum Sharpe Ratio" : weights_maxsharpe, "Maximum Quadratic Utility" : weights_maxquad, "Efficient Target Risk" : weights_effrisk,