autoSarimaSmart function
Implementation
SarimaFit autoSarimaSmart(
List<double> series, {
required int s,
AutoConfig cfg = const AutoConfig(),
bool useOCSB_CH_for_D = true, // use OCSB+CH for deciding D
int? fixedD, int? fixedd, // istersen d/D’yi kilitle
}) {
final D = fixedD ?? (useOCSB_CH_for_D ? nsdiffsAuto(series, s) : 0);
final d = fixedd ?? ndiffs( differenceSeas(series, s, D) );
SarimaFit? best; double bestScore=double.infinity;
for (int p=0;p<=cfg.pMax;p++){
for (int q=0;q<=cfg.qMax;q++){
for (int P=0;P<=cfg.PMax;P++){
for (int Q=0;Q<=cfg.QMax;Q++){
if (p==0 && q==0 && P==0 && Q==0) continue;
try {
final fit = Sarima.fit(series, SarimaOrder(p,d,q,P,D,Q,s),
includeMean: cfg.includeMean, exactMLE: cfg.exactMLE);
// stability / invertibility: via combined polynomials
if (!_arStationary(fit.arComb) || !_maInvertible(fit.maComb)) continue;
final score = cfg.useBIC ? fit.bic : fit.aic;
if (score < bestScore) { bestScore=score; best=fit; }
} catch(_) { /* başarısız deneme */ }
}
}
}
}
best ??= Sarima.fit(series, SarimaOrder(1,d,0, 0,D,0, s),
includeMean: cfg.includeMean, exactMLE: cfg.exactMLE);
return best;
}