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_weights(): df = get_data() S = risk_models.sample_cov(df) viewdict = {"AAPL": 0.20, "BBY": -0.30, "BAC": 0, "SBUX": -0.2, "T": 0.131321} bl = BlackLittermanModel(S, absolute_views=viewdict) prices = pd.read_csv( resource("spy_prices.csv"), parse_dates=True, index_col=0, squeeze=True ) delta = black_litterman.market_implied_risk_aversion(prices) bl.bl_weights(delta) w = bl.clean_weights() assert abs(sum(w.values()) - 1) < 1e-5 # check weights are allocated in same direction as views # (in absence of priors) assert all(viewdict[t] * w[t] >= 0 for t in viewdict) # numerical check test_weights = { "GOOG": 0.0, "AAPL": 1.40675, "FB": 0.0, "BABA": 0.0, "AMZN": 0.0, "GE": 0.0, "AMD": 0.0, "WMT": 0.0, "BAC": 0.02651, "GM": 0.0, "T": 2.81117, "UAA": 0.0, "SHLD": 0.0, "XOM": 0.0, "RRC": 0.0, "BBY": -1.44667, "MA": 0.0, "PFE": 0.0, "JPM": 0.0, "SBUX": -1.79776, } assert w == test_weights bl = BlackLittermanModel(S, absolute_views=viewdict) bl.optimize(delta) w2 = bl.clean_weights() assert w2 == w bl = BlackLittermanModel(S, absolute_views=pd.Series(viewdict)) bl.optimize(delta) w2 = bl.clean_weights() assert w2 == w
def test_cov_ndarray(): df = get_data() prior_df = df.pct_change().mean() S = risk_models.sample_cov(df) views = pd.Series(0.1, index=S.columns) bl = BlackLittermanModel(S, pi=prior_df, Q=views) bl_nd = BlackLittermanModel(S.to_numpy(), pi=prior_df.to_numpy(), Q=views) # Compare without missing ticker index values. np.testing.assert_equal(bl_nd.bl_returns().to_numpy(), bl.bl_returns().to_numpy()) np.testing.assert_equal(bl_nd.bl_cov().to_numpy(), bl.bl_cov().to_numpy()) assert list(bl_nd.bl_weights().values()) == list(bl.bl_weights().values())
def test_black_litterman_market_prior(): df = get_data() S = risk_models.sample_cov(df) prices = pd.read_csv( "tests/spy_prices.csv", parse_dates=True, index_col=0, squeeze=True ) delta = black_litterman.market_implied_risk_aversion(prices) mcaps = { "GOOG": 927e9, "AAPL": 1.19e12, "FB": 574e9, "BABA": 533e9, "AMZN": 867e9, "GE": 96e9, "AMD": 43e9, "WMT": 339e9, "BAC": 301e9, "GM": 51e9, "T": 61e9, "UAA": 78e9, "SHLD": 0, "XOM": 295e9, "RRC": 1e9, "BBY": 22e9, "MA": 288e9, "PFE": 212e9, "JPM": 422e9, "SBUX": 102e9, } 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_equal_prior(): df = get_data() S = risk_models.sample_cov(df) viewdict = {"AAPL": 0.20, "BBY": -0.30, "BAC": 0, "SBUX": -0.2, "T": 0.131321} bl = BlackLittermanModel(S, absolute_views=viewdict, pi="equal") np.testing.assert_array_almost_equal(bl.pi, np.ones((20, 1)) * 0.05) bl.bl_weights() np.testing.assert_allclose( bl.portfolio_performance(), (0.1877432247395778, 0.3246889329226965, 0.5166274785827545), )