Los luchadores¶
| Nombre | Modelo | fpp3 | ¿Default? | Cuándo brilla |
|---|---|---|---|---|
naive |
Repite el último valor | 5.2 | ✓ | Benchmark obligatorio |
snaive |
Naive estacional | 5.2 | ✓ | Benchmark con estacionalidad |
drift |
Extrapolación lineal | 5.2 | ✓ | Benchmark con tendencia |
theta |
Método Theta (ganador M3) | — | ✓ | Casi siempre; difícil de vencer |
stlf |
STL + ETS | 3.6 | ✓ | Estacionalidad estable, tendencia caprichosa |
sarima |
auto_arima → SARIMA/SARIMAX | 9, 10 | ✓ | Dinámica rica; el que usa exógenas |
ets |
Suavizamiento exponencial | 8 | ✓ | El clásico robusto |
xgb |
STL + tendencia + boosting recursivo | 3.6 | ✓ | Patrones no lineales |
harmonic |
Fourier + ARIMA en errores | 10.5, 12.1 | con season_length=[m1,m2] |
Estacionalidad múltiple o de periodo largo |
croston |
Croston / SBA | — | no | Demanda intermitente (muchos ceros) |
Ensemble |
Combinación de todos | — | ✓ | Cuando ninguno domina |
Tu propio luchador¶
Cualquier subclase de BaseForecaster entra a la pelea:
from forecast_arena import BaseForecaster
class MiModelo(BaseForecaster):
name = "MiModelo"
def _fit(self, y, X=None): ...
def _predict(self, h, X_future=None): ...
Arena(models=["snaive", MiModelo()]).compete(y)
Opcionalmente implementa residuals() (habilita diagnóstico e intervalos
por default) y predict_interval() (bandas con tu propia teoría).