skfolio 0.10.0__tar.gz → 0.10.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 (129) hide show
  1. {skfolio-0.10.0/src/skfolio.egg-info → skfolio-0.10.1}/PKG-INFO +12 -10
  2. {skfolio-0.10.0 → skfolio-0.10.1}/README.rst +11 -9
  3. {skfolio-0.10.0 → skfolio-0.10.1}/pyproject.toml +1 -1
  4. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/_measures.py +4 -2
  5. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_entropy_pooling.py +9 -9
  6. {skfolio-0.10.0 → skfolio-0.10.1/src/skfolio.egg-info}/PKG-INFO +12 -10
  7. {skfolio-0.10.0 → skfolio-0.10.1}/LICENSE +0 -0
  8. {skfolio-0.10.0 → skfolio-0.10.1}/MANIFEST.in +0 -0
  9. {skfolio-0.10.0 → skfolio-0.10.1}/setup.cfg +0 -0
  10. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/__init__.py +0 -0
  11. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/cluster/__init__.py +0 -0
  12. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/cluster/_hierarchical.py +0 -0
  13. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/__init__.py +0 -0
  14. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/_base.py +0 -0
  15. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/__init__.py +0 -0
  16. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
  17. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
  18. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
  19. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/__init__.py +0 -0
  20. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/_base.py +0 -0
  21. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/_distance.py +0 -0
  22. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/__init__.py +0 -0
  23. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/_base.py +0 -0
  24. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/__init__.py +0 -0
  25. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_base.py +0 -0
  26. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_clayton.py +0 -0
  27. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_gaussian.py +0 -0
  28. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_gumbel.py +0 -0
  29. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_independent.py +0 -0
  30. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_joe.py +0 -0
  31. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_selection.py +0 -0
  32. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_student_t.py +0 -0
  33. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_utils.py +0 -0
  34. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/__init__.py +0 -0
  35. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_base.py +0 -0
  36. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_utils.py +0 -0
  37. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_vine_copula.py +0 -0
  38. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/__init__.py +0 -0
  39. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_base.py +0 -0
  40. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_gaussian.py +0 -0
  41. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_johnson_su.py +0 -0
  42. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py +0 -0
  43. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_selection.py +0 -0
  44. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_student_t.py +0 -0
  45. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/exceptions.py +0 -0
  46. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/__init__.py +0 -0
  47. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/_enums.py +0 -0
  48. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/metrics/__init__.py +0 -0
  49. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/metrics/_scorer.py +0 -0
  50. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/__init__.py +0 -0
  51. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_combinatorial.py +0 -0
  52. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_validation.py +0 -0
  53. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_walk_forward.py +0 -0
  54. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/__init__.py +0 -0
  55. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/__init__.py +0 -0
  56. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_base.py +0 -0
  57. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
  58. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
  59. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
  60. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
  61. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
  62. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
  63. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_implied_covariance.py +0 -0
  64. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
  65. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_oas.py +0 -0
  66. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
  67. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/__init__.py +0 -0
  68. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_base.py +0 -0
  69. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
  70. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
  71. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
  72. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
  73. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/__init__.py +0 -0
  74. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/_base.py +0 -0
  75. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/__init__.py +0 -0
  76. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/_nco.py +0 -0
  77. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
  78. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
  79. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
  80. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
  81. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/__init__.py +0 -0
  82. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_base.py +0 -0
  83. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
  84. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
  85. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
  86. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
  87. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/ensemble/__init__.py +0 -0
  88. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
  89. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/naive/__init__.py +0 -0
  90. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/naive/_naive.py +0 -0
  91. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/population/__init__.py +0 -0
  92. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/population/_population.py +0 -0
  93. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/__init__.py +0 -0
  94. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_base.py +0 -0
  95. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
  96. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_portfolio.py +0 -0
  97. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/__init__.py +0 -0
  98. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
  99. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_drop_zero_variance.py +0 -0
  100. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_complete.py +0 -0
  101. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
  102. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
  103. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_non_expiring.py +0 -0
  104. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/preprocessing/__init__.py +0 -0
  105. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/preprocessing/_returns.py +0 -0
  106. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/__init__.py +0 -0
  107. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_base.py +0 -0
  108. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_black_litterman.py +0 -0
  109. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_empirical.py +0 -0
  110. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_factor_model.py +0 -0
  111. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_opinion_pooling.py +0 -0
  112. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_synthetic_data.py +0 -0
  113. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/typing.py +0 -0
  114. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/__init__.py +0 -0
  115. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_base.py +0 -0
  116. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
  117. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_empirical.py +0 -0
  118. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/__init__.py +0 -0
  119. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/bootstrap.py +0 -0
  120. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/composition.py +0 -0
  121. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/equations.py +0 -0
  122. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/figure.py +0 -0
  123. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/sorting.py +0 -0
  124. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/stats.py +0 -0
  125. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/tools.py +0 -0
  126. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/SOURCES.txt +0 -0
  127. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/dependency_links.txt +0 -0
  128. {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/requires.txt +0 -0
  129. {skfolio-0.10.0 → skfolio-0.10.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.10.0
3
+ Version: 0.10.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>
@@ -385,6 +385,7 @@ Imports
385
385
  )
386
386
  from skfolio.optimization import (
387
387
  MeanRisk,
388
+ HierarchicalRiskParity,
388
389
  NestedClustersOptimization,
389
390
  ObjectiveFunction,
390
391
  RiskBudgeting,
@@ -584,11 +585,13 @@ Factor Model
584
585
 
585
586
  factor_prices = load_factors_dataset()
586
587
 
587
- X, y = prices_to_returns(prices, factor_prices)
588
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, shuffle=False)
588
+ X, factors = prices_to_returns(prices, factor_prices)
589
+ X_train, X_test, factors_train, factors_test = train_test_split(
590
+ X, factors, test_size=0.33, shuffle=False
591
+ )
589
592
 
590
593
  model = MeanRisk(prior_estimator=FactorModel())
591
- model.fit(X_train, y_train)
594
+ model.fit(X_train, factors_train)
592
595
 
593
596
  print(model.weights_)
594
597
 
@@ -597,7 +600,6 @@ Factor Model
597
600
  print(portfolio.calmar_ratio)
598
601
  print(portfolio.summary())
599
602
 
600
-
601
603
  Factor Model & Covariance Detoning
602
604
  ----------------------------------
603
605
  .. code-block:: python
@@ -658,7 +660,7 @@ Combinatorial Purged Cross-Validation
658
660
 
659
661
  cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2)
660
662
 
661
- print(cv.get_summary(X_train))
663
+ print(cv.summary(X_train))
662
664
 
663
665
  population = cross_val_predict(model, X_train, cv=cv)
664
666
 
@@ -674,7 +676,7 @@ Minimum CVaR Optimization on Synthetic Returns
674
676
  .. code-block:: python
675
677
 
676
678
  vine = VineCopula(log_transform=True, n_jobs=-1)
677
- prior = =SyntheticData(distribution_estimator=vine, n_samples=2000)
679
+ prior = SyntheticData(distribution_estimator=vine, n_samples=2000)
678
680
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=prior)
679
681
  model.fit(X)
680
682
  print(model.weights_)
@@ -684,7 +686,7 @@ Stress Test
684
686
  -----------
685
687
  .. code-block:: python
686
688
 
687
- vine = VineCopula(log_transform=True, central_assets=["BAC"] n_jobs=-1)
689
+ vine = VineCopula(log_transform=True, central_assets=["BAC"], n_jobs=-1)
688
690
  vine.fit(X)
689
691
  X_stressed = vine.sample(n_samples=10_000, conditioning = {"BAC": -0.2})
690
692
  ptf_stressed = model.predict(X_stressed)
@@ -702,7 +704,7 @@ Minimum CVaR Optimization on Synthetic Factors
702
704
  )
703
705
  factor_model = FactorModel(factor_prior_estimator=factor_prior)
704
706
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=factor_model)
705
- model.fit(X, y)
707
+ model.fit(X, factors)
706
708
  print(model.weights_)
707
709
 
708
710
 
@@ -713,7 +715,7 @@ Factor Stress Test
713
715
  factor_model.set_params(factor_prior_estimator__sample_args=dict(
714
716
  conditioning={"QUAL": -0.5}
715
717
  ))
716
- factor_model.fit(X,y)
718
+ factor_model.fit(X, factors)
717
719
  stressed_dist = factor_model.return_distribution_
718
720
  stressed_ptf = model.predict(stressed_dist)
719
721
 
@@ -293,6 +293,7 @@ Imports
293
293
  )
294
294
  from skfolio.optimization import (
295
295
  MeanRisk,
296
+ HierarchicalRiskParity,
296
297
  NestedClustersOptimization,
297
298
  ObjectiveFunction,
298
299
  RiskBudgeting,
@@ -492,11 +493,13 @@ Factor Model
492
493
 
493
494
  factor_prices = load_factors_dataset()
494
495
 
495
- X, y = prices_to_returns(prices, factor_prices)
496
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, shuffle=False)
496
+ X, factors = prices_to_returns(prices, factor_prices)
497
+ X_train, X_test, factors_train, factors_test = train_test_split(
498
+ X, factors, test_size=0.33, shuffle=False
499
+ )
497
500
 
498
501
  model = MeanRisk(prior_estimator=FactorModel())
499
- model.fit(X_train, y_train)
502
+ model.fit(X_train, factors_train)
500
503
 
501
504
  print(model.weights_)
502
505
 
@@ -505,7 +508,6 @@ Factor Model
505
508
  print(portfolio.calmar_ratio)
506
509
  print(portfolio.summary())
507
510
 
508
-
509
511
  Factor Model & Covariance Detoning
510
512
  ----------------------------------
511
513
  .. code-block:: python
@@ -566,7 +568,7 @@ Combinatorial Purged Cross-Validation
566
568
 
567
569
  cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2)
568
570
 
569
- print(cv.get_summary(X_train))
571
+ print(cv.summary(X_train))
570
572
 
571
573
  population = cross_val_predict(model, X_train, cv=cv)
572
574
 
@@ -582,7 +584,7 @@ Minimum CVaR Optimization on Synthetic Returns
582
584
  .. code-block:: python
583
585
 
584
586
  vine = VineCopula(log_transform=True, n_jobs=-1)
585
- prior = =SyntheticData(distribution_estimator=vine, n_samples=2000)
587
+ prior = SyntheticData(distribution_estimator=vine, n_samples=2000)
586
588
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=prior)
587
589
  model.fit(X)
588
590
  print(model.weights_)
@@ -592,7 +594,7 @@ Stress Test
592
594
  -----------
593
595
  .. code-block:: python
594
596
 
595
- vine = VineCopula(log_transform=True, central_assets=["BAC"] n_jobs=-1)
597
+ vine = VineCopula(log_transform=True, central_assets=["BAC"], n_jobs=-1)
596
598
  vine.fit(X)
597
599
  X_stressed = vine.sample(n_samples=10_000, conditioning = {"BAC": -0.2})
598
600
  ptf_stressed = model.predict(X_stressed)
@@ -610,7 +612,7 @@ Minimum CVaR Optimization on Synthetic Factors
610
612
  )
611
613
  factor_model = FactorModel(factor_prior_estimator=factor_prior)
612
614
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=factor_model)
613
- model.fit(X, y)
615
+ model.fit(X, factors)
614
616
  print(model.weights_)
615
617
 
616
618
 
@@ -621,7 +623,7 @@ Factor Stress Test
621
623
  factor_model.set_params(factor_prior_estimator__sample_args=dict(
622
624
  conditioning={"QUAL": -0.5}
623
625
  ))
624
- factor_model.fit(X,y)
626
+ factor_model.fit(X, factors)
625
627
  stressed_dist = factor_model.return_distribution_
626
628
  stressed_ptf = model.predict(stressed_dist)
627
629
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "skfolio"
7
- version = "0.10.0"
7
+ version = "0.10.1"
8
8
  maintainers = [
9
9
  { name = "Hugo Delatte", email = "delatte.hugo@gmail.com" },
10
10
  { name = "Matteo Manzi", email = "matteomanzi09@gmail.com" }
@@ -136,7 +136,9 @@ def variance(
136
136
  if sample_weight is None:
137
137
  return np.var(returns, ddof=0 if biased else 1, axis=0)
138
138
 
139
- biased_var = sample_weight @ (returns - mean(returns)) ** 2
139
+ biased_var = (
140
+ sample_weight @ (returns - mean(returns, sample_weight=sample_weight)) ** 2
141
+ )
140
142
  if biased:
141
143
  return biased_var
142
144
  n_eff = 1 / np.sum(sample_weight**2)
@@ -177,7 +179,7 @@ def semi_variance(
177
179
  If `returns` is a 2D-array, the result is a ndarray of shape (n_assets,).
178
180
  """
179
181
  if min_acceptable_return is None:
180
- min_acceptable_return = mean(returns)
182
+ min_acceptable_return = mean(returns, sample_weight=sample_weight)
181
183
 
182
184
  biased_semi_var = mean(
183
185
  np.maximum(0, min_acceptable_return - returns) ** 2, sample_weight=sample_weight
@@ -589,10 +589,10 @@ class EntropyPooling(BasePrior):
589
589
 
590
590
  Parameters
591
591
  ----------
592
- a : ndarray of shape (n_observations, n_constrains)
592
+ a : ndarray of shape (n_observations, n_constraints)
593
593
  Left matrix in `x @ a == b` or `x @ a <= b`.
594
594
 
595
- a : ndarray of shape (n_observations, n_constrains)
595
+ a : ndarray of shape (n_observations, n_constraints)
596
596
  Right vector in `x @ a == b` or `x @ a <= b`.
597
597
 
598
598
  Returns
@@ -1029,16 +1029,16 @@ class EntropyPooling(BasePrior):
1029
1029
 
1030
1030
  """
1031
1031
  n_observations, _ = self._returns.shape
1032
- # Init constrains with sum(p)==1, rescaled by its norm
1032
+ # Init constraints with sum(p)==1, rescaled by its norm
1033
1033
  # Has better convergence than the normalized form done inside the dual.
1034
1034
  a = [np.ones(n_observations).reshape(-1, 1) / np.sqrt(n_observations)]
1035
1035
  b = [np.array([1.0]) / np.sqrt(n_observations)]
1036
1036
  bounds = [(None, None)]
1037
- for name, constrains in self._constraints.items():
1038
- if constrains is not None:
1039
- a.append(constrains[0])
1040
- b.append(constrains[1])
1041
- s = constrains[1].size
1037
+ for name, constraints in self._constraints.items():
1038
+ if constraints is not None:
1039
+ a.append(constraints[0])
1040
+ b.append(constraints[1])
1041
+ s = constraints[1].size
1042
1042
  match name:
1043
1043
  case "equality" | "cvar_equality":
1044
1044
  bounds += [(None, None)] * s
@@ -1145,7 +1145,7 @@ class EntropyPooling(BasePrior):
1145
1145
 
1146
1146
  if self._constraints["fixed_equality"] is not None:
1147
1147
  a, b = self._constraints["fixed_equality"]
1148
- # Relaxe the problem with slack variables with a norm1 penalty to avoid
1148
+ # Relax the problem with slack variables with a norm1 penalty to avoid
1149
1149
  # solver infeasibility that may arise from overly tight constraints from
1150
1150
  # fixing the moments.
1151
1151
  slack = cp.Variable(b.size)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: skfolio
3
- Version: 0.10.0
3
+ Version: 0.10.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>
@@ -385,6 +385,7 @@ Imports
385
385
  )
386
386
  from skfolio.optimization import (
387
387
  MeanRisk,
388
+ HierarchicalRiskParity,
388
389
  NestedClustersOptimization,
389
390
  ObjectiveFunction,
390
391
  RiskBudgeting,
@@ -584,11 +585,13 @@ Factor Model
584
585
 
585
586
  factor_prices = load_factors_dataset()
586
587
 
587
- X, y = prices_to_returns(prices, factor_prices)
588
- X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, shuffle=False)
588
+ X, factors = prices_to_returns(prices, factor_prices)
589
+ X_train, X_test, factors_train, factors_test = train_test_split(
590
+ X, factors, test_size=0.33, shuffle=False
591
+ )
589
592
 
590
593
  model = MeanRisk(prior_estimator=FactorModel())
591
- model.fit(X_train, y_train)
594
+ model.fit(X_train, factors_train)
592
595
 
593
596
  print(model.weights_)
594
597
 
@@ -597,7 +600,6 @@ Factor Model
597
600
  print(portfolio.calmar_ratio)
598
601
  print(portfolio.summary())
599
602
 
600
-
601
603
  Factor Model & Covariance Detoning
602
604
  ----------------------------------
603
605
  .. code-block:: python
@@ -658,7 +660,7 @@ Combinatorial Purged Cross-Validation
658
660
 
659
661
  cv = CombinatorialPurgedCV(n_folds=10, n_test_folds=2)
660
662
 
661
- print(cv.get_summary(X_train))
663
+ print(cv.summary(X_train))
662
664
 
663
665
  population = cross_val_predict(model, X_train, cv=cv)
664
666
 
@@ -674,7 +676,7 @@ Minimum CVaR Optimization on Synthetic Returns
674
676
  .. code-block:: python
675
677
 
676
678
  vine = VineCopula(log_transform=True, n_jobs=-1)
677
- prior = =SyntheticData(distribution_estimator=vine, n_samples=2000)
679
+ prior = SyntheticData(distribution_estimator=vine, n_samples=2000)
678
680
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=prior)
679
681
  model.fit(X)
680
682
  print(model.weights_)
@@ -684,7 +686,7 @@ Stress Test
684
686
  -----------
685
687
  .. code-block:: python
686
688
 
687
- vine = VineCopula(log_transform=True, central_assets=["BAC"] n_jobs=-1)
689
+ vine = VineCopula(log_transform=True, central_assets=["BAC"], n_jobs=-1)
688
690
  vine.fit(X)
689
691
  X_stressed = vine.sample(n_samples=10_000, conditioning = {"BAC": -0.2})
690
692
  ptf_stressed = model.predict(X_stressed)
@@ -702,7 +704,7 @@ Minimum CVaR Optimization on Synthetic Factors
702
704
  )
703
705
  factor_model = FactorModel(factor_prior_estimator=factor_prior)
704
706
  model = MeanRisk(risk_measure=RiskMeasure.CVAR, prior_estimator=factor_model)
705
- model.fit(X, y)
707
+ model.fit(X, factors)
706
708
  print(model.weights_)
707
709
 
708
710
 
@@ -713,7 +715,7 @@ Factor Stress Test
713
715
  factor_model.set_params(factor_prior_estimator__sample_args=dict(
714
716
  conditioning={"QUAL": -0.5}
715
717
  ))
716
- factor_model.fit(X,y)
718
+ factor_model.fit(X, factors)
717
719
  stressed_dist = factor_model.return_distribution_
718
720
  stressed_ptf = model.predict(stressed_dist)
719
721
 
File without changes
File without changes
File without changes
File without changes