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.
- {skfolio-0.8.0/src/skfolio.egg-info → skfolio-0.9.0}/PKG-INFO +1 -1
- {skfolio-0.8.0 → skfolio-0.9.0}/pyproject.toml +1 -1
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/population/_population.py +1 -2
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/__init__.py +2 -0
- skfolio-0.9.0/src/skfolio/pre_selection/_drop_zero_variance.py +75 -0
- {skfolio-0.8.0 → skfolio-0.9.0/src/skfolio.egg-info}/PKG-INFO +1 -1
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/SOURCES.txt +1 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/LICENSE +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/MANIFEST.in +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/README.rst +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/setup.cfg +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/cluster/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/cluster/_hierarchical.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distance/_distance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_clayton.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_gaussian.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_gumbel.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_independent.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_joe.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_selection.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_student_t.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/copula/_utils.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_utils.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/multivariate/_vine_copula.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_gaussian.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_johnson_su.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_selection.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_student_t.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/exceptions.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/_enums.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/measures/_measures.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/metrics/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/metrics/_scorer.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_combinatorial.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_validation.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/model_selection/_walk_forward.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_implied_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_oas.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/_nco.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/naive/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/optimization/naive/_naive.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/population/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/portfolio/_portfolio.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_complete.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/pre_selection/_select_non_expiring.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/preprocessing/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/preprocessing/_returns.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_black_litterman.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_empirical.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_factor_model.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/prior/_synthetic_data.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/synthetic_returns/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/typing.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_base.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/uncertainty_set/_empirical.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/__init__.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/bootstrap.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/equations.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/sorting.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/stats.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/utils/tools.py +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/dependency_links.txt +0 -0
- {skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio.egg-info/requires.txt +0 -0
- {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.
|
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>
|
@@ -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.
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{skfolio-0.8.0 → skfolio-0.9.0}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|