ARMA / ARIMA / SARIMA
Estimation MLE d’un ARMA, ARIMA ou SARIMA sans GARCH :
un seul paramètre de variance σ².
L’index temporel de y (DatetimeIndex, PeriodIndex, …) est préservé
sur résidus, fitted values et prévisions. Si d ou D > 0, des NaN
apparaissent en tête (alignement sur l’échantillon complet).
README source :
makystats/arma/README.md
Import
from makystats import arma, arima, sarima, select_arma_order
ARMA (stationnaire, d=0)
res = arma(y, mean="ARMA", ar=1, ma=1, trend="c").fit()
print(res.coef_table)
print(res.params["AR(1)"])
print(res.bse, res.pvalues)
print(res.cov_params())
print(res.forecast(steps=5, conf_int=True))
ARIMA (niveaux, souvent I(1))
L’utilisateur n’a pas à différencier à la main :
res = arma(prices, mean="ARMA", ar=1, ma=1, d=1, trend="c").fit()
res = arima(prices, order=(1, 1, 1), trend="c").fit()
res.forecast(steps=10) # niveaux (défaut si d>0)
res.forecast(steps=10, levels=False) # sur Δy
res.fitted_values_level()
d | Rôle |
|---|---|
0 | ARMA sur y |
1 | ARIMA sur niveaux non stationnaires |
2 | Double différenciation (rare) |
Sur Δy, trend='c' = dérive en niveau.
SARIMA
res = arma(ylog, mean="ARMA", ar=0, ma=1, d=1,
seasonal_order=(0, 1, 1, 12), trend="n").fit()
res = sarima(ylog, order=(0, 1, 1), seasonal_order=(0, 1, 1, 12), trend="n").fit()
res = arma(ylog, mean="ARMA", ar=[4], ma=1, d=1,
seasonal_order=(1, 1, 1, 12), trend="c").fit()
seasonal_order | (P, D, Q, s) |
|---|---|
P, Q | AR / MA saisonniers |
D | différences saisonnières |
s | période (12, 4, …) |
Récupération des résultats
| Attribut / méthode | Contenu |
|---|---|
params, coef, coefficients | Series des coefficients nommés |
bse, se, pvalues, tvalues | Inférence |
coef_table | Coeff / SE / z / Prob. / IC |
cov_params() | Covariance k×k |
conf_int(alpha=0.05) | IC des coefficients |
aic, bic, hqic, llf | Critères |
residuals, fitted_values | Séries indexées |
arparams, maparams | Sous-ensembles AR/MA |
arroots, maroots | Racines (|r| > 1 souhaité) |
sigma2 | Variance innovatrice |
Diagnostics
res.test_serial_correlation(lags=10)
res.test_heteroskedasticity(lags=5)
res.test_normality()
res.plot_diagnostics()
Sélection d’ordres
tab = select_arma_order(y, p_range=range(0, 4), q_range=range(0, 3), criterion="bic")
tab = select_arma_order(prices, d=1, p_range=range(0, 3), q_range=range(0, 2))
tab = select_arma_order(ylog, d=1, seasonal_order=(0, 1, 1, 12),
p_range=range(0, 3), q_range=range(0, 2), criterion="aic")
d et seasonal_order sont fixes pour toute la grille ; seuls p et q varient.
IC de prévision en niveau pour
d>0 : approximation indicative.
SARIMA dense → SARIMAX multiplicatif ; ARMA « troué » + saison → lags saisonniers additifs.