The Bear is Here

December 22, 2018

(This article was first published on R – Quintuitive, and kindly contributed to R-bloggers)

October and December have been devastating for stocks. It wasn’t until Friday though that we officially reached the depths of a bear market.

There are different theories, the most common is 20% pullback in an index. As readers of this blog are aware, I follow a slightly different definition, based on Jack Schannep’s work. Based on this definition, a bear market is official when two of the three major indexes (Dow Jones Industrial, S&P 500 and Dow Jones Transportation) reach a 16% decline of the most recent high. For the mathematically inclined, the 16% is not random – simply it takes about 19% gain off the bottom of a 16% decline to reach the same level. Thus, a bear market is official at 16%, and a bull market – at 19%.

Friday was significant on these metrics. Here is the situation on the S&P 500:


sp = getSymbols("^GSPC", from="1900-01-01", auto.assign=F)
sp.ret = ROC(Cl(sp), type="discrete")
table.Drawdowns(sp.ret["2008/"], top=5)

This has the following output:

The current pullback is the first 16+% correction since 2008. The story is the same on the Dow Jones Industrial:

And slightly different on the Down Jones Transportation:

This is certainly the most cherished bear market in US history, but that won’t make it less painful or less damaging. A recession does not always follow a bear market, but does quite often. How often – check Jack Schannep’s book. There are a few interesting statistics, like the average bear market decline and duration. Let’s take the S&P 500 (history from 1950) and do the math:

dd = table.Drawdowns(sp.ret, top=20)
# A visual inspection shows that we
# 11 previous bear markets 
mean(head(dd, 11)[,'Depth'])
# [1] -0.3288091 - 33%
median(head(dd, 11)[,'Depth'])
# [1] -0.2797 - 28%
max(head(dd, 11)[,'Depth'])
# [1] -0.1934 - 19%

A gloomy picture. The average bear market is 33%, the median bear market – 28% and the smallest – 19%. In other words, if history repeats itself, there is more pain to come. Significantly more on average.

The last piece of the puzzle (mine puzzle, Jack Schannep has a lot more), is to check the market for oversold signs. For this, Schannep has proposed a simple, yet powerful, indicator to forecast market bottoms. It was extremely precise in the 2011 pullback. Here is the code:

capitulation = function(spx=NULL, dji=NULL, nyse=NULL)

  spx = if(is.null(spx)) na.fill(Ad(getSymbols("^GSPC", from="1900-01-01", auto.assign=F)), "extend")  else spx
  dji = if(is.null(dji)) na.fill(Ad(getSymbols("^DJI", from="1900-01-01", auto.assign=F)), "extend") else dji
  nyse = if(is.null(nyse)) na.fill(Ad(getSymbols("^NYA", from="1900-01-01", auto.assign=F)), "extend") else nyse
  spx.macd = MACD(spx, nFast=1, nSlow=50, maType=EMA)
  dji.macd = MACD(dji, nFast=1, nSlow=50, maType=EMA)
  nyse.macd = MACD(nyse, nFast=1, nSlow=50, maType=EMA)
  merged = merge(spx.macd[,1], dji.macd[,1], nyse.macd[,1], spx, dji, nyse, all=FALSE)
  merged = cbind(ifelse(merged[,1] <= -10 & merged[,2] <= -10 & merged[,3] <= -10, 1, 0), merged)
  colnames(merged) = c("ind", "spx.ind", "dji.ind", "nyse.ind", "spx.close", "dji.close", "nyse.close")
  capitulation = merged[merged[,1] == 1,2:NCOL(merged)]
  return(list(capitulation=capitulation, details=merged))
cap = capitulation()
#              spx.ind   dji.ind  nyse.ind spx.close dji.close nyse.close
# 2009-03-05 -16.48942 -16.15225 -16.95556    682.55   6594.44    4267.60
# 2009-03-06 -15.84705 -15.21571 -16.07971    683.38   6626.94    4284.49
# 2009-03-09 -16.14169 -15.70102 -16.65649    676.53   6547.05    4226.31
# 2009-03-10 -10.42353 -10.43552 -10.87757    719.60   6926.49    4499.38
# 2011-08-08 -13.47900 -11.42400 -14.88095   1119.46  10809.85    6895.97
# 2011-08-10 -12.61128 -11.47501 -11.57217   1120.76  10719.94    7101.24

The above table shows that there is no extreme selling in the current recess. All in all – more troubles ahead.

The post The Bear is Here appeared first on Quintuitive.

To leave a comment for the author, please follow the link and comment on their blog: R – Quintuitive. offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...

If you got this far, why not subscribe for updates from the site? Choose your flavor: e-mail, twitter, RSS, or facebook...

Comments are closed.

Search R-bloggers


Never miss an update!
Subscribe to R-bloggers to receive
e-mails with the latest R posts.
(You will not see this message again.)

Click here to close (This popup will not appear again)