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.
- skfolio/__init__.py +5 -5
- skfolio/cluster/__init__.py +1 -1
- skfolio/cluster/_hierarchical.py +1 -1
- skfolio/datasets/__init__.py +2 -2
- skfolio/distance/__init__.py +3 -3
- skfolio/distance/_distance.py +7 -6
- skfolio/exceptions.py +2 -2
- skfolio/measures/__init__.py +23 -23
- skfolio/model_selection/__init__.py +2 -2
- skfolio/moments/__init__.py +11 -11
- skfolio/moments/covariance/__init__.py +6 -6
- skfolio/moments/covariance/_denoise_covariance.py +2 -1
- skfolio/moments/covariance/_detone_covariance.py +2 -1
- skfolio/moments/covariance/_empirical_covariance.py +2 -1
- skfolio/moments/covariance/_ew_covariance.py +2 -1
- skfolio/moments/covariance/_gerber_covariance.py +2 -1
- skfolio/moments/covariance/_implied_covariance.py +1 -1
- skfolio/moments/expected_returns/__init__.py +2 -2
- skfolio/moments/expected_returns/_empirical_mu.py +2 -1
- skfolio/moments/expected_returns/_equilibrium_mu.py +2 -1
- skfolio/moments/expected_returns/_ew_mu.py +2 -1
- skfolio/moments/expected_returns/_shrunk_mu.py +2 -1
- skfolio/optimization/__init__.py +10 -10
- skfolio/optimization/cluster/__init__.py +1 -1
- skfolio/optimization/cluster/_nco.py +3 -2
- skfolio/optimization/cluster/hierarchical/__init__.py +1 -1
- skfolio/optimization/cluster/hierarchical/_herc.py +2 -1
- skfolio/optimization/cluster/hierarchical/_hrp.py +2 -1
- skfolio/optimization/convex/__init__.py +3 -3
- skfolio/optimization/convex/_base.py +2 -1
- skfolio/optimization/convex/_distributionally_robust.py +4 -1
- skfolio/optimization/convex/_maximum_diversification.py +3 -1
- skfolio/optimization/convex/_mean_risk.py +5 -2
- skfolio/optimization/convex/_risk_budgeting.py +3 -1
- skfolio/optimization/ensemble/_stacking.py +2 -2
- skfolio/optimization/naive/__init__.py +1 -1
- skfolio/optimization/naive/_naive.py +3 -2
- skfolio/portfolio/__init__.py +1 -1
- skfolio/portfolio/_base.py +1 -0
- skfolio/portfolio/_portfolio.py +1 -0
- skfolio/pre_selection/__init__.py +1 -1
- skfolio/pre_selection/_drop_correlated.py +1 -1
- skfolio/pre_selection/_select_complete.py +6 -4
- skfolio/pre_selection/_select_k_extremes.py +1 -1
- skfolio/pre_selection/_select_non_dominated.py +1 -1
- skfolio/pre_selection/_select_non_expiring.py +6 -4
- skfolio/prior/__init__.py +3 -3
- skfolio/prior/_black_litterman.py +2 -1
- skfolio/prior/_empirical.py +2 -1
- skfolio/prior/_factor_model.py +2 -1
- skfolio/typing.py +6 -6
- skfolio/uncertainty_set/__init__.py +5 -5
- skfolio/uncertainty_set/_base.py +3 -2
- skfolio/utils/stats.py +8 -8
- skfolio/utils/tools.py +10 -10
- {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/METADATA +32 -31
- skfolio-0.7.0.dist-info/RECORD +95 -0
- {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/WHEEL +1 -1
- skfolio-0.6.0.dist-info/RECORD +0 -95
- {skfolio-0.6.0.dist-info → skfolio-0.7.0.dist-info}/LICENSE +0 -0
- {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
|
-
|
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 =
|
333
|
+
_, y = skv.validate_data(self, X, y, multi_output=True)
|
334
334
|
else:
|
335
|
-
_ =
|
335
|
+
_ = skv.validate_data(self, X)
|
336
336
|
|
337
337
|
if isinstance(self.cv, BaseCombinatorialCV):
|
338
338
|
X_pred = np.array(
|
@@ -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 =
|
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 =
|
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
|
skfolio/portfolio/__init__.py
CHANGED
@@ -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", "
|
13
|
+
__all__ = ["BasePortfolio", "MultiPeriodPortfolio", "Portfolio"]
|
skfolio/portfolio/_base.py
CHANGED
skfolio/portfolio/_portfolio.py
CHANGED
@@ -74,7 +74,7 @@ class DropCorrelated(skf.SelectorMixin, skb.BaseEstimator):
|
|
74
74
|
self : DropCorrelated
|
75
75
|
Fitted estimator.
|
76
76
|
"""
|
77
|
-
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 =
|
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
|
116
|
-
|
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 =
|
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 =
|
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
|
-
_ =
|
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
|
148
|
-
|
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
|
-
"
|
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
|
-
|
186
|
+
skv.validate_data(self, X)
|
186
187
|
|
187
188
|
n_assets = prior_returns.shape[1]
|
188
189
|
views = np.asarray(self.views)
|
skfolio/prior/_empirical.py
CHANGED
@@ -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 =
|
194
|
+
X = skv.validate_data(self, X)
|
194
195
|
self.prior_model_ = PriorModel(
|
195
196
|
mu=mu,
|
196
197
|
covariance=covariance,
|
skfolio/prior/_factor_model.py
CHANGED
@@ -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 =
|
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
|
-
"
|
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
|
-
"
|
20
|
-
"EmpiricalCovarianceUncertaintySet",
|
21
|
-
"BootstrapMuUncertaintySet",
|
17
|
+
"BaseMuUncertaintySet",
|
22
18
|
"BootstrapCovarianceUncertaintySet",
|
19
|
+
"BootstrapMuUncertaintySet",
|
20
|
+
"EmpiricalCovarianceUncertaintySet",
|
21
|
+
"EmpiricalMuUncertaintySet",
|
22
|
+
"UncertaintySet",
|
23
23
|
]
|
skfolio/uncertainty_set/_base.py
CHANGED
@@ -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 =
|
117
|
+
X = skv.validate_data(self, X)
|
117
118
|
else:
|
118
|
-
X, y =
|
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
|
-
"
|
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
|
-
"
|
32
|
-
"
|
33
|
-
"
|
34
|
-
"safe_indexing",
|
26
|
+
"cache_method",
|
27
|
+
"cached_property_slots",
|
28
|
+
"check_estimator",
|
35
29
|
"deduplicate_names",
|
36
30
|
"default_asset_names",
|
37
|
-
"
|
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.
|
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
|
60
|
-
Requires-Dist: scipy
|
61
|
-
Requires-Dist: pandas
|
62
|
-
Requires-Dist: cvxpy
|
63
|
-
Requires-Dist: scikit-learn
|
64
|
-
Requires-Dist: joblib
|
65
|
-
Requires-Dist: plotly
|
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[
|
68
|
-
Requires-Dist: Sphinx
|
69
|
-
Requires-Dist: sphinx-gallery
|
70
|
-
Requires-Dist: sphinx-design
|
71
|
-
Requires-Dist: pydata-sphinx-theme
|
72
|
-
Requires-Dist: matplotlib
|
73
|
-
Requires-Dist: kaleido
|
74
|
-
Requires-Dist: sphinx-copybutton
|
75
|
-
Requires-Dist: numpydoc
|
76
|
-
Requires-Dist: sphinx-togglebutton
|
77
|
-
Requires-Dist: sphinx-favicon
|
78
|
-
Requires-Dist: sphinx-prompt
|
79
|
-
Requires-Dist: sphinxext.opengraph
|
80
|
-
Requires-Dist: sphinx-sitemap
|
81
|
-
Requires-Dist: jupyterlite-sphinx
|
82
|
-
Requires-Dist: jupyterlite-pyodide-kernel
|
83
|
-
Requires-Dist: nbformat
|
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,,
|