def test_portfolio_return_dummy(): w = np.array([0.3, 0.1, 0.2, 0.25, 0.15]) e_rets = pd.Series([0.19, 0.08, 0.09, 0.23, 0.17]) mu = objective_functions.portfolio_return(w, e_rets, negative=False) assert isinstance(mu, float) assert mu > 0 np.testing.assert_almost_equal(mu, w.dot(e_rets)) np.testing.assert_almost_equal(mu, (w * e_rets).sum())
def test_portfolio_return_real(): df = get_data() e_rets = mean_historical_return(df) w = np.array([1 / len(e_rets)] * len(e_rets)) negative_mu = objective_functions.portfolio_return(w, e_rets) assert isinstance(negative_mu, float) assert negative_mu < 0 np.testing.assert_almost_equal(negative_mu, -w.dot(e_rets)) np.testing.assert_almost_equal(negative_mu, -(w * e_rets).sum()) np.testing.assert_almost_equal(-e_rets.sum() / len(e_rets), negative_mu)
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_sharpe_ratio(): df = get_data() e_rets = mean_historical_return(df) S = sample_cov(df) w = np.array([1 / len(e_rets)] * len(e_rets)) sharpe = objective_functions.sharpe_ratio(w, e_rets, S) assert isinstance(sharpe, float) assert sharpe < 0 sigma = np.sqrt(np.dot(w, np.dot(S, w.T))) negative_mu = objective_functions.portfolio_return(w, e_rets) np.testing.assert_almost_equal(sharpe * sigma - 0.02, negative_mu) # Risk free rate increasing should lead to negative Sharpe increasing. assert sharpe < objective_functions.sharpe_ratio( w, e_rets, S, risk_free_rate=0.1)