def test_min_volatility_cvxpy_vs_scipy(): # cvxpy ef = setup_efficient_frontier() ef.min_volatility() w1 = ef.weights # scipy args = (ef.cov_matrix, ) initial_guess = np.array([1 / ef.n_assets] * ef.n_assets) result = sco.minimize( objective_functions.portfolio_variance, x0=initial_guess, args=args, method="SLSQP", bounds=[(0, 1)] * 20, constraints=[{ "type": "eq", "fun": lambda x: np.sum(x) - 1 }], ) w2 = result["x"] cvxpy_var = objective_functions.portfolio_variance(w1, ef.cov_matrix) scipy_var = objective_functions.portfolio_variance(w2, ef.cov_matrix) assert cvxpy_var <= scipy_var
def test_efficient_return_short(): ef = EfficientFrontier(*setup_efficient_frontier(data_only=True), weight_bounds=(None, None)) target_return = 0.25 weights_sum = 1.0 # Not market neutral, weights must sum to 1. w = ef.efficient_return(target_return) assert isinstance(w, dict) assert set(w.keys()) == set(ef.tickers) np.testing.assert_almost_equal(ef.weights.sum(), weights_sum) w_expected = simple_ef_weights(ef.expected_returns, ef.cov_matrix, target_return, weights_sum) np.testing.assert_almost_equal(ef.weights, w_expected) vol_expected = np.sqrt( objective_functions.portfolio_variance(w_expected, ef.cov_matrix)) sharpe_expected = objective_functions.sharpe_ratio(w_expected, ef.expected_returns, ef.cov_matrix, negative=False) np.testing.assert_allclose(ef.portfolio_performance(), (target_return, vol_expected, sharpe_expected)) sharpe = ef.portfolio_performance()[2] ef_long_only = setup_efficient_frontier() ef_long_only.efficient_return(target_return) long_only_sharpe = ef_long_only.portfolio_performance()[2] assert sharpe > long_only_sharpe
def test_quadratic_utility(): df = get_data() e_rets = mean_historical_return(df) S = sample_cov(df) w = np.array([1 / len(e_rets)] * len(e_rets)) utility = objective_functions.quadratic_utility(w, e_rets, S, risk_aversion=3) assert isinstance(utility, float) assert utility < 0 mu = objective_functions.portfolio_return(w, e_rets, negative=False) variance = objective_functions.portfolio_variance(w, S) np.testing.assert_almost_equal(-utility + 3 / 2 * variance, mu)
def test_volatility_dummy(): w = np.array([0.4, 0.4, 0.2]) data = np.diag([0.5, 0.8, 0.9]) test_var = objective_functions.portfolio_variance(w, data) np.testing.assert_almost_equal(test_var, 0.244)
def test_volatility(): df = get_data() S = sample_cov(df) w = np.array([1 / df.shape[1]] * df.shape[1]) var = objective_functions.portfolio_variance(w, S) np.testing.assert_almost_equal(var, 0.04498224489292057)