skfolio 0.6.0__py3-none-any.whl → 0.7.0__py3-none-any.whl

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 (61) hide show
  1. skfolio/__init__.py +5 -5
  2. skfolio/cluster/__init__.py +1 -1
  3. skfolio/cluster/_hierarchical.py +1 -1
  4. skfolio/datasets/__init__.py +2 -2
  5. skfolio/distance/__init__.py +3 -3
  6. skfolio/distance/_distance.py +7 -6
  7. skfolio/exceptions.py +2 -2
  8. skfolio/measures/__init__.py +23 -23
  9. skfolio/model_selection/__init__.py +2 -2
  10. skfolio/moments/__init__.py +11 -11
  11. skfolio/moments/covariance/__init__.py +6 -6
  12. skfolio/moments/covariance/_denoise_covariance.py +2 -1
  13. skfolio/moments/covariance/_detone_covariance.py +2 -1
  14. skfolio/moments/covariance/_empirical_covariance.py +2 -1
  15. skfolio/moments/covariance/_ew_covariance.py +2 -1
  16. skfolio/moments/covariance/_gerber_covariance.py +2 -1
  17. skfolio/moments/covariance/_implied_covariance.py +1 -1
  18. skfolio/moments/expected_returns/__init__.py +2 -2
  19. skfolio/moments/expected_returns/_empirical_mu.py +2 -1
  20. skfolio/moments/expected_returns/_equilibrium_mu.py +2 -1
  21. skfolio/moments/expected_returns/_ew_mu.py +2 -1
  22. skfolio/moments/expected_returns/_shrunk_mu.py +2 -1
  23. skfolio/optimization/__init__.py +10 -10
  24. skfolio/optimization/cluster/__init__.py +1 -1
  25. skfolio/optimization/cluster/_nco.py +3 -2
  26. skfolio/optimization/cluster/hierarchical/__init__.py +1 -1
  27. skfolio/optimization/cluster/hierarchical/_herc.py +2 -1
  28. skfolio/optimization/cluster/hierarchical/_hrp.py +2 -1
  29. skfolio/optimization/convex/__init__.py +3 -3
  30. skfolio/optimization/convex/_base.py +2 -1
  31. skfolio/optimization/convex/_distributionally_robust.py +4 -1
  32. skfolio/optimization/convex/_maximum_diversification.py +3 -1
  33. skfolio/optimization/convex/_mean_risk.py +5 -2
  34. skfolio/optimization/convex/_risk_budgeting.py +3 -1
  35. skfolio/optimization/ensemble/_stacking.py +2 -2
  36. skfolio/optimization/naive/__init__.py +1 -1
  37. skfolio/optimization/naive/_naive.py +3 -2
  38. skfolio/portfolio/__init__.py +1 -1
  39. skfolio/portfolio/_base.py +1 -0
  40. skfolio/portfolio/_portfolio.py +1 -0
  41. skfolio/pre_selection/__init__.py +1 -1
  42. skfolio/pre_selection/_drop_correlated.py +1 -1
  43. skfolio/pre_selection/_select_complete.py +6 -4
  44. skfolio/pre_selection/_select_k_extremes.py +1 -1
  45. skfolio/pre_selection/_select_non_dominated.py +1 -1
  46. skfolio/pre_selection/_select_non_expiring.py +6 -4
  47. skfolio/prior/__init__.py +3 -3
  48. skfolio/prior/_black_litterman.py +2 -1
  49. skfolio/prior/_empirical.py +2 -1
  50. skfolio/prior/_factor_model.py +2 -1
  51. skfolio/typing.py +6 -6
  52. skfolio/uncertainty_set/__init__.py +5 -5
  53. skfolio/uncertainty_set/_base.py +3 -2
  54. skfolio/utils/stats.py +8 -8
  55. skfolio/utils/tools.py +10 -10
  56. {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/METADATA +32 -31
  57. skfolio-0.7.0.dist-info/RECORD +95 -0
  58. {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/WHEEL +1 -1
  59. skfolio-0.6.0.dist-info/RECORD +0 -95
  60. {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/LICENSE +0 -0
  61. {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/top_level.txt +0 -0
@@ -10,6 +10,7 @@ import cvxpy as cp
10
10
  import numpy as np
11
11
  import numpy.typing as npt
12
12
  import sklearn.utils.metadata_routing as skm
13
+ import sklearn.utils.validation as skv
13
14
 
14
15
  import skfolio.typing as skt
15
16
  from skfolio.measures import RiskMeasure
@@ -452,7 +453,8 @@ class RiskBudgeting(ConvexOptimization):
452
453
  """
453
454
  routed_params = skm.process_routing(self, "fit", **fit_params)
454
455
 
455
- self._check_feature_names(X, reset=True)
456
+ # `X` is unchanged and only `feature_names_in_` is performed
457
+ _ = skv.validate_data(self, X, skip_check_array=True)
456
458
 
457
459
  if not isinstance(self.risk_measure, RiskMeasure):
458
460
  raise TypeError("risk_measure must be of type `RiskMeasure`")
@@ -330,9 +330,9 @@ class StackingOptimization(BaseOptimization, BaseComposition):
330
330
  # We validate and convert to numpy array only after base-estimator fitting
331
331
  # to keep the assets names in case they are used in the estimator.
332
332
  if y is not None:
333
- _, y = self._validate_data(X, y, multi_output=True)
333
+ _, y = skv.validate_data(self, X, y, multi_output=True)
334
334
  else:
335
- _ = self._validate_data(X)
335
+ _ = skv.validate_data(self, X)
336
336
 
337
337
  if isinstance(self.cv, BaseCombinatorialCV):
338
338
  X_pred = np.array(
@@ -1,3 +1,3 @@
1
1
  from skfolio.optimization.naive._naive import EqualWeighted, InverseVolatility, Random
2
2
 
3
- __all__ = ["InverseVolatility", "EqualWeighted", "Random"]
3
+ __all__ = ["EqualWeighted", "InverseVolatility", "Random"]
@@ -6,6 +6,7 @@
6
6
  import numpy as np
7
7
  import numpy.typing as npt
8
8
  import sklearn.utils.metadata_routing as skm
9
+ import sklearn.utils.validation as skv
9
10
 
10
11
  from skfolio.optimization._base import BaseOptimization
11
12
  from skfolio.prior import BasePrior, EmpiricalPrior
@@ -141,7 +142,7 @@ class EqualWeighted(BaseOptimization):
141
142
  self : EqualWeighted
142
143
  Fitted estimator.
143
144
  """
144
- X = self._validate_data(X)
145
+ X = skv.validate_data(self, X)
145
146
  n_assets = X.shape[1]
146
147
  self.weights_ = np.ones(n_assets) / n_assets
147
148
  return self
@@ -185,7 +186,7 @@ class Random(BaseOptimization):
185
186
  self : EqualWeighted
186
187
  Fitted estimator.
187
188
  """
188
- X = self._validate_data(X)
189
+ X = skv.validate_data(self, X)
189
190
  n_assets = X.shape[1]
190
191
  self.weights_ = rand_weights_dirichlet(n=n_assets)
191
192
  return self
@@ -10,4 +10,4 @@ from skfolio.portfolio._base import BasePortfolio
10
10
  from skfolio.portfolio._multi_period_portfolio import MultiPeriodPortfolio
11
11
  from skfolio.portfolio._portfolio import Portfolio
12
12
 
13
- __all__ = ["BasePortfolio", "Portfolio", "MultiPeriodPortfolio"]
13
+ __all__ = ["BasePortfolio", "MultiPeriodPortfolio", "Portfolio"]
@@ -389,6 +389,7 @@ class BasePortfolio:
389
389
  "edar_beta",
390
390
  }
391
391
 
392
+ # ruff: noqa: RUF023
392
393
  __slots__ = {
393
394
  # public
394
395
  "tag",
@@ -412,6 +412,7 @@ class Portfolio(BasePortfolio):
412
412
  }
413
413
  )
414
414
 
415
+ # ruff: noqa: RUF023
415
416
  __slots__ = {
416
417
  # read-only
417
418
  "X",
@@ -6,8 +6,8 @@ from skfolio.pre_selection._select_non_expiring import SelectNonExpiring
6
6
 
7
7
  __all__ = [
8
8
  "DropCorrelated",
9
+ "SelectComplete",
9
10
  "SelectKExtremes",
10
11
  "SelectNonDominated",
11
- "SelectComplete",
12
12
  "SelectNonExpiring",
13
13
  ]
@@ -74,7 +74,7 @@ class DropCorrelated(skf.SelectorMixin, skb.BaseEstimator):
74
74
  self : DropCorrelated
75
75
  Fitted estimator.
76
76
  """
77
- X = self._validate_data(X)
77
+ X = skv.validate_data(self, X)
78
78
  if not -1 <= self.threshold <= 1:
79
79
  raise ValueError("`threshold` must be between -1 and 1")
80
80
 
@@ -97,7 +97,7 @@ class SelectComplete(skf.SelectorMixin, skb.BaseEstimator):
97
97
  Fitted estimator.
98
98
  """
99
99
  # Validate by allowing NaNs
100
- X = self._validate_data(X, force_all_finite="allow-nan")
100
+ X = skv.validate_data(self, X, ensure_all_finite="allow-nan")
101
101
 
102
102
  if self.drop_assets_with_internal_nan:
103
103
  # Identify columns with any NaNs
@@ -108,9 +108,11 @@ class SelectComplete(skf.SelectorMixin, skb.BaseEstimator):
108
108
 
109
109
  return self
110
110
 
111
- def _get_support_mask(self):
111
+ def _get_support_mask(self) -> np.ndarray:
112
112
  skv.check_is_fitted(self)
113
113
  return self.to_keep_
114
114
 
115
- def _more_tags(self):
116
- return {"allow_nan": True}
115
+ def __sklearn_tags__(self):
116
+ tags = super().__sklearn_tags__()
117
+ tags.input_tags.allow_nan = True
118
+ return tags
@@ -76,7 +76,7 @@ class SelectKExtremes(skf.SelectorMixin, skb.BaseEstimator):
76
76
  self : SelectKExtremes
77
77
  Fitted estimator.
78
78
  """
79
- X = self._validate_data(X)
79
+ X = skv.validate_data(self, X)
80
80
  k = int(self.k)
81
81
  if k <= 0:
82
82
  raise ValueError("`k` must be strictly positive")
@@ -95,7 +95,7 @@ class SelectNonDominated(skf.SelectorMixin, skb.BaseEstimator):
95
95
  self : SelectNonDominated
96
96
  Fitted estimator.
97
97
  """
98
- X = self._validate_data(X)
98
+ X = skv.validate_data(self, X)
99
99
  if not -1 <= self.threshold <= 1:
100
100
  raise ValueError("`threshold` must be between -1 and 1")
101
101
  n_assets = X.shape[1]
@@ -114,7 +114,7 @@ class SelectNonExpiring(skf.SelectorMixin, skb.BaseEstimator):
114
114
  self : SelectNonExpiring
115
115
  Fitted estimator.
116
116
  """
117
- _ = self._validate_data(X, force_all_finite="allow-nan")
117
+ _ = skv.validate_data(self, X, ensure_all_finite="allow-nan")
118
118
 
119
119
  # Validate by allowing NaNs
120
120
  if not hasattr(X, "index") or not isinstance(X.index, pd.DatetimeIndex):
@@ -140,9 +140,11 @@ class SelectNonExpiring(skf.SelectorMixin, skb.BaseEstimator):
140
140
 
141
141
  return self
142
142
 
143
- def _get_support_mask(self):
143
+ def _get_support_mask(self) -> np.ndarray:
144
144
  skv.check_is_fitted(self)
145
145
  return self.to_keep_
146
146
 
147
- def _more_tags(self):
148
- return {"allow_nan": True}
147
+ def __sklearn_tags__(self):
148
+ tags = super().__sklearn_tags__()
149
+ tags.input_tags.allow_nan = True
150
+ return tags
skfolio/prior/__init__.py CHANGED
@@ -8,11 +8,11 @@ from skfolio.prior._factor_model import (
8
8
  )
9
9
 
10
10
  __all__ = [
11
- "PriorModel",
11
+ "BaseLoadingMatrix",
12
12
  "BasePrior",
13
- "EmpiricalPrior",
14
13
  "BlackLitterman",
14
+ "EmpiricalPrior",
15
15
  "FactorModel",
16
- "BaseLoadingMatrix",
17
16
  "LoadingMatrixRegression",
17
+ "PriorModel",
18
18
  ]
@@ -10,6 +10,7 @@
10
10
  import numpy as np
11
11
  import numpy.typing as npt
12
12
  import sklearn.utils.metadata_routing as skm
13
+ import sklearn.utils.validation as skv
13
14
 
14
15
  from skfolio.moments import EquilibriumMu
15
16
  from skfolio.prior._base import BasePrior, PriorModel
@@ -182,7 +183,7 @@ class BlackLitterman(BasePrior):
182
183
 
183
184
  # we validate after all models have been fitted to keep features names
184
185
  # information.
185
- self._validate_data(X)
186
+ skv.validate_data(self, X)
186
187
 
187
188
  n_assets = prior_returns.shape[1]
188
189
  views = np.asarray(self.views)
@@ -7,6 +7,7 @@
7
7
  import numpy as np
8
8
  import numpy.typing as npt
9
9
  import sklearn.utils.metadata_routing as skm
10
+ import sklearn.utils.validation as skv
10
11
 
11
12
  from skfolio.moments import BaseCovariance, BaseMu, EmpiricalCovariance, EmpiricalMu
12
13
  from skfolio.prior._base import BasePrior, PriorModel
@@ -190,7 +191,7 @@ class EmpiricalPrior(BasePrior):
190
191
 
191
192
  # we validate and convert to numpy after all models have been fitted to keep
192
193
  # features names information.
193
- X = self._validate_data(X)
194
+ X = skv.validate_data(self, X)
194
195
  self.prior_model_ = PriorModel(
195
196
  mu=mu,
196
197
  covariance=covariance,
@@ -17,6 +17,7 @@ import sklearn.base as skb
17
17
  import sklearn.linear_model as skl
18
18
  import sklearn.multioutput as skmo
19
19
  import sklearn.utils.metadata_routing as skm
20
+ import sklearn.utils.validation as skv
20
21
 
21
22
  from skfolio.prior._base import BasePrior, PriorModel
22
23
  from skfolio.prior._empirical import EmpiricalPrior
@@ -273,7 +274,7 @@ class FactorModel(BasePrior):
273
274
 
274
275
  # we validate and convert to numpy after all models have been fitted to keep
275
276
  # features names information.
276
- X, y = self._validate_data(X, y, multi_output=True)
277
+ X, y = skv.validate_data(self, X, y, multi_output=True)
277
278
  n_assets = X.shape[1]
278
279
  n_factors = y.shape[1]
279
280
 
skfolio/typing.py CHANGED
@@ -14,20 +14,20 @@ import plotly.graph_objects as go
14
14
  from skfolio.measures import ExtraRiskMeasure, PerfMeasure, RatioMeasure, RiskMeasure
15
15
 
16
16
  __all__ = [
17
+ "CvxMeasure",
18
+ "ExpressionFunction",
19
+ "Factor",
17
20
  "Groups",
18
21
  "Inequality",
19
22
  "LinearConstraints",
23
+ "Measure",
20
24
  "MultiInput",
21
- "Target",
25
+ "Names",
22
26
  "ParametersValues",
23
- "Factor",
24
27
  "Result",
25
28
  "RiskResult",
26
- "ExpressionFunction",
27
- "Measure",
28
- "CvxMeasure",
29
- "Names",
30
29
  "Tags",
30
+ "Target",
31
31
  ]
32
32
 
33
33
  Measure = PerfMeasure | RiskMeasure | ExtraRiskMeasure | RatioMeasure
@@ -13,11 +13,11 @@ from skfolio.uncertainty_set._empirical import (
13
13
  )
14
14
 
15
15
  __all__ = [
16
- "UncertaintySet",
17
- "BaseMuUncertaintySet",
18
16
  "BaseCovarianceUncertaintySet",
19
- "EmpiricalMuUncertaintySet",
20
- "EmpiricalCovarianceUncertaintySet",
21
- "BootstrapMuUncertaintySet",
17
+ "BaseMuUncertaintySet",
22
18
  "BootstrapCovarianceUncertaintySet",
19
+ "BootstrapMuUncertaintySet",
20
+ "EmpiricalCovarianceUncertaintySet",
21
+ "EmpiricalMuUncertaintySet",
22
+ "UncertaintySet",
23
23
  ]
@@ -11,6 +11,7 @@ import numpy as np
11
11
  import numpy.typing as npt
12
12
  import sklearn.base as skb
13
13
  import sklearn.utils.metadata_routing as skm
14
+ import sklearn.utils.validation as skv
14
15
 
15
16
  from skfolio.prior import BasePrior
16
17
 
@@ -113,9 +114,9 @@ class BaseCovarianceUncertaintySet(skb.BaseEstimator, ABC):
113
114
  Validated price returns of factors or a target benchmark if provided.
114
115
  """
115
116
  if y is None:
116
- X = self._validate_data(X)
117
+ X = skv.validate_data(self, X)
117
118
  else:
118
- X, y = self._validate_data(X, y, multi_output=True)
119
+ X, y = skv.validate_data(self, X, y, multi_output=True)
119
120
  return X, y
120
121
 
121
122
  def get_metadata_routing(self):
skfolio/utils/stats.py CHANGED
@@ -23,20 +23,20 @@ from skfolio.utils.tools import AutoEnum
23
23
 
24
24
  __all__ = [
25
25
  "NBinsMethod",
26
- "n_bins_freedman",
27
- "n_bins_knuth",
28
- "is_cholesky_dec",
26
+ "assert_is_distance",
29
27
  "assert_is_square",
30
28
  "assert_is_symmetric",
31
- "assert_is_distance",
32
- "cov_nearest",
33
- "cov_to_corr",
34
- "corr_to_cov",
35
29
  "commutation_matrix",
36
30
  "compute_optimal_n_clusters",
31
+ "corr_to_cov",
32
+ "cov_nearest",
33
+ "cov_to_corr",
34
+ "is_cholesky_dec",
35
+ "minimize_relative_weight_deviation",
36
+ "n_bins_freedman",
37
+ "n_bins_knuth",
37
38
  "rand_weights",
38
39
  "rand_weights_dirichlet",
39
- "minimize_relative_weight_deviation",
40
40
  ]
41
41
 
42
42
 
skfolio/utils/tools.py CHANGED
@@ -21,21 +21,21 @@ import sklearn.base as skb
21
21
 
22
22
  __all__ = [
23
23
  "AutoEnum",
24
- "cached_property_slots",
25
- "cache_method",
26
- "input_to_array",
27
24
  "args_names",
28
- "format_measure",
29
- "optimal_rounding_decimals",
30
25
  "bisection",
31
- "safe_split",
32
- "fit_single_estimator",
33
- "fit_and_predict",
34
- "safe_indexing",
26
+ "cache_method",
27
+ "cached_property_slots",
28
+ "check_estimator",
35
29
  "deduplicate_names",
36
30
  "default_asset_names",
37
- "check_estimator",
31
+ "fit_and_predict",
32
+ "fit_single_estimator",
33
+ "format_measure",
38
34
  "get_feature_names",
35
+ "input_to_array",
36
+ "optimal_rounding_decimals",
37
+ "safe_indexing",
38
+ "safe_split",
39
39
  ]
40
40
 
41
41
  GenericAlias = type(list[int])
@@ -1,9 +1,9 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skfolio
3
- Version: 0.6.0
3
+ Version: 0.7.0
4
4
  Summary: Portfolio optimization built on top of scikit-learn
5
5
  Author-email: Hugo Delatte <delatte.hugo@gmail.com>
6
- Maintainer-email: Hugo Delatte <delatte.hugo@gmail.com>
6
+ Maintainer-email: Hugo Delatte <delatte.hugo@gmail.com>, Matteo Manzi <matteomanzi09@gmail.com>
7
7
  License: BSD 3-Clause License
8
8
 
9
9
  Copyright (c) 2007-2023 The skfolio developers.
@@ -56,36 +56,37 @@ Classifier: Topic :: Software Development
56
56
  Requires-Python: >=3.10
57
57
  Description-Content-Type: text/x-rst
58
58
  License-File: LICENSE
59
- Requires-Dist: numpy >=1.23.4
60
- Requires-Dist: scipy >=1.8.0
61
- Requires-Dist: pandas >=1.4.1
62
- Requires-Dist: cvxpy >=1.4.1
63
- Requires-Dist: scikit-learn >=1.5.0
64
- Requires-Dist: joblib >=1.3.2
65
- Requires-Dist: plotly >=5.22.0
59
+ Requires-Dist: numpy>=1.23.4
60
+ Requires-Dist: scipy>=1.8.0
61
+ Requires-Dist: pandas>=1.4.1
62
+ Requires-Dist: cvxpy>=1.4.1
63
+ Requires-Dist: scikit-learn>=1.6.0
64
+ Requires-Dist: joblib>=1.3.2
65
+ Requires-Dist: plotly>=5.22.0
66
+ Provides-Extra: dev
67
+ Requires-Dist: cvxpy[SCIP]<2.0.0,>=1.6.0; extra == "dev"
68
+ Requires-Dist: pytest<9.0.0,>=8.3.4; extra == "dev"
69
+ Requires-Dist: pytest-cov<7.0.0,>=6.0.0; extra == "dev"
70
+ Requires-Dist: ruff<1.0.0,>=0.8.4; extra == "dev"
71
+ Requires-Dist: pre-commit<4.2.0,>=4.0.0; extra == "dev"
66
72
  Provides-Extra: docs
67
- Requires-Dist: cvxpy[scip] ; extra == 'docs'
68
- Requires-Dist: Sphinx ; extra == 'docs'
69
- Requires-Dist: sphinx-gallery ; extra == 'docs'
70
- Requires-Dist: sphinx-design ; extra == 'docs'
71
- Requires-Dist: pydata-sphinx-theme ==0.13.3 ; extra == 'docs'
72
- Requires-Dist: matplotlib ; extra == 'docs'
73
- Requires-Dist: kaleido ==0.2.1 ; extra == 'docs'
74
- Requires-Dist: sphinx-copybutton ; extra == 'docs'
75
- Requires-Dist: numpydoc ; extra == 'docs'
76
- Requires-Dist: sphinx-togglebutton ; extra == 'docs'
77
- Requires-Dist: sphinx-favicon ; extra == 'docs'
78
- Requires-Dist: sphinx-prompt ; extra == 'docs'
79
- Requires-Dist: sphinxext.opengraph ; extra == 'docs'
80
- Requires-Dist: sphinx-sitemap ; extra == 'docs'
81
- Requires-Dist: jupyterlite-sphinx ; extra == 'docs'
82
- Requires-Dist: jupyterlite-pyodide-kernel ; extra == 'docs'
83
- Requires-Dist: nbformat ; extra == 'docs'
84
- Provides-Extra: tests
85
- Requires-Dist: cvxpy[scip] ; extra == 'tests'
86
- Requires-Dist: pytest ; extra == 'tests'
87
- Requires-Dist: pytest-cov ; extra == 'tests'
88
- Requires-Dist: ruff ; extra == 'tests'
73
+ Requires-Dist: cvxpy[SCIP]; extra == "docs"
74
+ Requires-Dist: Sphinx; extra == "docs"
75
+ Requires-Dist: sphinx-gallery; extra == "docs"
76
+ Requires-Dist: sphinx-design; extra == "docs"
77
+ Requires-Dist: pydata-sphinx-theme==0.13.3; extra == "docs"
78
+ Requires-Dist: matplotlib; extra == "docs"
79
+ Requires-Dist: kaleido==0.2.1; extra == "docs"
80
+ Requires-Dist: sphinx-copybutton; extra == "docs"
81
+ Requires-Dist: numpydoc; extra == "docs"
82
+ Requires-Dist: sphinx-togglebutton; extra == "docs"
83
+ Requires-Dist: sphinx-favicon; extra == "docs"
84
+ Requires-Dist: sphinx-prompt; extra == "docs"
85
+ Requires-Dist: sphinxext.opengraph; extra == "docs"
86
+ Requires-Dist: sphinx-sitemap; extra == "docs"
87
+ Requires-Dist: jupyterlite-sphinx; extra == "docs"
88
+ Requires-Dist: jupyterlite-pyodide-kernel; extra == "docs"
89
+ Requires-Dist: nbformat; extra == "docs"
89
90
 
90
91
  .. -*- mode: rst -*-
91
92
 
@@ -0,0 +1,95 @@
1
+ skfolio/__init__.py,sha256=FbnqIQGdiw2fg-jy2N--TnXGknEahle2zj7y47bxQkY,618
2
+ skfolio/exceptions.py,sha256=poWfE5geF121AR9QqrG781KebGneIZ028161tV0YfS0,784
3
+ skfolio/typing.py,sha256=SqYkUNbeq_go0pJaoIAFE-MNvHtHSGLzhNrhrRxkpfM,1378
4
+ skfolio/cluster/__init__.py,sha256=5yp3qkvBoN0qNDmmPahjPMegc0oQXCJ1FPxwgEqJpiY,251
5
+ skfolio/cluster/_hierarchical.py,sha256=i7ckFpKdxymzrqXZBc0AZj-Qcz65JuUoJQ7pYWfAo7E,12823
6
+ skfolio/datasets/__init__.py,sha256=0tuS8CR26EUBqBFjyxgZ2L5PgZDy3AjK3qh4GV-fB1U,481
7
+ skfolio/datasets/_base.py,sha256=ECeHHlNOb2U5hEE3kaK8yQtegcVYiuGTjMLJ3Dop0Ks,16073
8
+ skfolio/datasets/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
+ skfolio/datasets/data/factors_dataset.csv.gz,sha256=brCJlT25DJo40yg1gnUXAakNtvWZZYR_1ksFeN5JcWE,36146
10
+ skfolio/datasets/data/sp500_dataset.csv.gz,sha256=7iHKwovvsdCnOanOsiGE-ZU5RyaqDP3pohlB0awErA0,426065
11
+ skfolio/datasets/data/sp500_index.csv.gz,sha256=iUw0QxwoT4aqZKRn4Xbio8m2l8hX65qzUAbC3VXT_fI,41898
12
+ skfolio/distance/__init__.py,sha256=MnNOJOQTdt3e-MH_uXMaaogWzF7Ubymvc8I0Ks7VElU,547
13
+ skfolio/distance/_base.py,sha256=jBgRk6lZrP1woSI9541fTfxBBkp4WCTLlRPmWcmA3j4,1326
14
+ skfolio/distance/_distance.py,sha256=0x77Yf_Tukb2l8J1VmvPT3YWJxVzGQo4u5rNjjo9-1M,19097
15
+ skfolio/measures/__init__.py,sha256=b4hcaWXTzgQjF80ex3G1YJurfjLiii-ggrqJCIXsJTE,1631
16
+ skfolio/measures/_enums.py,sha256=NJcngwg9b2JMMiekwkWU9POfnDvgfUgtYtyV2VSFDVM,8934
17
+ skfolio/measures/_measures.py,sha256=Z7XHSyM9xfecDgOqm-lJQJhvZxasF018-oFS4QjC4g0,16829
18
+ skfolio/metrics/__init__.py,sha256=MomHJ5_bgjq4qUwGS2bfhNmG_ld0oQ4wK6y0Yy_Eonc,75
19
+ skfolio/metrics/_scorer.py,sha256=h1VuZk-zzn4rIChHl9FvM7RxqVT3b-jR1CEB-cr9F2s,4306
20
+ skfolio/model_selection/__init__.py,sha256=Hl90pxVZjxrEFrI8DCGmoR0CBo1rMGw1z-cR2scKyls,507
21
+ skfolio/model_selection/_combinatorial.py,sha256=uf5DzklgyLhfMKm0kWHXl2QLlUOAoiaxNb7cafrHVIg,19062
22
+ skfolio/model_selection/_validation.py,sha256=3eFYzPejjDZljc33vRehDuBQTEKCkrj-mZihMVuGA4s,10034
23
+ skfolio/model_selection/_walk_forward.py,sha256=T57HhdFGjG31mAufujHQuRK1uKfAdkiBx9eucQZ-WG0,15043
24
+ skfolio/moments/__init__.py,sha256=st8AYX3tHT2ZkqnnMNbS6CiwufvHq6Tl6nHtRVhtlq0,794
25
+ skfolio/moments/covariance/__init__.py,sha256=twNNLP44sv4-3EgET27UdJ-8wbVgF2cYmIn8DERwFTk,1068
26
+ skfolio/moments/covariance/_base.py,sha256=98o4YDFcOZ4X4hRFlrJAwWifULGzisEyRZaxFYW1qeA,3970
27
+ skfolio/moments/covariance/_denoise_covariance.py,sha256=kp90Jey_0NMHqZObhadO0FymF1TXBO6J8gvXoDbv9dE,6986
28
+ skfolio/moments/covariance/_detone_covariance.py,sha256=4hh-wvxLdNb61PJkF2_AHb5jDZogZiFRHtUoWuXywWw,6093
29
+ skfolio/moments/covariance/_empirical_covariance.py,sha256=mndfugw9Yp1Kus8rPAYcAIUcDT-6yX7By4gHhxyj6iI,3544
30
+ skfolio/moments/covariance/_ew_covariance.py,sha256=wqvErW0OfvWWSrz1-g_M5EdfA4ludAD3wbn-y3ec-gY,3716
31
+ skfolio/moments/covariance/_gerber_covariance.py,sha256=B_H02D7kWuUGaLUB9E39Kxh4f9mQESsoFJvuvKNJ0Jk,5899
32
+ skfolio/moments/covariance/_graphical_lasso_cv.py,sha256=_6WQ1sjYJRG8XDq8zb5YIPtDhpb8CmLhLBlfewBvqjM,6539
33
+ skfolio/moments/covariance/_implied_covariance.py,sha256=dD-LT7vXYs3-GGgxkQon3xCVLmA8zUuWIaExqY4vtXA,17736
34
+ skfolio/moments/covariance/_ledoit_wolf.py,sha256=iV92TpAopOAgQwa4zk7NF1rYdXkgm3uXn5ZZpbcMss0,4875
35
+ skfolio/moments/covariance/_oas.py,sha256=ru8BNz7vQU75ARCuUbtJstmR2fy2fiD9OXLDlztUm5g,3684
36
+ skfolio/moments/covariance/_shrunk_covariance.py,sha256=OOUahkiSdU3vFOb8i0iHtn8WU0AHl7o9pf8pFkG6Lv4,3095
37
+ skfolio/moments/expected_returns/__init__.py,sha256=Bi3c4bok3SyktdYeFUs3VepTrtpmDITIk9GXPhIuDc0,504
38
+ skfolio/moments/expected_returns/_base.py,sha256=xk9mzi48uCOHaMTGQBMr3FU7Ai_shxYhmGeOsVwjv9Q,871
39
+ skfolio/moments/expected_returns/_empirical_mu.py,sha256=Gg1t4pEkVXGzCTXkATc5G1riMmIcMGqvPnIl2vnYF2k,1863
40
+ skfolio/moments/expected_returns/_equilibrium_mu.py,sha256=x35nIc4aoLledFmFmKY00d5jesx8xfLU2Udh4JQIkEg,4407
41
+ skfolio/moments/expected_returns/_ew_mu.py,sha256=hMjv9XJYftQ9X7RiEQWwAGZktPPFWc0_FFDEFhqC-fI,2109
42
+ skfolio/moments/expected_returns/_shrunk_mu.py,sha256=UbLM2B3nwa2ndLR5Or1yetnj2dCAzKxqpr34JwXfvmo,8275
43
+ skfolio/optimization/__init__.py,sha256=dx5S-xSsISCXO9s64jjcDSqSsUl6TVAaIICWOc8aHK4,1021
44
+ skfolio/optimization/_base.py,sha256=LoRONJP70AwbFpdgqVS_g145pCx0JGkazjWvkQzT_iM,5748
45
+ skfolio/optimization/cluster/__init__.py,sha256=5Ek5dlLq9TqoLNHJad3EpBb35csuV-ilcoaKnc73lQc,388
46
+ skfolio/optimization/cluster/_nco.py,sha256=UQfWEdYVPU6cd-WBlp9uf44zDzpTrXDIvH82k5GOdh4,16413
47
+ skfolio/optimization/cluster/hierarchical/__init__.py,sha256=hZ6GzND_uGO3_derqt3wkOJ-jTtOs_x8Ifgo173EDxw,405
48
+ skfolio/optimization/cluster/hierarchical/_base.py,sha256=l8rJHCH_79FOPdDL2I0dmAWcVWnNkcXHtzt0U-L7BN8,16280
49
+ skfolio/optimization/cluster/hierarchical/_herc.py,sha256=fFUk-NEbP7ltjeiYQwzmVvXoVYYjd3JY_RjHoWVq0lw,20401
50
+ skfolio/optimization/cluster/hierarchical/_hrp.py,sha256=wUeTIwQxhV5yhqZ4UIr-61rgttTP7fPh91GtMaCNjPc,18158
51
+ skfolio/optimization/convex/__init__.py,sha256=mii3YiVwzAjnTMpJNK44jHevZXrfFxB-4z-3ZJP9nSc,570
52
+ skfolio/optimization/convex/_base.py,sha256=9-0aZ_nzU5F6CkxhjK-VTvyGz96xyFVuRG7lWRl_3i4,89430
53
+ skfolio/optimization/convex/_distributionally_robust.py,sha256=32jVUn2PG1agwuTSfj9QlP9GyQo_26sJcIwSqv9zy2I,17933
54
+ skfolio/optimization/convex/_maximum_diversification.py,sha256=T3-O4U6irJ7iU9IWzKWr5K4aHC8JxNyF6JW_IckVezM,19631
55
+ skfolio/optimization/convex/_mean_risk.py,sha256=77Dhe9xN6mSwgkXvXen5pySX-uHo3rOhPvpSQOd8l_Q,49509
56
+ skfolio/optimization/convex/_risk_budgeting.py,sha256=Lt13xD41PEMXjxa1yjnaIe7nEZ_bnUqeT3MLiUCfTWI,23631
57
+ skfolio/optimization/ensemble/__init__.py,sha256=8TXxcxH2_gG3C1xtgQj9OHHr0Le8lhdejtlURL6T3ZY,158
58
+ skfolio/optimization/ensemble/_base.py,sha256=GaNDQu6ivosYuwMrb-b0PhToCsNrmhSYyXkxeM8W4rU,3399
59
+ skfolio/optimization/ensemble/_stacking.py,sha256=Y79cHEOBJbtMgkKbgPKfgL6H9qYHi4VDm0JR5ugVwr4,14176
60
+ skfolio/optimization/naive/__init__.py,sha256=LNmqRIkGf4RLaOGLt2ZB7SHnBBraxxn0WbTkDQGCxd0,147
61
+ skfolio/optimization/naive/_naive.py,sha256=tQG6XqQKfWnbixjwtUiGNivGXuTPAYErkJMYl-UPYxQ,6437
62
+ skfolio/population/__init__.py,sha256=rsPPMUv95aTK7vmpPeQwF8NzFuBwk6RDo5g4HNaPzNM,80
63
+ skfolio/population/_population.py,sha256=ej45tdk_CcMlNToCsx2VUk2YRktK3k4cRczGBpjlnDE,30427
64
+ skfolio/portfolio/__init__.py,sha256=YeDSH0ZdyE-lcbDqpNw9IOltURtoM-ewAzzcec44Q5Q,586
65
+ skfolio/portfolio/_base.py,sha256=6HPFbCUve11lAhyD3KanDrlLjwzhVp6tIBy03XGBAGs,39613
66
+ skfolio/portfolio/_multi_period_portfolio.py,sha256=K2JfEwlPD9iGO58lOdk7WUbWuXZDWw2prPT5T7pOdto,24387
67
+ skfolio/portfolio/_portfolio.py,sha256=MoVuCM8rQnlzI2SvKmu1EDrNJfFFZRIyyhrZuNSdou0,32778
68
+ skfolio/pre_selection/__init__.py,sha256=gVrGZYwuQ--AZGlIZ2ddXst3n_wJluEUBXpysOH5DM0,482
69
+ skfolio/pre_selection/_drop_correlated.py,sha256=dgDl4YCHAC1lECSzuQGjI6rLoPNxvJ5bhtmwqduZH8Y,3822
70
+ skfolio/pre_selection/_select_complete.py,sha256=5xgy1c3jSXQHRIwWk1ZSuRw36WeEVIQNy55qCIl9nJY,3978
71
+ skfolio/pre_selection/_select_k_extremes.py,sha256=FSpvYN5vSGqRREFxceQiRjgGl50lJodpYJV7u-d3esQ,3065
72
+ skfolio/pre_selection/_select_non_dominated.py,sha256=q5kae1tpMrcbgKfkPQMy0RWaXknnWI0eJ5Ne-h9VKE8,5987
73
+ skfolio/pre_selection/_select_non_expiring.py,sha256=asD4xK83je4oWvB2ISu_HeRaDJjJ6pq88etr7CPkwPs,5088
74
+ skfolio/preprocessing/__init__.py,sha256=15A1bzfPsbfxxXgGP1gstf4R0E_347Wn18z5W5jH-hk,94
75
+ skfolio/preprocessing/_returns.py,sha256=6mdNi7Dun5eNK4LdqKAxP4CCZEVfAEz40HXVrOiAaLA,4561
76
+ skfolio/prior/__init__.py,sha256=ajpcpYe6qgnjoPE5Q3ofr4ckQ2WrBxUapED5VV0ShbA,446
77
+ skfolio/prior/_base.py,sha256=u9GLCKJl-Txiem5rIO-qkH3VIyem3taD6T9kMzsYPRY,1941
78
+ skfolio/prior/_black_litterman.py,sha256=rs0GKbVbDGG-Wdrfb8LVUqq4BE_j-DDLoPsC8sGQvBk,10390
79
+ skfolio/prior/_empirical.py,sha256=sJkqb60XRt_VsVWTrqDgdhfRn0MMOpmLbFeBcEUGEVs,7250
80
+ skfolio/prior/_factor_model.py,sha256=HiR6JdmusAB1RbjOGjFQgQaTCp_ctzrL5IzUCxgqGKA,11354
81
+ skfolio/uncertainty_set/__init__.py,sha256=NhGmOhrmIgAA5DwPs0y48RQb-pVrfkdRRIlPgQjPvJc,617
82
+ skfolio/uncertainty_set/_base.py,sha256=b2T0r8brV8h8gt96GcArFTEFNg3vKwN1qPmPN6QkdeU,4290
83
+ skfolio/uncertainty_set/_bootstrap.py,sha256=BRD8LhGKULkqqCBjLqU1EtCAMBkLJKEXJygQT6WsaAY,11249
84
+ skfolio/uncertainty_set/_empirical.py,sha256=ACqMVTBKibJm6E3IP4TOi3MYsxKMhiEoix5D_fp9X-w,9364
85
+ skfolio/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
86
+ skfolio/utils/bootstrap.py,sha256=3zY2kO_GQURKEcQMCasJOSByde9Mt2IAi3KJH0_a4mk,3550
87
+ skfolio/utils/equations.py,sha256=9XFcRB6_UuxlAR-dWwf1XPxAHO9p5DfcC-bF5onr7Ws,15539
88
+ skfolio/utils/sorting.py,sha256=lSjMvH2L-sSj-06B3MlwBrH1rtjCeGEe4hG894W7TE0,3504
89
+ skfolio/utils/stats.py,sha256=OoePNjqBNGKGJzHTqzG9-i8JXVJcx7k-qCVCE9TL-pY,16995
90
+ skfolio/utils/tools.py,sha256=m31oruGPMMTf5XYm3BruXyv1dv6I7rvhCpEVWUcusdE,20925
91
+ skfolio-0.7.0.dist-info/LICENSE,sha256=F6Gi-ZJX5BlVzYK8R9NcvAkAsKa7KO29xB1OScbrH6Q,1526
92
+ skfolio-0.7.0.dist-info/METADATA,sha256=uCACwU4Q--zy8DpkNlAANtkdrDQWTWEDBjfzpfD12U4,20109
93
+ skfolio-0.7.0.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
94
+ skfolio-0.7.0.dist-info/top_level.txt,sha256=NXEaoS9Ms7t32gxkb867nV0OKlU0KmssL7IJBVo0fJs,8
95
+ skfolio-0.7.0.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.5.0)
2
+ Generator: setuptools (75.6.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5