Balsam Research
3 min read

Put Call Ratios

Event Studies

Today’s -1.57% decline in the cash S&P was the largest since January 31st, which coincidentally was also the last day of the month and the day before a FOMC announcement. On February 1st the S&P rebounded 1.25%. We’ll see if history repeats with tomorrow’s FOMC meeting. Options traders are certainly betting that way.

The Nasdaq ISEE Index tracks opening options transactions excluding market makers, which according to Nasdaq, is “best thought to represent market sentiment.” Despite today’s large and persistent decline, call buyers outnumbered put buyers two to one. This seemed like a strange disconnect to me and worthy of further investigation.

If we standardize the ISEE equities only call/put ratio with a 252-day z-score (approximately one year), today’s value clocked in at 1.35 standard deviations. Taking the opposite and symmetrical threshold of -1.35 standard deviations for daily standardized S&P returns we find 12 prior observations where there is a similar disconnect. I had assumed this would be a contrary signal with the market disappointing call buyers but that was not the case. Short-term returns were very strong. However I would downplay the statistical significance given the small sample size.

Event study showing returns after high ISEE readings on down days Chart showing ISEE call/put ratio event dates

The CBOE equity put/call ratio is another options based sentiment indicator that has been around a long time. I even wrote a paper published in the Journal of Technical Analysis back in 1998 examining its utility. But the original idea for measuring sentiment using put/call volume ratios goes all the way back to 1971 in a Barron’s article by the late, great Marty Zweig. The CBOE told a similar story today as the ISEE call/put ratio. Standardizing the CBOE equity put/call ratio with a 252-day z-score, today’s 0.60 reading clocks in at -0.49 standard deviations. (Note the inversion. A value of 0.50 for the CBOE put/call ratio would be roughly comparable to today’s ISEE call/put indicator reading.) While certainly not extreme, it is low considering the magnitude of the S&P’s decline. Normally we would expect many more put buyers and therefore a higher CBOE equity put/call ratio. Even more surprising is that the put/call ratio also declined versus the prior day’s reading. In other words, options traders are even more bullish today than yesterday, emboldened by the decline or perhaps confident that the Fed will ride to the rescue tomorrow.

If we look at two standard deviation declines in S&P futures where the CBOE equity put/call ratio also declined versus the prior day we find 51 prior observations. These results were also a surprise to me with positive results the next one to three days out. Some of this is undoubtedly due to the normal short-term mean reversion tendencies of the S&P; however, two standard deviation declines in and of themselves don’t show nearly as strong of a result.

Event study showing returns when put/call ratio falls on big down days Chart showing CBOE equity put/call ratio event dates

No matter how this plays out, markets are at a very interesting juncture and we’ll know soon enough if the options traders got it right, contrary to contrary opinion!

Code
class ISEECallPut : Strategy
{
public static void Run()
{
CsiBarServer server = new CsiBarServer(@"C:\data\csi\current");
var data = server.LoadSymbol("ES", new DateTime(2006, 1, 3));
var strat = new ISEECallPut();
strat.PrimarySeries = data;
strat.RunSimulation();
strat.EventStudyReport();
strat.Chart();
}
protected override void OnStrategyStart()
{
base.OnStrategyStart();
Col1 = TimeSeries.Load(@"c:\data\temp\isee.csv");
//winsorize one extreme and possibly erroneous reading to the prior highest value observed
Col1 = Indicators.Winsorize(Col1, 0, 410);
Col1.Name = "ISEE Equity";
Col2 = ZScore(Col1, 252);
Col3 = PercentChange();
Col4 = ZScore(Col3, 252);
Plot(Col2, 1, Color.Blue, "Column");
}
protected override void OnBarClose()
{
base.OnBarClose();
if (Col2.Last >= 1.35 && Col4.Last <= -1.35)
{
SnapEvent();
}
}
}