Note
Go to the end to download the full example code. or to run this example in your browser via Binder
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 | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BAC | 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.166667 | 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.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.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.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 |
KO | 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.166667 | 0.000000 | 0.000000 | 0.166667 | 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.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.166667 | 0.166667 | 0.000000 | 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.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 |
LLY | 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.166667 | 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.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.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.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 |
MRK | 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.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.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.166667 | 0.166667 | 0.000000 | 0.000000 | 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.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 |
UNH | 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.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.166667 | 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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 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.166667 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
XOM | 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.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.166667 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | ... | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 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.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.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 |
AAPL | 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.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.000000 | 0.000000 | 0.000000 | 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.166667 | 0.166667 | 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.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.166667 | 0.166667 |
BBY | 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.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.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 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.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.166667 | 0.000000 | 0.000000 |
CVX | 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.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.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.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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 |
GE | 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.166667 | 0.166667 | 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.166667 | 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.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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.166667 | 0.166667 |
JPM | 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.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.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.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.166667 | 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.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 |
MSFT | 0.000000 | 0.000000 | 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.166667 | 0.166667 | 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.166667 | 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.000000 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 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.166667 | 0.166667 | 0.166667 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 |
PEP | 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.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.166667 | 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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.166667 | 0.166667 | 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 |
RRC | 0.000000 | 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.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.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.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 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.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.166667 | 0.166667 | 0.166667 |
PG | 0.000000 | 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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 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.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.166667 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.166667 | 0.166667 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.000000 |
HD | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 | 0.166667 | 0.000000 | 0.000000 | 0.166667 | 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.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.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.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.166667 | 0.166667 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.000000 |
AMD | 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.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.166667 | 0.000000 | 0.000000 | 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.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.000000 | 0.000000 | 0.166667 |
PFE | 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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 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.166667 | 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.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.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.000000 | 0.166667 | 0.166667 |
WMT | 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.166667 | 0.166667 | 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.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.166667 | 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.000000 | 0.000000 | 0.000000 |
JNJ | 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.000000 | 0.000000 | 0.000000 | 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 | 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.166667 | 0.166667 | 0.166667 | 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.000000 | 0.000000 | 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.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()
BAC | KO | LLY | MRK | UNH | XOM | AAPL | BBY | CVX | GE | JPM | MSFT | PEP | RRC | PG | HD | AMD | PFE | WMT | JNJ | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
2022-10-14 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 |
2022-10-17 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 |
2022-10-18 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 |
2022-10-19 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 |
2022-10-20 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.166667 | 0.166667 | 0.0 | 0.0 | 0.0 | 0.166667 | 0.0 | 0.0 | 0.166667 | 0.166667 | 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.683 seconds)