|
13 | 13 | from numpy import (
|
14 | 14 | arange,
|
15 | 15 | zeros_like,
|
| 16 | + nan, |
16 | 17 | )
|
17 | 18 |
|
18 | 19 | import warnings
|
19 | 20 |
|
20 | 21 | from pyfolio.pos import (get_percent_alloc,
|
21 | 22 | extract_pos,
|
22 |
| - get_sector_exposures) |
| 23 | + get_sector_exposures, |
| 24 | + get_max_median_position_concentration) |
23 | 25 |
|
24 | 26 |
|
25 | 27 | class PositionsTestCase(TestCase):
|
@@ -115,3 +117,24 @@ def test_sector_exposure(self, positions, mapping,
|
115 | 117 | self.assertEqual(len(w), 1)
|
116 | 118 | else:
|
117 | 119 | self.assertEqual(len(w), 0)
|
| 120 | + |
| 121 | + @parameterized.expand([ |
| 122 | + (DataFrame([[1.0, 2.0, 3.0, 14.0]]*len(dates), |
| 123 | + columns=[0, 1, 2, 'cash'], index=dates), |
| 124 | + DataFrame([[0.15, 0.1, nan, nan]]*len(dates), |
| 125 | + columns=['max_long', 'median_long', |
| 126 | + 'median_short', 'max_short'], index=dates)), |
| 127 | + (DataFrame([[1.0, -2.0, -13.0, 15.0]]*len(dates), |
| 128 | + columns=[0, 1, 2, 'cash'], index=dates), |
| 129 | + DataFrame([[1.0, 1.0, -7.5, -13.0]]*len(dates), |
| 130 | + columns=['max_long', 'median_long', |
| 131 | + 'median_short', 'max_short'], index=dates)), |
| 132 | + (DataFrame([[nan, 2.0, nan, 8.0]]*len(dates), |
| 133 | + columns=[0, 1, 2, 'cash'], index=dates), |
| 134 | + DataFrame([[0.2, 0.2, nan, nan]]*len(dates), |
| 135 | + columns=['max_long', 'median_long', |
| 136 | + 'median_short', 'max_short'], index=dates)) |
| 137 | + ]) |
| 138 | + def test_max_median_exposure(self, positions, expected): |
| 139 | + alloc_summary = get_max_median_position_concentration(positions) |
| 140 | + assert_frame_equal(expected, alloc_summary) |
0 commit comments