The exuber package has numerous functions which allow the creation of time series which incorporate rational bubble models. These include sim_psy1(), which generates a time series with a single episode of explosive behavior, sim_psy2() which generates a time series with two episodes of explosive behavior. Two rational bubble models are also currently included; sim_blan() which generates a time series containing rational bubbles as proposed by Blanchard (1979). The final function, sim_evans() generates a periodically collapsing rational bubble model series. It is the latter type of bubbles that the GSADF test that PSY attempts to detect.

To test the GSADF test and its associated date-stamping strategy, the BSADF test, PSY utilize a model of dividends and incorporate an Evans (1991) type bubble. We replicate that here to show 1) the ability of exuber to generate realistic simulated time series which incorporate bubbles and 2) to demonstrate the capabilities of radf() to detect them.

Let’s start be generating a realistic prices series incorporating an Evans (1991) type periodically collapsing bubble with the function sim_evans(). We will use the monthly parameterisation detailed in PSY (2015a), which corresponds to the empirical values from the S&P 500. {exuber} contains a function sim_div() which can be used to generate simulated dividends streams from a random walk with drift model.

set.seed(125)
# The fundamental value from the Lucas pricing model
pf <- sim_div(400)

# The Evans bubble term
pb <- sim_evans(400)

# the scaling factor for the bubble
kappa <- 20
# 
# The simulated price
p <- pf + kappa*pb

We can now plot this data to see what it looks like:

Let’s repeat

library(ggplot2)
library(purrr)

sims <- tibble(
  sim_psy1 = sim_psy1(100),
  sim_psy2 = sim_psy2(100),
  sim_evans = sim_evans(100),
  sim_blan = sim_blan(100)
)

To plot them altogether we can use theautoplot() method for “sim” objects. However, autoplot.sim() is for individual object thus we need some functional programming to plot them together. We can use the purrr::map() function, which iterates through every column of the data.frame and stores them into a list of “ggplot” objects, and then we can arrange with the ggarrange() function into a 2x2 grid.

sims %>%
  map(autoplot) %>%
  do.call(grid.arrange, .)