skfolio 0.9.0__tar.gz → 0.9.1__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 (127) hide show
  1. {skfolio-0.9.0/src/skfolio.egg-info → skfolio-0.9.1}/PKG-INFO +1 -1
  2. {skfolio-0.9.0 → skfolio-0.9.1}/pyproject.toml +1 -1
  3. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -3
  4. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/_mean_risk.py +10 -2
  5. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_select_non_expiring.py +1 -1
  6. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/equations.py +1 -1
  7. {skfolio-0.9.0 → skfolio-0.9.1/src/skfolio.egg-info}/PKG-INFO +1 -1
  8. {skfolio-0.9.0 → skfolio-0.9.1}/LICENSE +0 -0
  9. {skfolio-0.9.0 → skfolio-0.9.1}/MANIFEST.in +0 -0
  10. {skfolio-0.9.0 → skfolio-0.9.1}/README.rst +0 -0
  11. {skfolio-0.9.0 → skfolio-0.9.1}/setup.cfg +0 -0
  12. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/__init__.py +0 -0
  13. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/cluster/__init__.py +0 -0
  14. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/cluster/_hierarchical.py +0 -0
  15. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/__init__.py +0 -0
  16. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/_base.py +0 -0
  17. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/data/__init__.py +0 -0
  18. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
  19. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
  20. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
  21. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distance/__init__.py +0 -0
  22. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distance/_base.py +0 -0
  23. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distance/_distance.py +0 -0
  24. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/__init__.py +0 -0
  25. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/_base.py +0 -0
  26. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/__init__.py +0 -0
  27. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_base.py +0 -0
  28. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_clayton.py +0 -0
  29. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_gaussian.py +0 -0
  30. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_gumbel.py +0 -0
  31. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_independent.py +0 -0
  32. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_joe.py +0 -0
  33. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_selection.py +0 -0
  34. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_student_t.py +0 -0
  35. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/copula/_utils.py +0 -0
  36. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/multivariate/__init__.py +0 -0
  37. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/multivariate/_base.py +0 -0
  38. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/multivariate/_utils.py +0 -0
  39. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/multivariate/_vine_copula.py +0 -0
  40. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/__init__.py +0 -0
  41. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_base.py +0 -0
  42. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_gaussian.py +0 -0
  43. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_johnson_su.py +0 -0
  44. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py +0 -0
  45. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_selection.py +0 -0
  46. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/distribution/univariate/_student_t.py +0 -0
  47. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/exceptions.py +0 -0
  48. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/measures/__init__.py +0 -0
  49. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/measures/_enums.py +0 -0
  50. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/measures/_measures.py +0 -0
  51. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/metrics/__init__.py +0 -0
  52. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/metrics/_scorer.py +0 -0
  53. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/model_selection/__init__.py +0 -0
  54. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/model_selection/_combinatorial.py +0 -0
  55. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/model_selection/_validation.py +0 -0
  56. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/model_selection/_walk_forward.py +0 -0
  57. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/__init__.py +0 -0
  58. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/__init__.py +0 -0
  59. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_base.py +0 -0
  60. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
  61. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
  62. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
  63. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
  64. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
  65. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
  66. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_implied_covariance.py +0 -0
  67. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
  68. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_oas.py +0 -0
  69. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
  70. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/__init__.py +0 -0
  71. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/_base.py +0 -0
  72. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
  73. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
  74. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
  75. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
  76. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/__init__.py +0 -0
  77. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/_base.py +0 -0
  78. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/__init__.py +0 -0
  79. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/_nco.py +0 -0
  80. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
  81. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
  82. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
  83. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
  84. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/__init__.py +0 -0
  85. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/_base.py +0 -0
  86. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
  87. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
  88. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/ensemble/__init__.py +0 -0
  89. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/ensemble/_base.py +0 -0
  90. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
  91. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/naive/__init__.py +0 -0
  92. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/optimization/naive/_naive.py +0 -0
  93. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/population/__init__.py +0 -0
  94. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/population/_population.py +0 -0
  95. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/portfolio/__init__.py +0 -0
  96. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/portfolio/_base.py +0 -0
  97. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
  98. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/portfolio/_portfolio.py +0 -0
  99. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/__init__.py +0 -0
  100. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
  101. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_drop_zero_variance.py +0 -0
  102. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_select_complete.py +0 -0
  103. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
  104. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
  105. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/preprocessing/__init__.py +0 -0
  106. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/preprocessing/_returns.py +0 -0
  107. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/__init__.py +0 -0
  108. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/_base.py +0 -0
  109. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/_black_litterman.py +0 -0
  110. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/_empirical.py +0 -0
  111. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/_factor_model.py +0 -0
  112. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/prior/_synthetic_data.py +0 -0
  113. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/synthetic_returns/__init__.py +0 -0
  114. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/typing.py +0 -0
  115. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/uncertainty_set/__init__.py +0 -0
  116. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/uncertainty_set/_base.py +0 -0
  117. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
  118. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/uncertainty_set/_empirical.py +0 -0
  119. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/__init__.py +0 -0
  120. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/bootstrap.py +0 -0
  121. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/sorting.py +0 -0
  122. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/stats.py +0 -0
  123. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio/utils/tools.py +0 -0
  124. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio.egg-info/SOURCES.txt +0 -0
  125. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio.egg-info/dependency_links.txt +0 -0
  126. {skfolio-0.9.0 → skfolio-0.9.1}/src/skfolio.egg-info/requires.txt +0 -0
  127. {skfolio-0.9.0 → skfolio-0.9.1}/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.9.0
3
+ Version: 0.9.1
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>
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "skfolio"
7
- version = "0.9.0"
7
+ version = "0.9.1"
8
8
  maintainers = [
9
9
  { name = "Hugo Delatte", email = "delatte.hugo@gmail.com" },
10
10
  { name = "Matteo Manzi", email = "matteomanzi09@gmail.com" }
@@ -256,9 +256,6 @@ class MaximumDiversification(MeanRisk):
256
256
  min_return : float | array-like of shape (n_optimization), optional
257
257
  Lower bound constraint on the expected return.
258
258
 
259
- min_return : float | array-like of shape (n_optimization), optional
260
- Lower bound constraint on the expected return.
261
-
262
259
  add_objective : Callable[[cp.Variable], cp.Expression], optional
263
260
  Add a custom objective to the existing objective expression.
264
261
  It is a function that must take as argument the weights `w` and returns a
@@ -902,7 +902,7 @@ class MeanRisk(ConvexOptimization):
902
902
  )
903
903
  constraints += [
904
904
  tracking_error * self._scale_constraints
905
- <= self.max_tracking_error * self._scale_constraints
905
+ <= self.max_tracking_error * factor * self._scale_constraints
906
906
  ]
907
907
 
908
908
  # Turnover
@@ -1036,6 +1036,15 @@ class MeanRisk(ConvexOptimization):
1036
1036
  + custom_objective * self._scale_objective
1037
1037
  )
1038
1038
  case ObjectiveFunction.MAXIMIZE_RATIO:
1039
+ # Capture common obvious mistake before solver failure to help user
1040
+ if np.isscalar(self.min_weights) and self.min_weights >= 0:
1041
+ if np.max(prior_model.mu) - self.risk_free_rate <= 0:
1042
+ raise ValueError(
1043
+ "Cannot optimize for Maximum Ratio with your current "
1044
+ "constraints and input. This is because your assets' "
1045
+ "expected returns are all under-performing your risk-free "
1046
+ f"rate {self.risk_free_rate:.2%}."
1047
+ )
1039
1048
  homogenization_factor = _optimal_homogenization_factor(
1040
1049
  mu=prior_model.mu
1041
1050
  )
@@ -1060,7 +1069,6 @@ class MeanRisk(ConvexOptimization):
1060
1069
  # Fractional Programming Problems".
1061
1070
  # The condition to work is f1 >= 0, so we need to raise an user
1062
1071
  # warning when it's not the case.
1063
- # TODO: raise user warning when f1<0
1064
1072
 
1065
1073
  constraints += [
1066
1074
  expected_return * self._scale_constraints
@@ -123,7 +123,7 @@ class SelectNonExpiring(skf.SelectorMixin, skb.BaseEstimator):
123
123
  )
124
124
 
125
125
  if self.expiration_dates is None:
126
- raise ValueError("`expiration_lookahead` must be provided")
126
+ raise ValueError("`expiration_dates` must be provided")
127
127
 
128
128
  if self.expiration_lookahead is None:
129
129
  raise ValueError("`expiration_lookahead` must be provided")
@@ -276,7 +276,7 @@ def _matching_array(values: np.ndarray, key: str, sum_to_one: bool) -> np.ndarra
276
276
  if not arr.any():
277
277
  raise EquationToMatrixError(f"Unable to find '{key}' in '{values}'")
278
278
  if sum_to_one:
279
- s = np.sum(arr)
279
+ s = arr.sum()
280
280
  else:
281
281
  s = 1
282
282
  return arr / s
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skfolio
3
- Version: 0.9.0
3
+ Version: 0.9.1
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>
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes