RegimeMoE

Defined in fynance.models.regime_model

class RegimeMoE(n_regimes=3, regime_col=0, regime_w=21, regime_period=252, routing='soft', emb_dim=4, hidden=(16, 8), loss=None, lr=1e-3, epochs=80, batch_size=None, cost=0.0, seed=0)[source]

Bases: object

Regime-conditioned mixture-of-experts SignalModel.

Parameters:
n_regimesint

Number of market regimes (clusters). Default 3.

regime_colint

Index of the column in X used as the positive price / level series the RegimeDetector clusters on. Default 0.

regime_wint

Rolling window for the regime features. Default 21.

regime_periodint

Annualization factor for the regime volatility feature. Default 252.

routing{“soft”, “hard”}

soft (default) concatenates a learned regime embedding to the features through a shared trunk (differentiable end-to-end); hard uses one expert MLP per regime, selected by the regime label.

emb_dimint

Embedding size for soft routing (ignored for hard). Default 4.

hiddentuple of int

Hidden layer sizes of the trunk / experts. Default (16, 8).

lossBaseLoss, optional

Differentiable financial loss (default SharpeLoss).

lr, epochs, batch_size, cost, seed

Forwarded to ObjectiveModel.

Notes

Reproducible: the net is seeded (torch.manual_seed) before it is built, then handed to ObjectiveModel (which would otherwise skip seeding a caller-provided net).

Examples

>>> import numpy as np
>>> rng = np.random.default_rng(0)
>>> level = 100 * np.exp(np.cumsum(rng.standard_normal(400) * 0.01))
>>> sig = rng.choice([-1.0, 1.0], size=400)
>>> X = np.column_stack([level, sig]).astype(np.float32)
>>> y = (sig * 0.01).astype(np.float32)
>>> model = RegimeMoE(n_regimes=2, regime_w=10, epochs=5).fit(X, y)
>>> model.predict(X).shape
(400, 1)
fit(X, y)[source]

Fit the causal regime detector (on train) then train the MoE net.

Parameters:
Xarray-like, shape (T, F)

Feature matrix; column regime_col is the positive price/level series used for regime detection.

yarray-like, shape (T,)

Realized per-bar returns aligned with X.

Returns:
RegimeMoE

self.

predict(X)[source]

Assign the regime online and return positions in [-1, 1].