Skip to contents

radf_sbz computes the WLS (kernel-volatility-weighted) recursive sup-ADF statistic of Harvey, Leybourne & Zu (2019), called supBZ in their notation, with wls_dfstat_grid() (internal). It returns the same shape as radf: the scalars adf, sadf and gsadf plus the full recursive paths badf and bsadf. The result therefore carries the radf_obj class, and the full summary(), datestamp, tidy and autoplot pipeline works with it when it is paired with radf_sbz_cv.

Usage

radf_sbz(data, minw = NULL, kernel = c("gaussian", "uniform"), h = NULL)

Arguments

data

A univariate or multivariate numeric time series object, a numeric vector or matrix, or a data.frame. A column may have leading or trailing NA values, which describes an unbalanced panel in which series enter or exit the sample at different times. Those periods are filled with NA in badf and bsadf and excluded from the adf, sadf and gsadf of that series. Interior NA values (a gap in the middle of a series) are not supported. When any series is padded in this way, the panel statistics (bsadf_panel and gsadf_panel) are not available, and the function returns NA for them with a warning.

minw

A positive integer. The minimum window size (default = \((0.01 + 1.8/\sqrt{T})T\), where T denotes the sample size).

kernel

Kernel for the spot-volatility estimator (eq. 6 of Harvey, Leybourne & Zu 2019), "gaussian" (default, as in the paper) or "uniform".

h

Bandwidth for the spot-volatility estimator. The default is leave-one-out cross-validation over the search range of the paper.

Value

An object of class radf_sbz_obj/radf_obj: a list with adf, sadf and gsadf (one value per series) and badf and bsadf (matrices, one column per series).

Details

The bundled radf_sbz_union combines this statistic with the classic supDF statistic into a bootstrap-calibrated union test. supBZ alone needs a bootstrap only to be tested and not to be defined, so it splits into a statistic and a critical-value function, as most of exuber does.

Note

The test needs the critical values from radf_sbz_cv, and neither radf_wb_cv nor radf_mc_cv applies. The null distribution of supBZ depends on the WLS weighting, so it needs its own critical-value function, which is data-dependent and uses a wild bootstrap, for the same reason as radf() and radf_wb_cv.

Status

[Experimental]

References

Harvey, D. I., Leybourne, S. J., & Zu, Y. (2019). Testing explosive bubbles with time-varying volatility. Econometric Reviews, 38(10), 1131-1151.

See also

radf_sbz_cv for critical values, and radf_sbz_union for the main bootstrap union-of-rejections test of the paper, against the classic supDF statistic.

Other volatility-robust tests: cusum_test(), radf_kp(), radf_sbz_union(), radf_sign(), radf_sign_dm(), radf_tt(), ssu_test()

Examples

# \donttest{
# Volatility triples at t = 100, then a strong explosive regime (rho = 1.03)
# runs from t = 120 to the sample end. The kernel-volatility weighting of supBZ
# costs enough power that the milder default bubble of sim_psy1() does not clear it
y <- sim_psy1(n = 200, te = 120, tf = 200, c = 0.03, alpha = 0, seed = 1,
  e = sim_vol_break(199))
res <- radf_sbz(y, minw = 20)
print(res)
#> 
#> ── radf_sbz (minw = 20, kernel = gaussian) ─────────────────────────────────────
#> 
#>    series    adf   sadf  gsadf
#>   series1  4.829  4.829  5.287
#> 

cv <- radf_sbz_cv(y, minw = 20, nboot = 200, seed = 1)
summary(res, cv = cv)
#> 
#> ── Summary (minw = 20, lag = 0) ────────── Wild Bootstrap (SBZ) (nboot = 200) ──
#> 
#> series1 :
#> # A tibble: 3 × 5
#>   stat  tstat  `90`  `95`  `99`
#>   <fct> <dbl> <dbl> <dbl> <dbl>
#> 1 adf    4.83 0.948  1.65  2.65
#> 2 sadf   4.83 2.24   2.49  3.26
#> 3 gsadf  5.29 2.77   3.00  3.58
#> 
tidy(res, cv = cv)
#> # A tibble: 1 × 4
#>   id        adf  sadf gsadf
#>   <fct>   <dbl> <dbl> <dbl>
#> 1 series1  4.83  4.83  5.29
datestamp(res, cv = cv)
#> 
#> ── Datestamp (min_duration = 0) ──────────────────────── Wild Bootstrap (SBZ) ──
#> 
#> series1 :
#>   Start Peak End Duration   Signal Ongoing
#> 1   129  129 130        1 positive   FALSE
#> 2   132  132 133        1 positive   FALSE
#> 3   134  134 135        1 positive   FALSE
#> 4   172  200 200       29 positive    TRUE
#> 
autoplot(res, cv = cv)

# }