Custom Pre-selection Using Volumes#

This tutorial demonstrates how to implement a custom pre-selection transformer with metadata-routing, integrate it into a Pipeline, and run walk-forward cross-validation.

Data#

We will use the S&P 500 dataset, which contains daily prices of 20 assets from the S&P 500 Index, spanning from 1990-01-02 to 2022-12-28:

import numpy as np
import sklearn.base as skb
import sklearn.feature_selection as skf
import sklearn.utils.validation as skv
from plotly.io import show
from sklearn import set_config
from sklearn.pipeline import Pipeline

from skfolio.datasets import load_sp500_dataset
from skfolio.model_selection import (
    WalkForward,
    cross_val_predict,
)
from skfolio.optimization import EqualWeighted
from skfolio.preprocessing import prices_to_returns

prices = load_sp500_dataset()
X = prices_to_returns(prices)

For simplicity, we will generate random volume data:

volumes_usd = np.random.rand(*X.shape) * 1e6

Custom Pre-selection Transformer#

Let’s create a custom pre-selection transformer to retain the top x% of assets with the highest average volumes during the fitting period.

class VolumePreSelection(skf.SelectorMixin, skb.BaseEstimator):
    to_keep_: np.ndarray

    def __init__(self, pct_to_keep: float = 0.5):
        self.pct_to_keep = pct_to_keep

    def fit(self, X, y=None, volumes=None):
        # Validate and convert X to a NumPy array
        X = self._validate_data(X)

        # Check parameters
        if not 0 < self.pct_to_keep <= 1:
            raise ValueError(
                "`pct_to_keep` must be between 0 and 1"
            )

        # Validate and convert volumes to a NumPy array
        volumes = skv.check_array(
            volumes,
            accept_sparse=False,
            ensure_2d=False,
            dtype=[np.float64, np.float32],
            order="C",
            copy=False,
            input_name="volumes",
        )
        if volumes.shape != X.shape:
            raise ValueError(
                f"Volume data {volumes.shape} must have the same dimensions as X {X.shape}"
            )

        n_assets = X.shape[1]
        mean_volumes = volumes.mean(axis=0)

        # Select the top `pct_to_keep` assets with the highest average volumes
        n_to_keep = max(1, int(round(self.pct_to_keep * n_assets)))
        selected_idx = np.argsort(mean_volumes)[-n_to_keep:]

        # Performance tip: `argpartition` could be used here for better efficiency
        # (O(n log(n)) vs O(n)).
        self.to_keep_ = np.isin(np.arange(n_assets), selected_idx)
        return self

    def _get_support_mask(self):
        skv.check_is_fitted(self)
        return self.to_keep_

Pipeline#

We create a Pipeline that uses our custom pre-selection transformer to retain the top 30% of assets based on average volume, followed by an equal-weighted allocation. Since we are using volume metadata, we enable metadata-routing and specify how to route it with set_fit_request:

set_config(enable_metadata_routing=True, transform_output="pandas")

model = Pipeline(
    [
        (
            "pre_selection",
            VolumePreSelection(pct_to_keep=0.3).set_fit_request(
                volumes=True
            ),
        ),
        ("optimization", EqualWeighted()),
    ]
)

Cross-Validation#

We will cross-validate the model using a Walk Forward that rebalances the portfolio every 3 months on the 3rd Friday, training on the preceding 6 months:

cv = WalkForward(test_size=3, train_size=6, freq="WOM-3FRI")

pred = cross_val_predict(model, X, cv=cv, params={"volumes": volumes_usd})

Display the weights for each rebalancing period:

pred.composition
EqualWeighted EqualWeighted_1 EqualWeighted_2 EqualWeighted_3 EqualWeighted_4 EqualWeighted_5 EqualWeighted_6 EqualWeighted_7 EqualWeighted_8 EqualWeighted_9 EqualWeighted_10 EqualWeighted_11 EqualWeighted_12 EqualWeighted_13 EqualWeighted_14 EqualWeighted_15 EqualWeighted_16 EqualWeighted_17 EqualWeighted_18 EqualWeighted_19 EqualWeighted_20 EqualWeighted_21 EqualWeighted_22 EqualWeighted_23 EqualWeighted_24 EqualWeighted_25 EqualWeighted_26 EqualWeighted_27 EqualWeighted_28 EqualWeighted_29 EqualWeighted_30 EqualWeighted_31 EqualWeighted_32 EqualWeighted_33 EqualWeighted_34 EqualWeighted_35 EqualWeighted_36 EqualWeighted_37 EqualWeighted_38 EqualWeighted_39 ... EqualWeighted_89 EqualWeighted_90 EqualWeighted_91 EqualWeighted_92 EqualWeighted_93 EqualWeighted_94 EqualWeighted_95 EqualWeighted_96 EqualWeighted_97 EqualWeighted_98 EqualWeighted_99 EqualWeighted_100 EqualWeighted_101 EqualWeighted_102 EqualWeighted_103 EqualWeighted_104 EqualWeighted_105 EqualWeighted_106 EqualWeighted_107 EqualWeighted_108 EqualWeighted_109 EqualWeighted_110 EqualWeighted_111 EqualWeighted_112 EqualWeighted_113 EqualWeighted_114 EqualWeighted_115 EqualWeighted_116 EqualWeighted_117 EqualWeighted_118 EqualWeighted_119 EqualWeighted_120 EqualWeighted_121 EqualWeighted_122 EqualWeighted_123 EqualWeighted_124 EqualWeighted_125 EqualWeighted_126 EqualWeighted_127 EqualWeighted_128
asset
AMD 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000
BAC 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 ... 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667
BBY 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000
CVX 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
JPM 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000
PG 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667
PEP 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 ... 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667
AAPL 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 ... 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667
PFE 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000
RRC 0.000000 0.000000 0.166667 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667
WMT 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 ... 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000
XOM 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 ... 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000
GE 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000
JNJ 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 ... 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000
LLY 0.000000 0.000000 0.000000 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 ... 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
KO 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 ... 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000
MSFT 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667
UNH 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 ... 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000
MRK 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 ... 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000
HD 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 ... 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000 0.166667 0.166667 0.166667 0.166667 0.166667 0.000000 0.000000 0.000000 0.000000

20 rows × 129 columns



You can also view the weights for each day:

pred.weights_per_observation.tail()
AMD BAC BBY CVX JPM PG PEP AAPL PFE RRC WMT XOM GE JNJ LLY KO MSFT UNH MRK HD
2022-10-14 0.0 0.166667 0.0 0.0 0.0 0.166667 0.166667 0.166667 0.0 0.166667 0.0 0.0 0.0 0.0 0.0 0.0 0.166667 0.0 0.0 0.0
2022-10-17 0.0 0.166667 0.0 0.0 0.0 0.166667 0.166667 0.166667 0.0 0.166667 0.0 0.0 0.0 0.0 0.0 0.0 0.166667 0.0 0.0 0.0
2022-10-18 0.0 0.166667 0.0 0.0 0.0 0.166667 0.166667 0.166667 0.0 0.166667 0.0 0.0 0.0 0.0 0.0 0.0 0.166667 0.0 0.0 0.0
2022-10-19 0.0 0.166667 0.0 0.0 0.0 0.166667 0.166667 0.166667 0.0 0.166667 0.0 0.0 0.0 0.0 0.0 0.0 0.166667 0.0 0.0 0.0
2022-10-20 0.0 0.166667 0.0 0.0 0.0 0.166667 0.166667 0.166667 0.0 0.166667 0.0 0.0 0.0 0.0 0.0 0.0 0.166667 0.0 0.0 0.0


Plot the weights per rebalancing period:

fig = pred.plot_composition()
show(fig)

Plot the full out-of-sample walk-forward path:

pred.plot_cumulative_returns()


Total running time of the script: (0 minutes 1.662 seconds)

Gallery generated by Sphinx-Gallery