monitor implements real-time monitoring. You fix a training window
[1, T*] that is assumed free of exuberance and calibrate a critical value
on it. The function then compares the running recursive statistic at each
subsequent point T*+1, ..., T with that fixed boundary and flags the first
date at which the boundary is breached.
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
NAvalues, which describes an unbalanced panel in which series enter or exit the sample at different times. Those periods are filled withNAinbadfandbsadfand excluded from theadf,sadfandgsadfof that series. InteriorNAvalues (a gap in the middle of a series) are not supported. When any series is padded in this way, the panel statistics (bsadf_panelandgsadf_panel) are not available, and the function returnsNAfor them with a warning.- r_star
The end of the training window: a fraction in
(0, 1)of the sample (default0.5), or an integer number of observations if>= 1.- minw
A positive integer. The minimum window size (default = \((0.01 + 1.8/\sqrt{T})T\), where T denotes the sample size).
- nboot
Number of wild bootstrap replications for the training critical value. It is ignored unless
boundary = "bootstrap".- sig_lvl
Significance level for the monitoring boundary on the 0 to 100 scale used throughout the package, one of
90,95(default) or99.- lag
A non-negative integer. The lag length of the Augmented Dickey-Fuller regression (default = 0L).
- type
Lag selection for the wild bootstrap process, passed to
radf_wb_ps_cv. It is ignored unlessboundary = "bootstrap".- seed
Optional seed for the bootstrap draws. It is ignored unless
boundary = "bootstrap".- boundary
"bootstrap"(default, Phillips & Shi 2020),"kurozumi"(the closed-form SADF/GSADF boundary of Kurozumi 2020) or"fluc"(the FLUC boundary of Homm & Breitung 2012).- s0
The range of window starts of Kurozumi (2020), as a fraction of the training length. It is used only when
boundary = "kurozumi". The default0is theSADFcase, with the window start fixed at1.0.4or0.8switches to theGSADF_{s0}case, where the window start ranges over[1, floor(T* * s0)]. These are the only two values for which the scaling constants of his boundary function are tabulated.
Value
An object of class monitor_obj: a list with the full-sample
statistic path (stat, which is bsadf for
boundary = "bootstrap" and badf for "kurozumi" and
"fluc"), the calibrated boundary (one flat value for each series),
the length of the training window T_star, and alarm and
alarm_date (the first observation or date in the monitoring period at
which stat breaches the boundary, NA if it never does).
Details
boundary = "bootstrap" (the default) implements Phillips & Shi (2020).
The boundary is a wild-bootstrap quantile of the GSADF-type statistic (see the
tb parameter of radf_wb_ps_cv), and it is compared with the
bsadf sequence of radf(). The function calibrates on the training
window only (data[1:T*]) and not on the full series. The null-model
fit inside radf_wb_ps_cv (adf_res()) uses all the data it
is given and does not truncate them to tb, so passing data after
T*, which may be explosive, directly to it would leak future information
into the calibration of the null.
boundary = "kurozumi" implements the closed-form alternative of Kurozumi
(2020). It needs no bootstrap and compares a published constant (his Table 1)
with the badf sequence of radf(). The default s0 = 0 gives
his SADF(k) detector, where the window start is fixed at 1. Setting
s0 to 0.4 or 0.8 switches to his GSADF_{s0}(k)
generalization. The window start then ranges over [1, floor(T* * s0)]
and is not fixed at 1, and the comparison uses his boundary function,
which varies with k and is not constant, together with its own published
scaling constant. sig_lvl must be one of 90, 95 or
99, the levels that his table tabulates.
boundary = "fluc" implements the FLUC detector of Homm & Breitung (2012).
Their DF_{t/n} is also exactly the badf sequence of radf(),
and it is compared with a published constant from their Table 7 (the case
without detrending) and not with a simulated one. sig_lvl must be one of
90, 95 or 99.
Note
The function returns its own class and not radf_obj, so it does not work
with summary(), \link{datestamp} and tidy. It has its own print() and
autoplot() methods instead. print() shows the boundary and the alarm. See
vignette("naming-and-analysis", package = "exuber") for which functions fit
the shared pipeline and which do not.
References
Phillips, P. C., & Shi, S. (2020). Real time monitoring of asset markets: Bubbles and crises. In Handbook of Statistics (Vol. 42, pp. 61-80). Elsevier.
Kurozumi, E. (2020). Asymptotic properties of bubble monitoring tests. Econometric Reviews, 39(5), 510-538.
Homm, U., & Breitung, J. (2012). Testing for speculative bubbles in stock markets: A comparison of alternative methods. Journal of Financial Econometrics, 10(1), 198-231.
See also
radf_wb_ps_cv for the underlying wild bootstrap, and
datestamp for the existing full-sample dating of origination and
collapse, which is not a monitoring procedure.
Other monitoring:
monitor_cusum(),
monitor_lbi(),
monitor_quantile()
Examples
# \donttest{
# A bubble-free training window (first half), explosive from t = 150 on
y <- sim_psy1(n = 200, te = 150, tf = 200, seed = 7)
# Default: Phillips & Shi (2020) wild bootstrap boundary
mon <- monitor(y, r_star = 0.5, nboot = 200)
print(mon)
#>
#> ── monitor (T* = 100 / 200, minw = 27, sig_lvl = 95%, boundary = bootstrap) ────
#>
#> series boundary alarm alarm_date
#> series1 2.051 156 156
#>
autoplot(mon)
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_segment()`).
# Closed-form boundary of Kurozumi (2020), which needs no bootstrap
mon_kz <- monitor(y, r_star = 0.5, boundary = "kurozumi")
autoplot(mon_kz)
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_segment()`).
# Homm & Breitung (2012) FLUC boundary
autoplot(monitor(y, r_star = 0.5, boundary = "fluc"))
#> Warning: Removed 2 rows containing missing values or values outside the scale range
#> (`geom_segment()`).
# }
