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.
- {skfolio-0.10.0/src/skfolio.egg-info → skfolio-0.10.1}/PKG-INFO +12 -10
- {skfolio-0.10.0 → skfolio-0.10.1}/README.rst +11 -9
- {skfolio-0.10.0 → skfolio-0.10.1}/pyproject.toml +1 -1
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/_measures.py +4 -2
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_entropy_pooling.py +9 -9
- {skfolio-0.10.0 → skfolio-0.10.1/src/skfolio.egg-info}/PKG-INFO +12 -10
- {skfolio-0.10.0 → skfolio-0.10.1}/LICENSE +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/MANIFEST.in +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/setup.cfg +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/cluster/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/cluster/_hierarchical.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/factors_dataset.csv.gz +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/sp500_dataset.csv.gz +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/datasets/data/sp500_index.csv.gz +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distance/_distance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_clayton.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_gaussian.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_gumbel.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_independent.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_joe.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_selection.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_student_t.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/copula/_utils.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_utils.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/multivariate/_vine_copula.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_gaussian.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_johnson_su.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_normal_inverse_gaussian.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_selection.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/distribution/univariate/_student_t.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/exceptions.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/measures/_enums.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/metrics/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/metrics/_scorer.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_combinatorial.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_validation.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/model_selection/_walk_forward.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_denoise_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_detone_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_empirical_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_ew_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_gerber_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_graphical_lasso_cv.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_implied_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_ledoit_wolf.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_oas.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/covariance/_shrunk_covariance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_empirical_mu.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_equilibrium_mu.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_ew_mu.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/moments/expected_returns/_shrunk_mu.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/_nco.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_herc.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/cluster/hierarchical/_hrp.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_distributionally_robust.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_maximum_diversification.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_mean_risk.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_risk_budgeting.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/ensemble/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/ensemble/_stacking.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/naive/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/naive/_naive.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/population/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/population/_population.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_multi_period_portfolio.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/portfolio/_portfolio.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_drop_correlated.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_drop_zero_variance.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_complete.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_k_extremes.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_non_dominated.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/pre_selection/_select_non_expiring.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/preprocessing/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/preprocessing/_returns.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_black_litterman.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_empirical.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_factor_model.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_opinion_pooling.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/prior/_synthetic_data.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/typing.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_base.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_bootstrap.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/uncertainty_set/_empirical.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/__init__.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/bootstrap.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/composition.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/equations.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/figure.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/sorting.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/stats.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/utils/tools.py +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/SOURCES.txt +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/dependency_links.txt +0 -0
- {skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio.egg-info/requires.txt +0 -0
- {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.
|
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,
|
588
|
-
X_train, X_test,
|
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,
|
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.
|
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 =
|
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"]
|
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,
|
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,
|
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,
|
496
|
-
X_train, X_test,
|
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,
|
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.
|
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 =
|
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"]
|
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,
|
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,
|
626
|
+
factor_model.fit(X, factors)
|
625
627
|
stressed_dist = factor_model.return_distribution_
|
626
628
|
stressed_ptf = model.predict(stressed_dist)
|
627
629
|
|
@@ -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 =
|
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,
|
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,
|
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
|
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,
|
1038
|
-
if
|
1039
|
-
a.append(
|
1040
|
-
b.append(
|
1041
|
-
s =
|
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
|
-
#
|
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.
|
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,
|
588
|
-
X_train, X_test,
|
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,
|
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.
|
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 =
|
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"]
|
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,
|
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,
|
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
|
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.10.0 → skfolio-0.10.1}/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
|
{skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_distributionally_robust.py
RENAMED
File without changes
|
{skfolio-0.10.0 → skfolio-0.10.1}/src/skfolio/optimization/convex/_maximum_diversification.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
|