2
2
import pandas as pd
3
3
import pytest
4
4
5
- from pypfopt import black_litterman
6
- from pypfopt .black_litterman import BlackLittermanModel
7
5
from pypfopt import risk_models , expected_returns
6
+ from pypfopt .black_litterman import (
7
+ BlackLittermanModel ,
8
+ market_implied_risk_aversion ,
9
+ market_implied_prior_returns ,
10
+ )
8
11
from tests .utilities_for_tests import get_data , get_market_caps , resource
9
12
10
13
@@ -241,18 +244,18 @@ def test_market_risk_aversion():
241
244
prices = pd .read_csv (
242
245
resource ("spy_prices.csv" ), parse_dates = True , index_col = 0
243
246
).squeeze ("columns" )
244
- delta = black_litterman . market_implied_risk_aversion (prices )
247
+ delta = market_implied_risk_aversion (prices )
245
248
assert np .round (delta , 5 ) == 2.68549
246
249
247
250
# check it works for df
248
251
prices = pd .read_csv (resource ("spy_prices.csv" ), parse_dates = True , index_col = 0 )
249
- delta = black_litterman . market_implied_risk_aversion (prices )
252
+ delta = market_implied_risk_aversion (prices )
250
253
assert np .round (delta .iloc [0 ], 5 ) == 2.68549
251
254
252
255
# Check it raises for other types.
253
256
list_invalid = [100.0 , 110.0 , 120.0 , 130.0 ]
254
257
with pytest .raises (TypeError ):
255
- delta = black_litterman . market_implied_risk_aversion (list_invalid )
258
+ delta = market_implied_risk_aversion (list_invalid )
256
259
257
260
258
261
def test_bl_weights ():
@@ -266,7 +269,7 @@ def test_bl_weights():
266
269
resource ("spy_prices.csv" ), parse_dates = True , index_col = 0
267
270
).squeeze ("columns" )
268
271
269
- delta = black_litterman . market_implied_risk_aversion (prices )
272
+ delta = market_implied_risk_aversion (prices )
270
273
bl .bl_weights (delta )
271
274
w = bl .clean_weights ()
272
275
assert abs (sum (w .values ()) - 1 ) < 1e-5
@@ -318,10 +321,10 @@ def test_market_implied_prior():
318
321
prices = pd .read_csv (
319
322
resource ("spy_prices.csv" ), parse_dates = True , index_col = 0
320
323
).squeeze ("columns" )
321
- delta = black_litterman . market_implied_risk_aversion (prices )
324
+ delta = market_implied_risk_aversion (prices )
322
325
323
326
mcaps = get_market_caps ()
324
- pi = black_litterman . market_implied_prior_returns (mcaps , delta , S )
327
+ pi = market_implied_prior_returns (mcaps , delta , S )
325
328
assert isinstance (pi , pd .Series )
326
329
assert list (pi .index ) == list (df .columns )
327
330
assert pi .notnull ().all ()
@@ -355,7 +358,7 @@ def test_market_implied_prior():
355
358
)
356
359
357
360
mcaps = pd .Series (mcaps )
358
- pi2 = black_litterman . market_implied_prior_returns (mcaps , delta , S )
361
+ pi2 = market_implied_prior_returns (mcaps , delta , S )
359
362
pd .testing .assert_series_equal (pi , pi2 , check_exact = False )
360
363
361
364
# Test alternate syntax
@@ -366,7 +369,7 @@ def test_market_implied_prior():
366
369
absolute_views = {"AAPL" : 0.1 },
367
370
risk_aversion = delta ,
368
371
)
369
- pi = black_litterman . market_implied_prior_returns (mcaps , delta , S , risk_free_rate = 0 )
372
+ pi = market_implied_prior_returns (mcaps , delta , S , risk_free_rate = 0 )
370
373
np .testing .assert_array_almost_equal (bl .pi , pi .values .reshape (- 1 , 1 ))
371
374
372
375
@@ -378,14 +381,14 @@ def test_bl_market_prior():
378
381
resource ("spy_prices.csv" ), parse_dates = True , index_col = 0
379
382
).squeeze ("columns" )
380
383
381
- delta = black_litterman . market_implied_risk_aversion (prices )
384
+ delta = market_implied_risk_aversion (prices )
382
385
383
386
mcaps = get_market_caps ()
384
387
385
388
with pytest .warns (RuntimeWarning ):
386
- black_litterman . market_implied_prior_returns (mcaps , delta , S .values )
389
+ market_implied_prior_returns (mcaps , delta , S .values )
387
390
388
- prior = black_litterman . market_implied_prior_returns (mcaps , delta , S )
391
+ prior = market_implied_prior_returns (mcaps , delta , S )
389
392
390
393
viewdict = {"GOOG" : 0.40 , "AAPL" : - 0.30 , "FB" : 0.30 , "BABA" : 0 }
391
394
bl = BlackLittermanModel (S , pi = prior , absolute_views = viewdict )
@@ -419,7 +422,7 @@ def test_bl_market_automatic():
419
422
rets = bl .bl_returns ()
420
423
421
424
# Compare with explicit
422
- prior = black_litterman . market_implied_prior_returns (mcaps , 1 , S , 0 )
425
+ prior = market_implied_prior_returns (mcaps , 1 , S , 0 )
423
426
bl2 = BlackLittermanModel (S , pi = prior , absolute_views = viewdict )
424
427
rets2 = bl2 .bl_returns ()
425
428
pd .testing .assert_series_equal (rets , rets2 )
@@ -432,8 +435,8 @@ def test_bl_market_automatic():
432
435
# mcaps2 = {k: v for k, v in list(mcaps.items())[::-1]}
433
436
# # mcaps = pd.Series(mcaps)
434
437
435
- # market_prior1 = black_litterman. market_implied_prior_returns(mcaps, 2, S.values, 0)
436
- # market_prior2 = black_litterman. market_implied_prior_returns(mcaps2, 2, S.values, 0)
438
+ # market_prior1 = market_implied_prior_returns(mcaps, 2, S.values, 0)
439
+ # market_prior2 = market_implied_prior_returns(mcaps2, 2, S.values, 0)
437
440
# market_prior1 == market_prior2
438
441
439
442
# mcaps = pd.Series(mcaps)
@@ -471,10 +474,10 @@ def test_bl_tau():
471
474
resource ("spy_prices.csv" ), parse_dates = True , index_col = 0
472
475
).squeeze ("columns" )
473
476
474
- delta = black_litterman . market_implied_risk_aversion (prices )
477
+ delta = market_implied_risk_aversion (prices )
475
478
476
479
mcaps = get_market_caps ()
477
- prior = black_litterman . market_implied_prior_returns (mcaps , delta , S )
480
+ prior = market_implied_prior_returns (mcaps , delta , S )
478
481
479
482
viewdict = {"GOOG" : 0.40 , "AAPL" : - 0.30 , "FB" : 0.30 , "BABA" : 0 }
480
483
0 commit comments