Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

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:

require(quantmod)
require(PerformanceAnalytics)

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)
print(dd)
# A visual inspection shows that we
# 11 previous bear markets
# [1] -0.3288091 - 33%
# [1] -0.2797 - 28%
# [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)
{
require(quantmod)

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()
tail(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.