skfolio 0.0.11__tar.gz → 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. {skfolio-0.0.11/src/skfolio.egg-info → skfolio-0.1.0}/PKG-INFO +7 -4
  2. {skfolio-0.0.11 → skfolio-0.1.0}/README.rst +6 -3
  3. {skfolio-0.0.11 → skfolio-0.1.0}/pyproject.toml +1 -1
  4. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/measures/_measures.py +25 -0
  5. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/portfolio/_base.py +5 -6
  6. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/portfolio/_multi_period_portfolio.py +6 -3
  7. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/fixes/_dendrogram.py +7 -9
  8. {skfolio-0.0.11 → skfolio-0.1.0/src/skfolio.egg-info}/PKG-INFO +7 -4
  9. {skfolio-0.0.11 → skfolio-0.1.0}/LICENSE +0 -0
  10. {skfolio-0.0.11 → skfolio-0.1.0}/MANIFEST.in +0 -0
  11. {skfolio-0.0.11 → skfolio-0.1.0}/setup.cfg +0 -0
  12. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/__init__.py +0 -0
  13. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/cluster/__init__.py +0 -0
  14. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/cluster/_hierarchical.py +0 -0
  15. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/__init__.py +0 -0
  16. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/_base.py +0 -0
  17. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/data/__init__.py +0 -0
  18. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
  19. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
  20. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
  21. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/distance/__init__.py +0 -0
  22. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/distance/_base.py +0 -0
  23. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/distance/_distance.py +0 -0
  24. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/exceptions.py +0 -0
  25. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/measures/__init__.py +0 -0
  26. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/measures/_enums.py +0 -0
  27. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/metrics/__init__.py +0 -0
  28. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/metrics/_scorer.py +0 -0
  29. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/model_selection/__init__.py +0 -0
  30. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/model_selection/_combinatorial.py +0 -0
  31. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/model_selection/_validation.py +0 -0
  32. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/model_selection/_walk_forward.py +0 -0
  33. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/__init__.py +0 -0
  34. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/covariance/__init__.py +0 -0
  35. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/covariance/_base.py +0 -0
  36. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/covariance/_covariance.py +0 -0
  37. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/expected_returns/__init__.py +0 -0
  38. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/expected_returns/_base.py +0 -0
  39. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/moments/expected_returns/_expected_returns.py +0 -0
  40. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/__init__.py +0 -0
  41. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/_base.py +0 -0
  42. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/__init__.py +0 -0
  43. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/_nco.py +0 -0
  44. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
  45. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
  46. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
  47. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
  48. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/__init__.py +0 -0
  49. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/_base.py +0 -0
  50. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
  51. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
  52. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
  53. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
  54. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/ensemble/__init__.py +0 -0
  55. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/ensemble/_base.py +0 -0
  56. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
  57. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/naive/__init__.py +0 -0
  58. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/optimization/naive/_naive.py +0 -0
  59. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/population/__init__.py +0 -0
  60. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/population/_population.py +0 -0
  61. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/portfolio/__init__.py +0 -0
  62. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/portfolio/_portfolio.py +0 -0
  63. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/pre_selection/__init__.py +0 -0
  64. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/pre_selection/_pre_selection.py +0 -0
  65. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/preprocessing/__init__.py +0 -0
  66. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/preprocessing/_returns.py +0 -0
  67. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/prior/__init__.py +0 -0
  68. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/prior/_base.py +0 -0
  69. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/prior/_black_litterman.py +0 -0
  70. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/prior/_empirical.py +0 -0
  71. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/prior/_factor_model.py +0 -0
  72. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/typing.py +0 -0
  73. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/uncertainty_set/__init__.py +0 -0
  74. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/uncertainty_set/_base.py +0 -0
  75. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
  76. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/uncertainty_set/_empirical.py +0 -0
  77. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/__init__.py +0 -0
  78. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/bootstrap.py +0 -0
  79. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/equations.py +0 -0
  80. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/fixes/__init__.py +0 -0
  81. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/sorting.py +0 -0
  82. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/stats.py +0 -0
  83. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio/utils/tools.py +0 -0
  84. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio.egg-info/SOURCES.txt +0 -0
  85. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio.egg-info/dependency_links.txt +0 -0
  86. {skfolio-0.0.11 → skfolio-0.1.0}/src/skfolio.egg-info/requires.txt +0 -0
  87. {skfolio-0.0.11 → skfolio-0.1.0}/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.0.11
3
+ Version: 0.1.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>
@@ -86,7 +86,7 @@ Requires-Dist: sphinx-favicon; extra == "docs"
86
86
 
87
87
  .. -*- mode: rst -*-
88
88
 
89
- |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Website|_
89
+ |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Contribution|_ |Website|_
90
90
 
91
91
  .. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
92
92
  .. _Licence: https://github.com/skfolio/skfolio/blob/main/LICENSE
@@ -112,7 +112,10 @@ Requires-Dist: sphinx-favicon; extra == "docs"
112
112
  .. |Ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
113
113
  .. _Ruff: https://github.com/astral-sh/ruff
114
114
 
115
- .. |Website| image:: https://img.shields.io/website-up-down-green-red/http/skfolio.org
115
+ .. |Contribution| image:: https://img.shields.io/badge/Contributions-Welcome-blue
116
+ .. _Contribution: https://github.com/skfolio/skfolio/blob/main/CONTRIBUTING.md
117
+
118
+ .. |Website| image:: https://img.shields.io/website-up-down-53cc0d-red/http/skfolio.org
116
119
  .. _Website: https://skfolio.org
117
120
 
118
121
  .. |PythonMinVersion| replace:: 3.10
@@ -128,7 +131,7 @@ Requires-Dist: sphinx-favicon; extra == "docs"
128
131
  ===============
129
132
  |icon| skfolio
130
133
  ===============
131
- .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/favicon.png
134
+ .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/logo_animate.svg
132
135
  :width: 100
133
136
  :alt: skfolio documentation
134
137
  :target: https://skfolio.org/
@@ -1,6 +1,6 @@
1
1
  .. -*- mode: rst -*-
2
2
 
3
- |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Website|_
3
+ |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Contribution|_ |Website|_
4
4
 
5
5
  .. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
6
6
  .. _Licence: https://github.com/skfolio/skfolio/blob/main/LICENSE
@@ -26,7 +26,10 @@
26
26
  .. |Ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
27
27
  .. _Ruff: https://github.com/astral-sh/ruff
28
28
 
29
- .. |Website| image:: https://img.shields.io/website-up-down-green-red/http/skfolio.org
29
+ .. |Contribution| image:: https://img.shields.io/badge/Contributions-Welcome-blue
30
+ .. _Contribution: https://github.com/skfolio/skfolio/blob/main/CONTRIBUTING.md
31
+
32
+ .. |Website| image:: https://img.shields.io/website-up-down-53cc0d-red/http/skfolio.org
30
33
  .. _Website: https://skfolio.org
31
34
 
32
35
  .. |PythonMinVersion| replace:: 3.10
@@ -42,7 +45,7 @@
42
45
  ===============
43
46
  |icon| skfolio
44
47
  ===============
45
- .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/favicon.png
48
+ .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/logo_animate.svg
46
49
  :width: 100
47
50
  :alt: skfolio documentation
48
51
  :target: https://skfolio.org/
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "skfolio"
7
- version = "0.0.11"
7
+ version = "0.1.0"
8
8
  maintainers = [
9
9
  { name = "Hugo Delatte", email = "delatte.hugo@gmail.com" },
10
10
  ]
@@ -608,3 +608,28 @@ def gini_mean_difference(returns: np.ndarray) -> float:
608
608
  """
609
609
  w = owa_gmd_weights(len(returns))
610
610
  return float(w @ np.sort(returns, axis=0))
611
+
612
+
613
+ def effective_number_assets(weights: np.ndarray) -> float:
614
+ r"""
615
+ Computes the effective number of assets, defined as the inverse of the Herfindahl index [1]_:
616
+ .. math:: N_{eff} = \frac{1}{\Vert w \Vert_{2}^{2}}
617
+
618
+ It quantifies portfolio concentration, with a higher value indicating a more diversified portfolio.
619
+
620
+ Parameters
621
+ ----------
622
+ weights : ndarray of shape (n_assets,)
623
+ Weights of the assets.
624
+
625
+ Returns
626
+ -------
627
+ value : float
628
+ Effective number of assets.
629
+
630
+ References
631
+ ----------
632
+ .. [1] "Banking and Financial Institutions Law in a Nutshell".
633
+ Lovett, William Anthony (1988)
634
+ """
635
+ return 1.0 / (np.power(weights, 2).sum())
@@ -369,7 +369,6 @@ class BasePortfolio:
369
369
  _read_only_attrs: ClassVar[set] = {
370
370
  "returns",
371
371
  "observations",
372
- "n_observations",
373
372
  }
374
373
 
375
374
  # Arguments globally used in measures computation
@@ -401,7 +400,6 @@ class BasePortfolio:
401
400
  # public read-only
402
401
  "returns",
403
402
  "observations",
404
- "n_observations",
405
403
  # private
406
404
  "_loaded",
407
405
  # custom getter and setter
@@ -521,7 +519,6 @@ class BasePortfolio:
521
519
  self._fitness_measures = [PerfMeasure.MEAN, RiskMeasure.VARIANCE]
522
520
  else:
523
521
  self._fitness_measures = fitness_measures
524
- self.n_observations = len(observations)
525
522
  self._loaded = True
526
523
 
527
524
  def __reduce__(self):
@@ -531,9 +528,6 @@ class BasePortfolio:
531
528
  [getattr(self, arg) for arg in args_names(self.__init__)]
532
529
  )
533
530
 
534
- def __len__(self) -> int:
535
- return len(self.observations)
536
-
537
531
  def __repr__(self) -> str:
538
532
  return f"<{type(self).__name__} {self.name}>"
539
533
 
@@ -679,6 +673,11 @@ class BasePortfolio:
679
673
  return mt.get_drawdowns(returns=self.returns, compounded=self.compounded)
680
674
 
681
675
  # Classic property
676
+ @property
677
+ def n_observations(self) -> int:
678
+ """Number of observations"""
679
+ return len(self.observations)
680
+
682
681
  @property
683
682
  def returns_df(self) -> pd.Series:
684
683
  """Portfolio returns DataFrame."""
@@ -369,6 +369,9 @@ class MultiPeriodPortfolio(BasePortfolio):
369
369
  self.check_observations_order = check_observations_order
370
370
  self._set_portfolios(portfolios=portfolios)
371
371
 
372
+ def __len__(self) -> int:
373
+ return len(self.portfolios)
374
+
372
375
  def __getitem__(self, key: int | slice) -> Portfolio | list[Portfolio]:
373
376
  return self._portfolios[key]
374
377
 
@@ -571,12 +574,12 @@ class MultiPeriodPortfolio(BasePortfolio):
571
574
  """
572
575
  df = super().summary(formatted=formatted)
573
576
  portfolios_number = len(self)
574
- avg_assets_per_portfolio = np.mean([len(p) for p in self])
577
+ avg_assets_per_portfolio = np.mean([p.n_assets for p in self])
575
578
  if formatted:
576
579
  portfolios_number = str(int(portfolios_number))
577
580
  avg_assets_per_portfolio = f"{avg_assets_per_portfolio:0.1f}"
578
- df["Portfolios number"] = portfolios_number
579
- df["Avg nb of assets per portfolio"] = avg_assets_per_portfolio
581
+ df["Portfolios Number"] = portfolios_number
582
+ df["Avg nb of Assets per Portfolio"] = avg_assets_per_portfolio
580
583
  return df
581
584
 
582
585
  # Public methods
@@ -290,15 +290,13 @@ class _Dendrogram:
290
290
  Sets and returns default layout object for dendrogram figure.
291
291
 
292
292
  """
293
- self.layout.update(
294
- {
295
- "showlegend": False,
296
- "autosize": False,
297
- "hovermode": "closest",
298
- "width": width,
299
- "height": height,
300
- }
301
- )
293
+ self.layout.update({
294
+ "showlegend": False,
295
+ "autosize": False,
296
+ "hovermode": "closest",
297
+ "width": width,
298
+ "height": height,
299
+ })
302
300
 
303
301
  self.set_axis_layout(self.xaxis)
304
302
  self.set_axis_layout(self.yaxis)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: skfolio
3
- Version: 0.0.11
3
+ Version: 0.1.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>
@@ -86,7 +86,7 @@ Requires-Dist: sphinx-favicon; extra == "docs"
86
86
 
87
87
  .. -*- mode: rst -*-
88
88
 
89
- |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Website|_
89
+ |Licence|_ |Codecov|_ |Black|_ |PythonVersion|_ |PyPi|_ |CI/CD|_ |Downloads|_ |Ruff|_ |Contribution|_ |Website|_
90
90
 
91
91
  .. |Licence| image:: https://img.shields.io/badge/License-BSD%203--Clause-blue.svg
92
92
  .. _Licence: https://github.com/skfolio/skfolio/blob/main/LICENSE
@@ -112,7 +112,10 @@ Requires-Dist: sphinx-favicon; extra == "docs"
112
112
  .. |Ruff| image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
113
113
  .. _Ruff: https://github.com/astral-sh/ruff
114
114
 
115
- .. |Website| image:: https://img.shields.io/website-up-down-green-red/http/skfolio.org
115
+ .. |Contribution| image:: https://img.shields.io/badge/Contributions-Welcome-blue
116
+ .. _Contribution: https://github.com/skfolio/skfolio/blob/main/CONTRIBUTING.md
117
+
118
+ .. |Website| image:: https://img.shields.io/website-up-down-53cc0d-red/http/skfolio.org
116
119
  .. _Website: https://skfolio.org
117
120
 
118
121
  .. |PythonMinVersion| replace:: 3.10
@@ -128,7 +131,7 @@ Requires-Dist: sphinx-favicon; extra == "docs"
128
131
  ===============
129
132
  |icon| skfolio
130
133
  ===============
131
- .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/favicon.png
134
+ .. |icon| image:: https://raw.githubusercontent.com/skfolio/skfolio/master/docs/_static/logo_animate.svg
132
135
  :width: 100
133
136
  :alt: skfolio documentation
134
137
  :target: https://skfolio.org/
File without changes
File without changes
File without changes
File without changes