def test_idzorek_with_priors(): df = get_data() S = risk_models.sample_cov(df) mcaps = get_market_caps() viewdict = {"GOOG": 0.40, "AAPL": -0.30, "FB": 0.30, "BABA": 0} bl = BlackLittermanModel( S, pi="market", market_caps=mcaps, absolute_views=viewdict, omega="idzorek", view_confidences=[1, 1, 0.25, 0.25], ) rets = bl.bl_returns() assert bl.omega[0, 0] == 0 np.testing.assert_almost_equal(rets["AAPL"], -0.3) with pytest.raises(ValueError): bl.portfolio_performance() bl.bl_weights() np.testing.assert_allclose( bl.portfolio_performance(), (0.943431295405105, 0.5361412623208567, 1.722365653051476), ) # Check that bl.cov() has been called and used assert bl.posterior_cov is not None
def test_bl_market_prior(): df = get_data() S = risk_models.sample_cov(df) prices = pd.read_csv(resource("spy_prices.csv"), parse_dates=True, index_col=0, squeeze=True) delta = black_litterman.market_implied_risk_aversion(prices) mcaps = get_market_caps() prior = black_litterman.market_implied_prior_returns(mcaps, delta, S) viewdict = {"GOOG": 0.40, "AAPL": -0.30, "FB": 0.30, "BABA": 0} bl = BlackLittermanModel(S, pi=prior, absolute_views=viewdict) rets = bl.bl_returns() # compare posterior with prior for v in viewdict: assert (prior[v] <= rets[v] <= viewdict[v]) or (viewdict[v] <= rets[v] <= prior[v]) with pytest.raises(ValueError): bl.portfolio_performance() bl.bl_weights(delta) np.testing.assert_allclose( bl.portfolio_performance(), (0.2580693114409672, 0.265445955488424, 0.8968654692926723), ) # Check that bl.cov() has been called and used assert bl.posterior_cov is not None
def test_bl_tau(): df = get_data() S = risk_models.sample_cov(df) prices = pd.read_csv( resource("spy_prices.csv"), parse_dates=True, index_col=0, squeeze=True ) delta = black_litterman.market_implied_risk_aversion(prices) mcaps = get_market_caps() prior = black_litterman.market_implied_prior_returns(mcaps, delta, S) viewdict = {"GOOG": 0.40, "AAPL": -0.30, "FB": 0.30, "BABA": 0} # Need to change omega for this test to work omega = np.diag([0.01, 0.01, 0.01, 0.01]) bl0 = BlackLittermanModel( S, pi=prior, absolute_views=viewdict, tau=1e-10, omega=omega ) bl1 = BlackLittermanModel( S, pi=prior, absolute_views=viewdict, tau=0.01, omega=omega ) bl2 = BlackLittermanModel( S, pi=prior, absolute_views=viewdict, tau=0.1, omega=omega ) # For tiny tau, posterior should roughly equal prior np.testing.assert_allclose(bl0.bl_returns(), bl0.pi.flatten(), rtol=1e-5) # For bigger tau, GOOG should be given more weight assert bl1.bl_returns()["GOOG"] > bl0.bl_returns()["GOOG"] assert bl2.bl_returns()["GOOG"] > bl1.bl_returns()["GOOG"]
def test_market_implied_prior(): df = get_data() S = risk_models.sample_cov(df) prices = pd.read_csv(resource("spy_prices.csv"), parse_dates=True, index_col=0, squeeze=True) delta = black_litterman.market_implied_risk_aversion(prices) mcaps = get_market_caps() pi = black_litterman.market_implied_prior_returns(mcaps, delta, S) assert isinstance(pi, pd.Series) assert list(pi.index) == list(df.columns) assert pi.notnull().all() assert pi.dtype == "float64" np.testing.assert_array_almost_equal( pi.values, np.array([ 0.14933293, 0.2168623, 0.11219185, 0.10362374, 0.28416295, 0.12196098, 0.19036819, 0.08860159, 0.17724273, 0.08779627, 0.0791797, 0.16460474, 0.12854665, 0.08657863, 0.11230036, 0.13875465, 0.15017163, 0.09066484, 0.1696369, 0.13270213, ]), ) mcaps = pd.Series(mcaps) pi2 = black_litterman.market_implied_prior_returns(mcaps, delta, S) pd.testing.assert_series_equal(pi, pi2, check_exact=False) # Test alternate syntax bl = BlackLittermanModel( S, pi="market", market_caps=mcaps, absolute_views={"AAPL": 0.1}, risk_aversion=delta, ) pi = black_litterman.market_implied_prior_returns(mcaps, delta, S, risk_free_rate=0) np.testing.assert_array_almost_equal(bl.pi, pi.values.reshape(-1, 1))
def test_bl_market_automatic(): df = get_data() S = risk_models.sample_cov(df) mcaps = get_market_caps() viewdict = {"GOOG": 0.40, "AAPL": -0.30, "FB": 0.30, "BABA": 0} bl = BlackLittermanModel(S, pi="market", absolute_views=viewdict, market_caps=mcaps) rets = bl.bl_returns() # Compare with explicit prior = black_litterman.market_implied_prior_returns(mcaps, 1, S, 0) bl2 = BlackLittermanModel(S, pi=prior, absolute_views=viewdict) rets2 = bl2.bl_returns() pd.testing.assert_series_equal(rets, rets2)