skfolio 0.5.0__tar.gz → 0.5.2__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.5.0/src/skfolio.egg-info → skfolio-0.5.2}/PKG-INFO +11 -5
- {skfolio-0.5.0 → skfolio-0.5.2}/README.rst +6 -3
- {skfolio-0.5.0 → skfolio-0.5.2}/pyproject.toml +6 -3
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/_base.py +4 -1
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_implied_covariance.py +1 -1
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/_base.py +12 -1
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/_risk_budgeting.py +5 -12
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/stats.py +2 -2
- {skfolio-0.5.0 → skfolio-0.5.2/src/skfolio.egg-info}/PKG-INFO +11 -5
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio.egg-info/requires.txt +4 -1
- {skfolio-0.5.0 → skfolio-0.5.2}/LICENSE +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/MANIFEST.in +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/setup.cfg +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/cluster/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/cluster/_hierarchical.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/data/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/distance/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/distance/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/distance/_distance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/exceptions.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/measures/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/measures/_enums.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/measures/_measures.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/metrics/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/metrics/_scorer.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/model_selection/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/model_selection/_combinatorial.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/model_selection/_validation.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/model_selection/_walk_forward.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_oas.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/_nco.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/ensemble/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/ensemble/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/naive/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/optimization/naive/_naive.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/population/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/population/_population.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/portfolio/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/portfolio/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/portfolio/_portfolio.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/_select_complete.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/pre_selection/_select_non_expiring.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/preprocessing/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/preprocessing/_returns.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/prior/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/prior/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/prior/_black_litterman.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/prior/_empirical.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/prior/_factor_model.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/typing.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/uncertainty_set/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/uncertainty_set/_base.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/uncertainty_set/_empirical.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/__init__.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/bootstrap.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/equations.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/sorting.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio/utils/tools.py +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio.egg-info/SOURCES.txt +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio.egg-info/dependency_links.txt +0 -0
- {skfolio-0.5.0 → skfolio-0.5.2}/src/skfolio.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: skfolio
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.2
|
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>
|
@@ -73,7 +73,7 @@ Requires-Dist: sphinx-gallery; extra == "docs"
|
|
73
73
|
Requires-Dist: sphinx-design; extra == "docs"
|
74
74
|
Requires-Dist: pydata-sphinx-theme==0.13.3; extra == "docs"
|
75
75
|
Requires-Dist: matplotlib; extra == "docs"
|
76
|
-
Requires-Dist: kaleido; extra == "docs"
|
76
|
+
Requires-Dist: kaleido==0.2.1; extra == "docs"
|
77
77
|
Requires-Dist: sphinx-copybutton; extra == "docs"
|
78
78
|
Requires-Dist: numpydoc; extra == "docs"
|
79
79
|
Requires-Dist: sphinx-togglebutton; extra == "docs"
|
@@ -82,10 +82,13 @@ Requires-Dist: sphinx-prompt; extra == "docs"
|
|
82
82
|
Requires-Dist: sphinxext.opengraph; extra == "docs"
|
83
83
|
Requires-Dist: sphinx-sitemap; extra == "docs"
|
84
84
|
Requires-Dist: sphinx-favicon; extra == "docs"
|
85
|
+
Requires-Dist: jupyterlite-sphinx; extra == "docs"
|
86
|
+
Requires-Dist: jupyterlite-pyodide-kernel; extra == "docs"
|
87
|
+
Requires-Dist: nbformat; extra == "docs"
|
85
88
|
|
86
89
|
.. -*- mode: rst -*-
|
87
90
|
|
88
|
-
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website|
|
91
|
+
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website| |JupyterLite|
|
89
92
|
|
90
93
|
.. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
|
91
94
|
:target: https://github.com/skfolio/skfolio/blob/main/LICENSE
|
@@ -117,14 +120,17 @@ Requires-Dist: sphinx-favicon; extra == "docs"
|
|
117
120
|
.. |Website| image:: https://img.shields.io/website.svg?down_color=red&down_message=down&up_color=53cc0d&up_message=up&url=https://skfolio.org
|
118
121
|
:target: https://skfolio.org
|
119
122
|
|
123
|
+
.. |JupyterLite| image:: https://jupyterlite.rtfd.io/en/latest/_static/badge.svg
|
124
|
+
:target: https://skfolio.org/lite
|
125
|
+
|
120
126
|
.. |PythonMinVersion| replace:: 3.10
|
121
127
|
.. |NumpyMinVersion| replace:: 1.23.4
|
122
128
|
.. |ScipyMinVersion| replace:: 1.8.0
|
123
129
|
.. |PandasMinVersion| replace:: 1.4.1
|
124
130
|
.. |CvxpyMinVersion| replace:: 1.4.1
|
125
|
-
.. |SklearnMinVersion| replace:: 1.
|
131
|
+
.. |SklearnMinVersion| replace:: 1.5.0
|
126
132
|
.. |JoblibMinVersion| replace:: 1.3.2
|
127
|
-
.. |PlotlyMinVersion| replace:: 5.
|
133
|
+
.. |PlotlyMinVersion| replace:: 5.22.0
|
128
134
|
|
129
135
|
|
130
136
|
===============
|
@@ -1,6 +1,6 @@
|
|
1
1
|
.. -*- mode: rst -*-
|
2
2
|
|
3
|
-
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website|
|
3
|
+
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website| |JupyterLite|
|
4
4
|
|
5
5
|
.. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
|
6
6
|
:target: https://github.com/skfolio/skfolio/blob/main/LICENSE
|
@@ -32,14 +32,17 @@
|
|
32
32
|
.. |Website| image:: https://img.shields.io/website.svg?down_color=red&down_message=down&up_color=53cc0d&up_message=up&url=https://skfolio.org
|
33
33
|
:target: https://skfolio.org
|
34
34
|
|
35
|
+
.. |JupyterLite| image:: https://jupyterlite.rtfd.io/en/latest/_static/badge.svg
|
36
|
+
:target: https://skfolio.org/lite
|
37
|
+
|
35
38
|
.. |PythonMinVersion| replace:: 3.10
|
36
39
|
.. |NumpyMinVersion| replace:: 1.23.4
|
37
40
|
.. |ScipyMinVersion| replace:: 1.8.0
|
38
41
|
.. |PandasMinVersion| replace:: 1.4.1
|
39
42
|
.. |CvxpyMinVersion| replace:: 1.4.1
|
40
|
-
.. |SklearnMinVersion| replace:: 1.
|
43
|
+
.. |SklearnMinVersion| replace:: 1.5.0
|
41
44
|
.. |JoblibMinVersion| replace:: 1.3.2
|
42
|
-
.. |PlotlyMinVersion| replace:: 5.
|
45
|
+
.. |PlotlyMinVersion| replace:: 5.22.0
|
43
46
|
|
44
47
|
|
45
48
|
===============
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
4
4
|
|
5
5
|
[project]
|
6
6
|
name = "skfolio"
|
7
|
-
version = "0.5.
|
7
|
+
version = "0.5.2"
|
8
8
|
maintainers = [
|
9
9
|
{ name = "Hugo Delatte", email = "delatte.hugo@gmail.com" },
|
10
10
|
]
|
@@ -70,7 +70,7 @@ docs = [
|
|
70
70
|
"sphinx-design",
|
71
71
|
"pydata-sphinx-theme==0.13.3",
|
72
72
|
"matplotlib",
|
73
|
-
"kaleido",
|
73
|
+
"kaleido==0.2.1",
|
74
74
|
"sphinx-copybutton",
|
75
75
|
"numpydoc",
|
76
76
|
"sphinx-togglebutton",
|
@@ -78,7 +78,10 @@ docs = [
|
|
78
78
|
"sphinx-prompt",
|
79
79
|
"sphinxext.opengraph",
|
80
80
|
"sphinx-sitemap",
|
81
|
-
"sphinx-favicon"
|
81
|
+
"sphinx-favicon",
|
82
|
+
"jupyterlite-sphinx",
|
83
|
+
"jupyterlite-pyodide-kernel",
|
84
|
+
"nbformat",
|
82
85
|
]
|
83
86
|
|
84
87
|
[project.urls]
|
@@ -11,6 +11,7 @@
|
|
11
11
|
import gzip
|
12
12
|
import os
|
13
13
|
import shutil
|
14
|
+
import sys
|
14
15
|
import urllib.request as ur
|
15
16
|
from importlib import resources
|
16
17
|
from pathlib import Path
|
@@ -140,7 +141,9 @@ def download_dataset(
|
|
140
141
|
DataFrame with each row representing one observation and each column
|
141
142
|
representing the asset price of a given observation.
|
142
143
|
"""
|
143
|
-
|
144
|
+
# Use a CORS proxy when triggering requests from the browser
|
145
|
+
url_prefix = "https://corsproxy.io/?" if sys.platform == "emscripten" else ""
|
146
|
+
url = url_prefix + (
|
144
147
|
f"https://github.com/skfolio/skfolio-datasets/raw/main/"
|
145
148
|
f"datasets/{data_filename}.csv.gz"
|
146
149
|
)
|
@@ -259,7 +259,7 @@ class ImpliedCovariance(BaseCovariance):
|
|
259
259
|
if assets_names is not None:
|
260
260
|
vol_assets_names = get_feature_names(implied_vol)
|
261
261
|
if vol_assets_names is not None:
|
262
|
-
missing_assets = assets_names[~np.
|
262
|
+
missing_assets = assets_names[~np.isin(assets_names, vol_assets_names)]
|
263
263
|
if len(missing_assets) > 0:
|
264
264
|
raise ValueError(
|
265
265
|
f"The following assets are missing from "
|
@@ -622,7 +622,11 @@ class ConvexOptimization(BaseOptimization, ABC):
|
|
622
622
|
self._cvx_cache = {}
|
623
623
|
|
624
624
|
def _get_weight_constraints(
|
625
|
-
self,
|
625
|
+
self,
|
626
|
+
n_assets: int,
|
627
|
+
w: cp.Variable,
|
628
|
+
factor: skt.Factor,
|
629
|
+
allow_negative_weights: bool = True,
|
626
630
|
) -> list[cpc.Constraint]:
|
627
631
|
"""Compute weight constraints from input parameters.
|
628
632
|
|
@@ -651,6 +655,13 @@ class ConvexOptimization(BaseOptimization, ABC):
|
|
651
655
|
fill_value=0,
|
652
656
|
name="min_weights",
|
653
657
|
)
|
658
|
+
|
659
|
+
if not allow_negative_weights and np.any(min_weights < 0):
|
660
|
+
raise ValueError(
|
661
|
+
f"{self.__class__.__name__} must have non negative `min_weights` "
|
662
|
+
f"constraint otherwise the problem becomes non-convex."
|
663
|
+
)
|
664
|
+
|
654
665
|
constraints.append(
|
655
666
|
w * self._scale_constraints
|
656
667
|
>= min_weights * factor * self._scale_constraints
|
@@ -432,15 +432,6 @@ class RiskBudgeting(ConvexOptimization):
|
|
432
432
|
self.min_return = min_return
|
433
433
|
self.risk_budget = risk_budget
|
434
434
|
|
435
|
-
def _validation(self) -> None:
|
436
|
-
if not isinstance(self.risk_measure, RiskMeasure):
|
437
|
-
raise TypeError("risk_measure must be of type `RiskMeasure`")
|
438
|
-
if self.min_weights < 0:
|
439
|
-
raise ValueError(
|
440
|
-
"Risk Budgeting must have non negative `min_weights` constraint"
|
441
|
-
" otherwise the problem becomes non-convex."
|
442
|
-
)
|
443
|
-
|
444
435
|
def fit(self, X: npt.ArrayLike, y=None, **fit_params) -> "RiskBudgeting":
|
445
436
|
"""Fit the Risk Budgeting Optimization estimator.
|
446
437
|
|
@@ -462,8 +453,10 @@ class RiskBudgeting(ConvexOptimization):
|
|
462
453
|
routed_params = skm.process_routing(self, "fit", **fit_params)
|
463
454
|
|
464
455
|
self._check_feature_names(X, reset=True)
|
465
|
-
|
466
|
-
self.
|
456
|
+
|
457
|
+
if not isinstance(self.risk_measure, RiskMeasure):
|
458
|
+
raise TypeError("risk_measure must be of type `RiskMeasure`")
|
459
|
+
|
467
460
|
# Used to avoid adding multiple times similar constrains linked to identical
|
468
461
|
# risk models
|
469
462
|
self.prior_estimator_ = check_estimator(
|
@@ -518,7 +511,7 @@ class RiskBudgeting(ConvexOptimization):
|
|
518
511
|
|
519
512
|
# weight constraints
|
520
513
|
constraints += self._get_weight_constraints(
|
521
|
-
n_assets=n_assets, w=w, factor=factor
|
514
|
+
n_assets=n_assets, w=w, factor=factor, allow_negative_weights=False
|
522
515
|
)
|
523
516
|
|
524
517
|
parameters_values = []
|
@@ -185,7 +185,7 @@ def is_cholesky_dec(x: np.ndarray) -> bool:
|
|
185
185
|
try:
|
186
186
|
np.linalg.cholesky(x)
|
187
187
|
return True
|
188
|
-
except np.linalg.
|
188
|
+
except np.linalg.LinAlgError:
|
189
189
|
return False
|
190
190
|
|
191
191
|
|
@@ -200,7 +200,7 @@ def is_positive_definite(x: np.ndarray) -> bool:
|
|
200
200
|
Returns
|
201
201
|
-------
|
202
202
|
value : bool
|
203
|
-
True if
|
203
|
+
True if the matrix is positive definite, False otherwise.
|
204
204
|
"""
|
205
205
|
return np.all(np.linalg.eigvals(x) > 0)
|
206
206
|
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: skfolio
|
3
|
-
Version: 0.5.
|
3
|
+
Version: 0.5.2
|
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>
|
@@ -73,7 +73,7 @@ Requires-Dist: sphinx-gallery; extra == "docs"
|
|
73
73
|
Requires-Dist: sphinx-design; extra == "docs"
|
74
74
|
Requires-Dist: pydata-sphinx-theme==0.13.3; extra == "docs"
|
75
75
|
Requires-Dist: matplotlib; extra == "docs"
|
76
|
-
Requires-Dist: kaleido; extra == "docs"
|
76
|
+
Requires-Dist: kaleido==0.2.1; extra == "docs"
|
77
77
|
Requires-Dist: sphinx-copybutton; extra == "docs"
|
78
78
|
Requires-Dist: numpydoc; extra == "docs"
|
79
79
|
Requires-Dist: sphinx-togglebutton; extra == "docs"
|
@@ -82,10 +82,13 @@ Requires-Dist: sphinx-prompt; extra == "docs"
|
|
82
82
|
Requires-Dist: sphinxext.opengraph; extra == "docs"
|
83
83
|
Requires-Dist: sphinx-sitemap; extra == "docs"
|
84
84
|
Requires-Dist: sphinx-favicon; extra == "docs"
|
85
|
+
Requires-Dist: jupyterlite-sphinx; extra == "docs"
|
86
|
+
Requires-Dist: jupyterlite-pyodide-kernel; extra == "docs"
|
87
|
+
Requires-Dist: nbformat; extra == "docs"
|
85
88
|
|
86
89
|
.. -*- mode: rst -*-
|
87
90
|
|
88
|
-
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website|
|
91
|
+
|Licence| |Codecov| |Black| |PythonVersion| |PyPi| |CI/CD| |Downloads| |Ruff| |Contribution| |Website| |JupyterLite|
|
89
92
|
|
90
93
|
.. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
|
91
94
|
:target: https://github.com/skfolio/skfolio/blob/main/LICENSE
|
@@ -117,14 +120,17 @@ Requires-Dist: sphinx-favicon; extra == "docs"
|
|
117
120
|
.. |Website| image:: https://img.shields.io/website.svg?down_color=red&down_message=down&up_color=53cc0d&up_message=up&url=https://skfolio.org
|
118
121
|
:target: https://skfolio.org
|
119
122
|
|
123
|
+
.. |JupyterLite| image:: https://jupyterlite.rtfd.io/en/latest/_static/badge.svg
|
124
|
+
:target: https://skfolio.org/lite
|
125
|
+
|
120
126
|
.. |PythonMinVersion| replace:: 3.10
|
121
127
|
.. |NumpyMinVersion| replace:: 1.23.4
|
122
128
|
.. |ScipyMinVersion| replace:: 1.8.0
|
123
129
|
.. |PandasMinVersion| replace:: 1.4.1
|
124
130
|
.. |CvxpyMinVersion| replace:: 1.4.1
|
125
|
-
.. |SklearnMinVersion| replace:: 1.
|
131
|
+
.. |SklearnMinVersion| replace:: 1.5.0
|
126
132
|
.. |JoblibMinVersion| replace:: 1.3.2
|
127
|
-
.. |PlotlyMinVersion| replace:: 5.
|
133
|
+
.. |PlotlyMinVersion| replace:: 5.22.0
|
128
134
|
|
129
135
|
|
130
136
|
===============
|
@@ -12,7 +12,7 @@ sphinx-gallery
|
|
12
12
|
sphinx-design
|
13
13
|
pydata-sphinx-theme==0.13.3
|
14
14
|
matplotlib
|
15
|
-
kaleido
|
15
|
+
kaleido==0.2.1
|
16
16
|
sphinx-copybutton
|
17
17
|
numpydoc
|
18
18
|
sphinx-togglebutton
|
@@ -20,6 +20,9 @@ sphinx-favicon
|
|
20
20
|
sphinx-prompt
|
21
21
|
sphinxext.opengraph
|
22
22
|
sphinx-sitemap
|
23
|
+
jupyterlite-sphinx
|
24
|
+
jupyterlite-pyodide-kernel
|
25
|
+
nbformat
|
23
26
|
|
24
27
|
[tests]
|
25
28
|
pytest
|
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
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|