def test_sample_cov_npd(): S = np.array([[0.03818144, 0.04182824], [0.04182824, 0.04149209]]) assert not risk_models._is_positive_semidefinite(S) for method in {"spectral", "diag"}: with pytest.warns(UserWarning) as w: S2 = risk_models.fix_nonpositive_semidefinite(S, fix_method=method) assert risk_models._is_positive_semidefinite(S2) assert len(w) == 1 assert ( str(w[0].message) == "The covariance matrix is non positive semidefinite. Amending eigenvalues." ) # Test works on DataFrame too, same results, index and columns rebuilt. tickers = ["A", "B"] S_df = pd.DataFrame(data=S, index=tickers, columns=tickers) S2_df = risk_models.fix_nonpositive_semidefinite(S_df, fix_method=method) assert isinstance(S2_df, pd.DataFrame) np.testing.assert_equal(S2_df.to_numpy(), S2) assert S2_df.index.equals(S_df.index) assert S2_df.columns.equals(S_df.columns) with pytest.warns(UserWarning): with pytest.raises(NotImplementedError): risk_models.fix_nonpositive_semidefinite(S, fix_method="blah")
def test_sample_cov_npd(): S = np.array([[0.03818144, 0.04182824], [0.04182824, 0.04149209]]) assert not risk_models._is_positive_semidefinite(S) for method in {"spectral", "diag"}: with pytest.warns(UserWarning) as w: S2 = risk_models.fix_nonpositive_semidefinite(S, fix_method=method) assert risk_models._is_positive_semidefinite(S2) assert len(w) == 1 assert ( str(w[0].message) == "The covariance matrix is non positive semidefinite. Amending eigenvalues." )
def test_risk_matrix_and_returns_data(): # Test the switcher method for simple calls df = get_data() for method in { "sample_cov", "semicovariance", "exp_cov", # FIXME: this fails "min_cov_determinant", "ledoit_wolf", "ledoit_wolf_constant_variance", "ledoit_wolf_single_factor", "ledoit_wolf_constant_correlation", "oracle_approximating", }: S = risk_models.risk_matrix(df, method=method) assert S.shape == (20, 20) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S) S2 = risk_models.risk_matrix(expected_returns.returns_from_prices(df), returns_data=True, method=method) pd.testing.assert_frame_equal(S, S2)
def test_sample_cov_real_data(): df = get_data() S = risk_models.sample_cov(df) assert S.shape == (20, 20) assert S.index.equals(df.columns) assert S.index.equals(S.columns) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S)
def test_min_cov_det(): df = get_data() S = risk_models.min_cov_determinant(df, random_state=8) assert S.shape == (20, 20) assert S.index.equals(df.columns) assert S.index.equals(S.columns) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S)
def test_semicovariance(): df = get_data() S = risk_models.semicovariance(df) assert S.shape == (20, 20) assert S.index.equals(df.columns) assert S.index.equals(S.columns) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S) S2 = risk_models.semicovariance(df, frequency=2) pd.testing.assert_frame_equal(S / 126, S2)
def test_oracle_approximating(): df = get_data() cs = risk_models.CovarianceShrinkage(df) shrunk_cov = cs.oracle_approximating() assert 0 < cs.delta < 1 assert shrunk_cov.shape == (20, 20) assert list(shrunk_cov.index) == list(df.columns) assert list(shrunk_cov.columns) == list(df.columns) assert not shrunk_cov.isnull().any().any() assert risk_models._is_positive_semidefinite(shrunk_cov)
def test_ledoit_wolf_constant_correlation(): df = get_data() cs = risk_models.CovarianceShrinkage(df) shrunk_cov = cs.ledoit_wolf(shrinkage_target="constant_correlation") assert 0 < cs.delta < 1 assert shrunk_cov.shape == (20, 20) assert list(shrunk_cov.index) == list(df.columns) assert list(shrunk_cov.columns) == list(df.columns) assert not shrunk_cov.isnull().any().any() assert risk_models._is_positive_semidefinite(shrunk_cov)
def test_shrunk_covariance(): df = get_data() cs = risk_models.CovarianceShrinkage(df) shrunk_cov = cs.shrunk_covariance(0.2) assert cs.delta == 0.2 assert shrunk_cov.shape == (20, 20) assert list(shrunk_cov.index) == list(df.columns) assert list(shrunk_cov.columns) == list(df.columns) assert not shrunk_cov.isnull().any().any() assert risk_models._is_positive_semidefinite(shrunk_cov)
def test_semicovariance(): df = get_data() S = risk_models.semicovariance(df) assert S.shape == (20, 20) assert S.index.equals(df.columns) assert S.index.equals(S.columns) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S) S2 = risk_models.semicovariance(df, frequency=2) pd.testing.assert_frame_equal(S / 126, S2) # Cover that it works on np.ndarray, with a warning with pytest.warns(RuntimeWarning): S2_np = risk_models.semicovariance(df.to_numpy(), frequency=2) np.testing.assert_equal(S2_np, S2.to_numpy())
def test_risk_matrix_additional_kwargs(): df = get_data() S = risk_models.sample_cov(df) S2 = risk_models.risk_matrix(df, frequency=2) pd.testing.assert_frame_equal(S / 126, S2) S = risk_models.risk_matrix( df, method="semicovariance", benchmark=0.0004, frequency=52 ) assert S.shape == (20, 20) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S) S = risk_models.risk_matrix( expected_returns.returns_from_prices(df), returns_data=True, method="exp_cov", span=60, fix_method="diag", ) assert S.shape == (20, 20) assert S.notnull().all().all() assert risk_models._is_positive_semidefinite(S)
def test_shrunk_covariance(): df = get_data() cs = risk_models.CovarianceShrinkage(df) shrunk_cov = cs.shrunk_covariance(0.2) assert cs.delta == 0.2 assert shrunk_cov.shape == (20, 20) assert list(shrunk_cov.index) == list(df.columns) assert list(shrunk_cov.columns) == list(df.columns) assert not shrunk_cov.isnull().any().any() assert risk_models._is_positive_semidefinite(shrunk_cov) with pytest.warns(RuntimeWarning) as w: cs_numpy = risk_models.CovarianceShrinkage(df.to_numpy()) assert len(w) == 1 assert str(w[0].message) == "data is not in a dataframe" shrunk_cov_numpy = cs_numpy.shrunk_covariance(0.2) assert isinstance(shrunk_cov_numpy, pd.DataFrame) np.testing.assert_equal(shrunk_cov_numpy.to_numpy(), shrunk_cov.to_numpy())
def test_fix_npd_different_method(): df = get_data() S = risk_models.sample_cov(df) assert risk_models._is_positive_semidefinite(S) S = risk_models.sample_cov(df, fix_method="diag") assert risk_models._is_positive_semidefinite(S)
def test_is_positive_semidefinite(): a = np.zeros((100, 100)) assert risk_models._is_positive_semidefinite(a)