skfolio.optimization
.StackingOptimization#
- class skfolio.optimization.StackingOptimization(estimators, final_estimator=None, cv=None, quantile=0.5, quantile_measure=Sharpe Ratio, n_jobs=None, verbose=0, portfolio_params=None)[source]#
Stack of optimizations with a final optimization.
Stacking Optimization is an ensemble method that consists in stacking the output of individual portfolio optimizations with a final portfolio optimization.
The weights are the dot-product of individual optimizations weights with the final optimization weights.
Stacking allows to use the strength of each individual portfolio optimization by using their output as input of a final portfolio optimization.
To avoid data leakage, out-of-sample estimates are used to fit the outer optimization.
Note that
estimators_
are fitted on the fullX
whilefinal_estimator_
is trained using cross-validated predictions of the base estimators usingcross_val_predict
.- Parameters:
- estimatorslist[tuple[str, BaseOptimization]]
Optimization estimators which will be stacked together. Each element of the list is defined as a tuple of string (i.e. name) and an optimization estimator.
- final_estimatorBaseOptimization, optional
A final optimization estimator which will be used to combine the base estimators. The default (
None
) is to useMeanRisk
.- cvBaseCrossValidator | BaseCombinatorialCV | int | “prefit” | “ignore”, optional
Determines the cross-validation splitting strategy used in
cross_val_predict
to train thefinal_estimator
. The default (None
) is to use the 5-fold cross validationKFold()
. Possible inputs forcv
are:“ignore”: no cross-validation is used (note that it will likely lead to data leakage with a high risk of overfitting)
integer, to specify the number of folds in a
KFold
An object to be used as a cross-validation generator
An iterable yielding train, test splits
“prefit” to assume the
estimators
are prefit, and skip cross validation
If a
CombinatorialCV
cross-validator is used, each cluster out-of-sample outputs becomes a collection of multiple paths instead of one single path. The selected out-of-sample path among this collection of paths is chosen according to thequantile
andquantile_measure
parameters.If “prefit” is passed, it is assumed that all
estimators
have been fitted already. Thefinal_estimator_
is trained on theestimators
predictions on the full training set and are not cross validated predictions. Please note that if the models have been trained on the same data to train the stacking model, there is a very high risk of overfitting.- n_jobsint, optional
The number of jobs to run in parallel for
fit
of allestimators
. The value-1
means using all processors. The default (None
) means 1 unless in ajoblib.parallel_backend
context.- quantilefloat, default=0.5
Quantile for a given measure (
quantile_measure
) of the out-of-sample inner-estimator paths when thecv
parameter is aCombinatorialPurgedCV
cross-validator. The default value is0.5
corresponding to the path with the median measure. (seecv
)- quantile_measurePerfMeasure or RatioMeasure or RiskMeasure or ExtraRiskMeasure, default=RatioMeasure.SHARPE_RATIO
Measure used for the quantile path selection (see
quantile
andcv
). The default isRatioMeasure.SHARPE_RATIO
.- verboseint, default=0
The verbosity level. The default value is
0
.- portfolio_paramsdict, optional
Portfolio parameters passed to the portfolio evaluated by the
predict
andscore
methods. If not provided, thename
is copied from the optimization model and systematically passed to the portfolio.
- Attributes:
- weights_ndarray of shape (n_assets,)
Weights of the assets.
- estimators_list[BaseOptimization]
The elements of the
estimators
parameter, having been fitted on the training data. Whencv="prefit"
,estimators_
is set toestimators
and is not fitted again.- named_estimators_dict[str, BaseOptimization]
Attribute to access any fitted sub-estimators by name.
- final_estimator_BaseOptimization
The fitted
final_estimator
.- n_features_in_int
Number of assets seen during
fit
.- feature_names_in_ndarray of shape (
n_features_in_
,) Names of assets seen during
fit
. Defined only whenX
has assets names that are all strings.
Methods
fit
(X[, y])Fit the Stacking Optimization estimator.
fit_predict
(X)Perform
fit
onX
and returns the predictedPortfolio
orPopulation
ofPortfolio
onX
based on the fittedweights
.Get metadata routing of this object.
get_params
([deep])Get the parameters of an estimator from the ensemble.
predict
(X)Predict the
Portfolio
orPopulation
ofPortfolio
onX
based on the fitted weights.score
(X[, y])Prediction score.
set_params
(**params)Set the parameters of an estimator from the ensemble.
- fit(X, y=None, **fit_params)[source]#
Fit the Stacking Optimization estimator.
- Parameters:
- Xarray-like of shape (n_observations, n_assets)
Price returns of the assets.
- yarray-like of shape (n_observations, n_targets), optional
Price returns of factors or a target benchmark. The default is
None
.- **fit_paramsdict
Parameters to pass to the underlying estimators. Only available if
enable_metadata_routing=True
, which can be set by usingsklearn.set_config(enable_metadata_routing=True)
. See Metadata Routing User Guide for more details.
- Returns:
- selfStackingOptimization
Fitted estimator.
- fit_predict(X)#
Perform
fit
onX
and returns the predictedPortfolio
orPopulation
ofPortfolio
onX
based on the fittedweights
. For factor models, usefit(X, y)
thenpredict(X)
separately.- Parameters:
- Xarray-like of shape (n_observations, n_assets)
Price returns of the assets.
- Returns:
- predictionPortfolio | Population
Portfolio
orPopulation
ofPortfolio
estimated onX
based on the fittedweights
.
- get_metadata_routing()[source]#
Get metadata routing of this object.
Please check User Guide on how the routing mechanism works.
- Returns:
- routingMetadataRequest
A
MetadataRequest
encapsulating routing information.
- get_params(deep=True)[source]#
Get the parameters of an estimator from the ensemble.
Returns the parameters given in the constructor as well as the estimators contained within the
estimators
parameter.- Parameters:
- deepbool, default=True
Setting it to True gets the various estimators and the parameters of the estimators as well.
- Returns:
- paramsdict
Parameter and estimator names mapped to their values or parameter names mapped to their values.
- property named_estimators#
Dictionary to access any fitted sub-estimators by name.
- Returns:
Bunch
- predict(X)#
Predict the
Portfolio
orPopulation
ofPortfolio
onX
based on the fitted weights.Optimization estimators can return a 1D or a 2D array of
weights
. For a 1D array, the prediction returns aPortfolio
. For a 2D array, the prediction returns aPopulation
ofPortfolio
.If
name
is not provided in the portfolio arguments, we use the first 500 characters of the estimator name.- Parameters:
- Xarray-like of shape (n_observations, n_assets)
Price returns of the assets.
- Returns:
- predictionPortfolio | Population
Portfolio
orPopulation
ofPortfolio
estimated onX
based on the fittedweights
.
- score(X, y=None)#
Prediction score. If the prediction is a single
Portfolio
, the score is the Sharpe Ratio. If the prediction is aPopulation
ofPortfolio
, the score is the mean of all the portfolios Sharpe Ratios in the population.- Parameters:
- Xarray-like of shape (n_observations, n_assets)
Price returns of the assets.
- yIgnored
Not used, present here for API consistency by convention.
- Returns:
- scorefloat
The Sharpe Ratio of the portfolio if the prediction is a single
Portfolio
or the mean of all the portfolios Sharpe Ratios if the prediction is aPopulation
ofPortfolio
.
- set_params(**params)[source]#
Set the parameters of an estimator from the ensemble.
Valid parameter keys can be listed with
get_params()
. Note that you can directly set the parameters of the estimators contained inestimators
.- Parameters:
- **paramskeyword arguments
Specific parameters using e.g.
set_params(parameter_name=new_value)
. In addition, to setting the parameters of the estimator, the individual estimator of the estimators can also be set, or can be removed by setting them to ‘drop’.
- Returns:
- selfobject
Estimator instance.