What: Add the Zivot-Andrews unit-root test, which allows one endogenously-determined structural break. Standard ADF badly under-rejects when a series has a break; this is the usual remedy.
Why it's a good first issue: it has a double runnable reference — arch.unitroot.ZivotAndrews and statsmodels.tsa.stattools.zivot_andrews agree to full precision, so a correct implementation is unambiguous.
Scope: trimmed grid search over candidate break dates, ADF regression with break dummies (level / trend / both), take the minimum t-statistic, then Baum's critical-value surfaces. Reuses the existing ADF machinery in crates/tsecon-diag/src/unitroot.rs.
Acceptance criteria
- Rust core +
#[pyfunction] + stub entry
- Fixture generator (never imports tsecon) + golden test matching
arch/statsmodels for all three break models
- Validation-matrix row
- The returned dict exposes the estimated break date, not just the statistic
Cross-reference: sup_f_test and bai_perron (in crates/tsecon-breaks/) already do break-date searching for coefficient breaks — worth reading for the trimming convention.
What: Add the Zivot-Andrews unit-root test, which allows one endogenously-determined structural break. Standard ADF badly under-rejects when a series has a break; this is the usual remedy.
Why it's a good first issue: it has a double runnable reference —
arch.unitroot.ZivotAndrewsandstatsmodels.tsa.stattools.zivot_andrewsagree to full precision, so a correct implementation is unambiguous.Scope: trimmed grid search over candidate break dates, ADF regression with break dummies (level / trend / both), take the minimum t-statistic, then Baum's critical-value surfaces. Reuses the existing ADF machinery in
crates/tsecon-diag/src/unitroot.rs.Acceptance criteria
#[pyfunction]+ stub entryarch/statsmodelsfor all three break modelsCross-reference:
sup_f_testandbai_perron(incrates/tsecon-breaks/) already do break-date searching for coefficient breaks — worth reading for the trimming convention.