Trading Strategy: the VIX Spread and the Stock Market


This post will be more complicated than most I write, but I think folks interested in the VIX and volatility and what they tell us about the markets will find this to be a new (and I hope useful) concept. Unfamiliar with the VIX? Read VIX & More’s primer.

As I discussed in The VIX isn’t Magical, the VIX is usually pretty predictable. Even though the VIX is meant to be forward-looking, it tends to just reflect recent past market volatility. To illustrate, the graph below shows the VIX (red) relative to the rolling 20-day volatility of the S&P 500 (blue) YTD.


Note how generally speaking the two (one looking backwards, the other supposedly forward) follow each other closely. Occasionally however, the two diverge. This was seen in late-Oct./early-Nov. when the VIX fell sharply without a similar change in historical volatility (red arrow).

Bill Luby of VIX & More has been looking at how the stock market responds when divergences such as these occur. The strategy I’m about to share is a contribution to that discussion. On the surface, my conclusions contradict Bill’s but that’s because we’re looking at different timeframes (I’ll discuss further at the end of this post).


First, let’s look at the graph above in a different way. The graph below shows the difference between the VIX and 20-day historical vol. in percentage terms in blue. Bill refers to this as the “VIX Spread”. In red is a 50-day moving average of this spread.


Note that generally the VIX runs hotter than historical volatility (i.e. the blue line is greater than zero), but occasionally (such as now), it dips below historical vol.

Next, let’s look at the results of trading strategies that go long the S&P 500 tomorrow when the VIX Spread today is below (red) or above (green) the 50-day moving average. Geek note: this test is frictionless.


The graph shows that historically the market has been stronger when the spread between the VIX and historical volatility has been lower, or put another way, when the VIX foresees less future volatility than it usually does relative to past volatility.

This approach stood up very well against the bear market of the early-2000’s and reduced volatility and average drawdowns in our hypothetical portfolio by about 30% and 70% respectively over the entire test, while still matching market returns.

Note however that the test above only extended to May of 2007. This relationship fell apart (reversed actually) in the bear market that began late in 2007. The graph below shows the same strategy traded to the present.


The question becomes: has this VIX Spread trading strategy temporarily or permanently changed course?

It’s hard to say. Most of the losses came in October of this year and as I’ve discussed before, most contrarian indicators completely fell apart in October. Savvy readers will note that this strategy is also contrarian in a roundabout way. High volatility tends to accompany down markets (which Bill touched on here) so buying when the VIX is “relatively” low compared to past volatility could be interpreted as trading against downward pressure.

Note that these results appear to contradict Bill’s conclusions about the VIX Spread (namely, that high spreads are bullish), but I think that’s because Bill’s results are looking at returns further out (over the following couple of weeks) vs the next day.  I’m going to continue poking and prodding at this strategy to include Bill’s more long-term oriented observations as well.

More to follow.

Happy Trading,

To stay up to date with what’s happening at the MarketSci Blog, we recommend subscribing to our RSS Feed or Email Feed.

17 Responses to “Trading Strategy: the VIX Spread and the Stock Market”

  1. How are you calculating historical 20 day volatility? I’ve tried a few ways but don’t produce a similar looking chart.



  2. 2 marketsci

    RE to Josh: I used Bill Luby’s method of annualizing the 20-day vol. All of the formulas below are as they would appear in excel. Say you had two columns, the first for hte date and the second for the closing prices. In column 3, take the natural log of all daily changes: LN(B2/B1). In column 4, annualize the 20-day vol: STDEV(B2:B21)*SQRT(252)*100. That’s it. Let me know if any of that didn’t make sense.


  3. Thanks for the quick reply. One question though. In column 4 do you mean to annualize the 20 day standard dev of column3 ( meaning the volatility of ln(b2/b1 ) ?


  4. 4 marketsci

    Ooops…you caught me. Yes, that should have read: STDEV(C2:C21)*SQRT(252)*100. So it’s the std dev of the natural log of the price changes. Good eyes, michael

  5. I think ( 252 / Lookback Period ) might be more accurate than sqrt(252). So for 20 day volatility it would be (252/20). I’m assuming 20 days is used since 20 to 21 trading days approximates a calendar month.

    Sqrt(252) is about 15.87, whereas (252/21) = 12

    (trading days per year / period to annualize ) = # of periods per year


  6. 6 marketsci

    RE to Josh: the (252) is correct. To annualize standard deviation, you multiply times the square root of the number of periods per year of the data on which the standard deviation was calculated. So annualizing standard deviation of monthly returns would be sqrt(12). Annualizing standard deviation of daily returns (which we’re doing here) would be sqrt(252). The fact that we used a 20-day lookback (or any other lookback) would not impact that.

    The 20 day lookback for the standard deviation isn’t based on the fact that it’s roughly a month, per se – it’s based on the fact that the resulting historical vol. calculation has historically tracked very close to the VIX. A 30-day lookback tracks about equally as well.

    Hope that helps.


  7. sorry I meant stdev to the power of (252/20) …

    Maybe I’m confusing the annualization of a price change versus anualization of volatility, but I have trouble wrapping my head around the squareroot method. For example, if I had discovered a holy grail system (yeah right) that produced 5% gains per week, to figure out my annualized return wouldn’t I raise 1.05 to the 52nd power? Is it different with a stdev or am I completely off base?

    It doesn’t make sense to me that for example a 10% stdev over a 60 day period would give the same annualized value as a a 10% stdev over a 20 day period.


  8. 8 marketsci

    RE to Josh: completely different for std. dev. because remember (unlike returns) vol. doesn’t “build off of” the last data point. Instead, additional data points actually reduce vol. because some of it cancels out. Hope that made sense.

    Of course, all of this is sort of junk science because even the (*sqrt(252)) method is based on an assumption of a random walk ( but I digress.


  9. Yes, that does make sense… however…

    Your formula is annualizing the 20 day stdev of day-to-day price changes, as opposed to the 20 day stdev from a 20 day mean. I get your point about the difference between annualized returns vs. stdevs. But is that the case when it is stdev from a mean versus a day-to-day change?

    Considering that average true range or equivalent are highly correlated to a stdev from a mean, it’s probably picking fly sh*t out of pepper, but you know, devil in the details and all.




    The reason I keep beating this dead horse is because I’d like to size positions in a system I’m working on based on “expected risk-adjusted returns”. Then when I transition from Tradestation to a platform capable of trading a portfolio (Tradestation strategies can only trade a single intrument, its pretty lame) I would incorporate rules to handle allocation of capital, depending on perceived opportunity in any specific market. The ultimate goal is to be diversified in multiple time frames, markets, and systems and reduce the time that money is just sitting there waiting for opportunity.
    Anyway, your input is much appreciated.

  10. 10 marketsci

    RE to Josh: no comprendo. You’re correct, the formula I provided is annualizing the standard deviation of 20-days of daily price changes. But I’m not sure what the second part means “20-day std. dev. from a 20-day mean”. Can you email me an excel file with what you’re trying to do to help me understand? Thanks, michael

  11. Michael,

    I’m not doing this in excel so no file, sorry. Basically, I mean rather than this:

    STDEV(C2:C21) (where column C is the log of close-to-close price change)

    just do this:

    STDEV(B2:B21) (where column B is just the closing price series, the raw data)

    The first method is averaging the close-to-close change and telling you what is the standard deviation from that average.
    The second is just averaging the raw data; the closing prices and then telling you what is one stdev from the average.

    To make an analogy, the first is to a 20 day average true range indicator as the second is to a 20 day simple moving average indicator.

    Does that make sense? I don’t have Excel right now, just OpenOffice, but I could send you a .csv file if you want for an example.


  12. 12 marketsci

    RE to Josh: I understand what you’re trying to do now. This is similar to how we calculate a bollinger band for example. That’s definitely another way to measure the volatility of an instrument, the problem though is it’s going to rise and fall dramatically with the value of the index. Think about 1950 when the S&P 500 was at 100 (or whatever) – taking an sdev of the closing values would have produced an incredibly small number compared to today. For a more recent example, think about September’s number compared to November. Even though Nov has been far more volatile, Sep might show a higher reading. I don’t think it works in this example. Just my 2c. michael

  13. Yes, you would have to normalize the value. The index divided by the stdev would work.

    I personally like this:

    ( close – average(close,period) ) / standarddev(close,period)

    Where period = length of time for average and stdev. If I plot this in a chart, when it reads 2 it means we’re currently at 2 standard deviations for the lookback period. Pretty simple way to normalize. I could translate to excel for you if you want.


  14. I’m commenting on this post so late after the fact but I’ve recently discovered your site and I’m taking a while digesting all of the great posts you have. I’ve been spending a lot of time lately looking at the VIX, trying discover any secrets that it has. In doing that, I’ve tried recreating the strategy in this post and after staring at it for two days, it seems to me that the standard deviation of the S&P 500 “overpowers” the VIX aspect of the strategy (sorry, I’m not sure what the statistical term for it is) so that the strategy really just becomes, “Buy when the standard deviation of S&P 500 returns are lower than the 50 day moving average of those returns and sell when they are greater than the average.” The VIX in that strategy just seems to be noise. I’m probably just not calculating something correctly.

    To continue out the formula the the above comment, if column D was the daily closing prices for the VIX and column E was STDEV(C2:C21)*SQRT(252)*100, would the spread simply be (D21-E21) ? Thanks, David

  15. 15 marketsci

    RE to David: assuming the “S&P 500 HV overpowering VIX” observation is correct (added to the to-do list to take a look as well), then a little roundabout logic says it makes perfect sense with this post which is showing another flavor of vol relative to a 50-day average:

    Yes, formula looks good. From looking at the graph it looks like I did a percentage difference, so (D21 – E21) / E21 I believe.


  1. 1 » Trading Strategy: the VIX Spread and the Stock Market » Stock Market Investing
  2. 2 Wednesday links: they are the system « Abnormal Returns

Leave a Reply

Please log in using one of these methods to post your comment: Logo

You are commenting using your account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s