skfolio 0.8.0__tar.gz → 0.9.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (127) hide show
  1. {skfolio-0.8.0/src/skfolio.egg-info → skfolio-0.9.0}/PKG-INFO +1 -1
  2. {skfolio-0.8.0 → skfolio-0.9.0}/pyproject.toml +1 -1
  3. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/population/_population.py +1 -2
  4. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/__init__.py +2 -0
  5. skfolio-0.9.0/src/skfolio/pre_selection/_drop_zero_variance.py +75 -0
  6. {skfolio-0.8.0 → skfolio-0.9.0/src/skfolio.egg-info}/PKG-INFO +1 -1
  7. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/SOURCES.txt +1 -0
  8. {skfolio-0.8.0 → skfolio-0.9.0}/LICENSE +0 -0
  9. {skfolio-0.8.0 → skfolio-0.9.0}/MANIFEST.in +0 -0
  10. {skfolio-0.8.0 → skfolio-0.9.0}/README.rst +0 -0
  11. {skfolio-0.8.0 → skfolio-0.9.0}/setup.cfg +0 -0
  12. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/__init__.py +0 -0
  13. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/cluster/__init__.py +0 -0
  14. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/cluster/_hierarchical.py +0 -0
  15. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/__init__.py +0 -0
  16. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/_base.py +0 -0
  17. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/__init__.py +0 -0
  18. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
  19. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
  20. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
  21. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/__init__.py +0 -0
  22. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/_base.py +0 -0
  23. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/_distance.py +0 -0
  24. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/__init__.py +0 -0
  25. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/_base.py +0 -0
  26. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/__init__.py +0 -0
  27. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_base.py +0 -0
  28. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_clayton.py +0 -0
  29. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_gaussian.py +0 -0
  30. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_gumbel.py +0 -0
  31. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_independent.py +0 -0
  32. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_joe.py +0 -0
  33. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_selection.py +0 -0
  34. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_student_t.py +0 -0
  35. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_utils.py +0 -0
  36. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/__init__.py +0 -0
  37. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_base.py +0 -0
  38. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_utils.py +0 -0
  39. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_vine_copula.py +0 -0
  40. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/__init__.py +0 -0
  41. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_base.py +0 -0
  42. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_gaussian.py +0 -0
  43. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_johnson_su.py +0 -0
  44. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py +0 -0
  45. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_selection.py +0 -0
  46. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_student_t.py +0 -0
  47. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/exceptions.py +0 -0
  48. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/__init__.py +0 -0
  49. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/_enums.py +0 -0
  50. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/_measures.py +0 -0
  51. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/metrics/__init__.py +0 -0
  52. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/metrics/_scorer.py +0 -0
  53. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/__init__.py +0 -0
  54. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_combinatorial.py +0 -0
  55. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_validation.py +0 -0
  56. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_walk_forward.py +0 -0
  57. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/__init__.py +0 -0
  58. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/__init__.py +0 -0
  59. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_base.py +0 -0
  60. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
  61. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
  62. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
  63. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
  64. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
  65. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
  66. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_implied_covariance.py +0 -0
  67. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
  68. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_oas.py +0 -0
  69. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
  70. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/__init__.py +0 -0
  71. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_base.py +0 -0
  72. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
  73. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
  74. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
  75. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
  76. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/__init__.py +0 -0
  77. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/_base.py +0 -0
  78. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/__init__.py +0 -0
  79. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/_nco.py +0 -0
  80. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
  81. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
  82. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
  83. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
  84. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/__init__.py +0 -0
  85. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_base.py +0 -0
  86. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
  87. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
  88. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
  89. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
  90. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/__init__.py +0 -0
  91. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/_base.py +0 -0
  92. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
  93. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/naive/__init__.py +0 -0
  94. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/naive/_naive.py +0 -0
  95. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/population/__init__.py +0 -0
  96. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/__init__.py +0 -0
  97. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_base.py +0 -0
  98. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
  99. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_portfolio.py +0 -0
  100. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
  101. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_complete.py +0 -0
  102. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
  103. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
  104. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_non_expiring.py +0 -0
  105. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/preprocessing/__init__.py +0 -0
  106. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/preprocessing/_returns.py +0 -0
  107. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/__init__.py +0 -0
  108. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_base.py +0 -0
  109. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_black_litterman.py +0 -0
  110. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_empirical.py +0 -0
  111. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_factor_model.py +0 -0
  112. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_synthetic_data.py +0 -0
  113. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/synthetic_returns/__init__.py +0 -0
  114. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/typing.py +0 -0
  115. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/__init__.py +0 -0
  116. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_base.py +0 -0
  117. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
  118. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_empirical.py +0 -0
  119. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/__init__.py +0 -0
  120. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/bootstrap.py +0 -0
  121. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/equations.py +0 -0
  122. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/sorting.py +0 -0
  123. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/stats.py +0 -0
  124. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/tools.py +0 -0
  125. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/dependency_links.txt +0 -0
  126. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/requires.txt +0 -0
  127. {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skfolio
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Portfolio optimization built on top of scikit-learn
5
5
  Author-email: Hugo Delatte <delatte.hugo@gmail.com>
6
6
  Maintainer-email: Hugo Delatte <delatte.hugo@gmail.com>, Matteo Manzi <matteomanzi09@gmail.com>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "skfolio"
7
- version = "0.8.0"
7
+ version = "0.9.0"
8
8
  maintainers = [
9
9
  { name = "Hugo Delatte", email = "delatte.hugo@gmail.com" },
10
10
  { name = "Matteo Manzi", email = "matteomanzi09@gmail.com" }
@@ -813,8 +813,7 @@ class Population(list):
813
813
  )
814
814
  + "<extra></extra>",
815
815
  colorbar=dict(
816
- title=str(z),
817
- titleside="top",
816
+ title=dict(text=str(z), side="top"),
818
817
  tickformat=",.2%" if not z.is_ratio else None,
819
818
  ),
820
819
  )
@@ -1,6 +1,7 @@
1
1
  """Pre Selection module."""
2
2
 
3
3
  from skfolio.pre_selection._drop_correlated import DropCorrelated
4
+ from skfolio.pre_selection._drop_zero_variance import DropZeroVariance
4
5
  from skfolio.pre_selection._select_complete import SelectComplete
5
6
  from skfolio.pre_selection._select_k_extremes import SelectKExtremes
6
7
  from skfolio.pre_selection._select_non_dominated import SelectNonDominated
@@ -8,6 +9,7 @@ from skfolio.pre_selection._select_non_expiring import SelectNonExpiring
8
9
 
9
10
  __all__ = [
10
11
  "DropCorrelated",
12
+ "DropZeroVariance",
11
13
  "SelectComplete",
12
14
  "SelectKExtremes",
13
15
  "SelectNonDominated",
@@ -0,0 +1,75 @@
1
+ """Pre-selection DropZeroVariance module."""
2
+
3
+ # Copyright (c) 2025
4
+ # Author: Vincent Maladiere <maladiere.vincent@gmail.com>
5
+ # SPDX-License-Identifier: BSD-3-Clause
6
+
7
+ import numpy as np
8
+ import numpy.typing as npt
9
+ import sklearn.base as skb
10
+ import sklearn.feature_selection as skf
11
+ import sklearn.utils.validation as skv
12
+
13
+
14
+ class DropZeroVariance(skf.SelectorMixin, skb.BaseEstimator):
15
+ """Transformer for dropping assets with near-zero variance.
16
+
17
+ On short windows, some assets can experience a near-zero variance, making
18
+ the covariance matrix improper for optimization. This simple transformer drops
19
+ assets whose variance is below some threshold.
20
+
21
+ Parameters
22
+ ----------
23
+ threshold : float, default=1e-8
24
+ Minimum variance threshold. The default value is 1e-8. For daily asset returns,
25
+ this value filters out assets whose daily standard deviation is below 1e-4
26
+ (0.01%), which corresponds to an annual standard deviation of approximately
27
+ 0.16%, assuming 252 trading days.
28
+
29
+ Attributes
30
+ ----------
31
+ to_keep_ : ndarray of shape (n_assets, )
32
+ Boolean array indicating which assets are remaining.
33
+
34
+ n_features_in_ : int
35
+ Number of assets seen during `fit`.
36
+
37
+ feature_names_in_ : ndarray of shape (`n_features_in_`,)
38
+ Names of assets seen during `fit`. Defined only when `X`
39
+ has assets names that are all strings.
40
+ """
41
+
42
+ to_keep_: np.ndarray
43
+
44
+ def __init__(self, threshold: float = 1e-8):
45
+ self.threshold = threshold
46
+
47
+ def fit(self, X: npt.ArrayLike, y=None):
48
+ """Fit the transformer on some assets.
49
+
50
+ Parameters
51
+ ----------
52
+ X : array-like of shape (n_observations, n_assets)
53
+ Price returns of the assets.
54
+
55
+ y : Ignored
56
+ Not used, present for API consistency by convention.
57
+
58
+ Returns
59
+ -------
60
+ self : DropZeroVariance
61
+ Fitted estimator.
62
+ """
63
+ X = skv.validate_data(self, X)
64
+ if self.threshold < 0:
65
+ raise ValueError(
66
+ f"`threshold` must be higher than 0, got {self.threshold}."
67
+ )
68
+
69
+ self.to_keep_ = X.var(axis=0) > self.threshold
70
+
71
+ return self
72
+
73
+ def _get_support_mask(self):
74
+ skv.check_is_fitted(self)
75
+ return self.to_keep_
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skfolio
3
- Version: 0.8.0
3
+ Version: 0.9.0
4
4
  Summary: Portfolio optimization built on top of scikit-learn
5
5
  Author-email: Hugo Delatte <delatte.hugo@gmail.com>
6
6
  Maintainer-email: Hugo Delatte <delatte.hugo@gmail.com>, Matteo Manzi <matteomanzi09@gmail.com>
@@ -99,6 +99,7 @@ src/skfolio/portfolio/_multi_period_portfolio.py
99
99
  src/skfolio/portfolio/_portfolio.py
100
100
  src/skfolio/pre_selection/__init__.py
101
101
  src/skfolio/pre_selection/_drop_correlated.py
102
+ src/skfolio/pre_selection/_drop_zero_variance.py
102
103
  src/skfolio/pre_selection/_select_complete.py
103
104
  src/skfolio/pre_selection/_select_k_extremes.py
104
105
  src/skfolio/pre_selection/_select_non_dominated.py
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes