VIX Crush
Today, the VIX closed at 12.69, even lower than the close seen at the (current) all-time S&P closing high on March 28th. Perhaps more impressive, the VIX has declined over 40% from its high print just 15 trading days ago. Low VIX readings generally coincide with a benign environment for equities, but a low VIX reading combined with a decline of this magnitude has not been nearly so friendly.
There have been 38 prior 40% initial declines in the VIX from 15-day highs since the start of the data in 1990. An initial decline is defined as the first cross below -40% from a 15-day high that is also the first occurrence within 15 trading days. This way we eliminate repeat signals where the VIX may bounce only to cross back below the threshold. The average ending value of the VIX after a 40% decline was 20.17. For context, the median VIX close over the dataset was 17.68. So declines of this magnitude usually occur in very high volatility environments where the ending value is still elevated. Yet this time, the VIX started its ferocious decline from 21.36, a level barely higher than where prior declines have ended.
If we look at 40% declines where the ending value of the VIX is less than the median of 17.68 we find 18 prior observations. Results are uniformly negative for S&P returns up to a month out with statistically significant underperformance at four and five days out (i.e. the middle of next week around the CPI release). Obviously anything can happen, but patience may be rewarded rather than chasing the rally from these levels.


Code
class VIXCrush : Strategy{ public static void Run() { CsiBarServer server = new CsiBarServer(@"c:\data\csi\current"); var data = server.LoadSymbol("ES", new DateTime(1992, 1, 1));
var strat = new VIXCrush(); strat.PrimarySeries = data; strat.RunSimulation(); strat.EventStudyReport(); strat.Chart(); }
private double _median;
public int Length { get; set; } = 15;
public double Threshold { get; set; } = -0.40;
protected override void OnStrategyStart() { base.OnStrategyStart();
AsciiBarServer server = new AsciiBarServer(@"c:\data\orchestrator", AsciiBarServer.DOHLC); var vix = server.LoadSymbol("VIX Index"); _median = vix.Close.Median(); Console.WriteLine(_median);
Col1 = vix.Close; Col2 = Indicators.PercentOffHigh(vix, Length, x => x.High, x => x.Close); Col3 = Indicators.BarsSinceTrue(CrossBelow(Col2, Threshold));
Plot(vix, 1, Color.Black, paneSize: 40f); }
protected override void OnBarClose() { base.OnBarClose();
if (Col3.Last == 0 && Col3.Previous > Length && Col1.Last <= _median) { SnapEvent(Col1.Last); } }}