--- name: adf_kpss_stationarity kind: function lang: py domain: datascience version: "1.0.0" purity: pure signature: "def adf_kpss_stationarity(values: list, alpha: float = 0.05) -> dict" description: "Test de estacionariedad de una serie temporal combinando ADF (H0=raiz unitaria/no estacionaria) y KPSS (H0=estacionaria) de statsmodels. Devuelve por test estadistico, p_value, lags y conclusion, mas un veredicto de consenso ('stationary'|'non_stationary'|'inconclusive'). Avisa de correlacion espuria (Granger-Newbold) cuando la serie no es estacionaria. Descarta None/NaN/infinitos; <8 puntos validos -> nota 'datos insuficientes'." tags: [statistics, timeseries, stationarity, adf, kpss, unit-root, eda, forecasting, python] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "" imports: [math, warnings, statsmodels] params: - name: values desc: "serie temporal de valores numericos en orden cronologico. None/NaN/infinitos/no-numericos se descartan antes del test." - name: alpha desc: "nivel de significancia para ambos contrastes (default 0.05). p "stationary" # Random walk (suma acumulada): NO estacionario paseo = np.cumsum(rng.normal(0, 1, 300)).tolist() res = adf_kpss_stationarity(paseo) res["verdict"] # -> "non_stationary" res["warning"] # -> aviso de correlacion espuria ``` ## Cuando usarla Antes de correlacionar, regresionar o modelar (ARIMA, VAR) una serie temporal, para saber si es estacionaria. Es el primer paso obligatorio del analisis de series: una serie no estacionaria (con tendencia o raiz unitaria) rompe los supuestos de la regresion OLS clasica y, si la correlacionas con otra serie no estacionaria, obtienes una correlacion alta pero **espuria** (Granger-Newbold). Si el veredicto no es `"stationary"`, diferencia la serie o pasala a retornos (`to_returns`) y vuelve a testear. ## Gotchas - Es pura pero importa `statsmodels.tsa.stattools` (instalado en `python/.venv`). - ADF y KPSS tienen hipotesis nulas OPUESTAS: en ADF `p