The VIX Futures Basis: Why VIX Futures trade at a different price to the VIX Index
In the eye of the recent storm, with VIX up over 50, many traders were looking to “short the VIX” using products like TVIX.
“Surely it’s going to coming back down?”
Well yeah, it will, eventually, but that doesn’t mean that you can profitably short VIX products.
First, some basics…
What is VIX?
VIX is a benchmark index for SPX volatility.
It shows the SPX options market’s expected value of volatility over the next 30 days.
You can think of it as “What does the SPX options market think SPX volatility will be over the next 30 days?”
Technically it is calculated based on the 30-day variance swap and then converted to a volatility calculation.
So the VIX index is just a mathematical calculation… you can’t trade it.
So what can you trade?
The CBOE lists VX futures which settle to the cash value of the VIX index at their expiration date.
For example, the 20 May VX contract settles to the value of the VIX index on 20 May. (Give or take… there are a few technicalities around it, but they’re not important here.)
VX futures are essentially forward bets on what VIX is going to be on the expiry date of the futures contract.
There are typically a number of contracts in play at any point, each with different expirations.
Term Structure and “Cash-and-Carry Arbitrage”
It’s not immediately clear whether the 20 May VX contract (say) should trade at a higher or lower price than the index. Especially as the “underlying asset” (the VIX index) cannot be traded.
So, first, let’s consider how a futures contract on an underlying which can be traded is priced. We’ll consider the S&P 500 E-mini futures contract (ES).
The June ES contract (ESM2020) settles to the cash value of the SPX index in June 2020. It’s April now, so what should be the value of that futures contract?
In the short term, arbitrage rules the trading world. If two things are the same, they will have the same value. If they weren’t traders would buy the cheaper one and sell the expensive one and make a profit. This would act to bring the prices of the things back in line.
Therefore, the difference in price between the futures and the index must be related to the way in which those two things are different.
Let’s think about the way those things might be different. Let’s consider the experience of “buying the index” until June 2020, and buying the ESM2020 contract.
We can’t actually “buy the index” – we have to buy all the constituent stocks that make it up in the weightings they are held in the index. We need some cash (which we either have lying around or we borrow) and we pay the full notional value of those stocks. Then some of those stocks will pay us dividends in the period we hold them.
When we buy the ESM2020 futures contract we need less cash. We just post margin. But we also don’t own any stocks, so we don’t receive any dividends.
To summarise, here are the differences:
- The futures require less cash outlay than we need to buy stocks. If we buy the futures then we can invest the extra cash and earn interest on it.
- The stocks pay us dividends, the futures do not.
At this point, the naive trader might be trying to work out which one is better.
But remember that, in the short term, arbitrage rules everything. The futures will be actively arbitraged against the stock basket, meaning that the price of their cashflows are equivalent.
Cashflows that are the same will have the same price. That’s the law of no-arbitrage and it’s the closest thing to a law that exists in finance.
How does that work?
Well, the arbrigateurs will calculate a “fair value” of the futures contract, given the value of the index, the expected dividends and the interest rate they can fund themselves at. Then, they write down the total cashflows over the period.
-ESM2020 + Expected interest received on cash = -SPX + Expected dividends received on stocks
By re-arranging this we can see that the fair value of ESM2020 is…
ESM2020 = SPX + Expected interest Received - Expected dividends received
If ESM2020 is trading significantly over this “fair value”, index arbitrageurs will sell ESM2020 and buy the stock basket. If it is trading under this “fair value”, they will buy ESM2020 and sell the stock basket. We call this “cash and carry arbitrage.”
Because of this arbitrage, ES contracts always track very closely to their fair value.
- If the interest paid on cash exceeds the dividends paid by stocks, then the futures will trade at a premium to the index.
- If the dividends paid by stocks exceed the interest paid on cash, the futures will trade at a discount to the index.
Given the clear “cash and carry” relationship between ES futures and SPX it is easy to understand why futures expiring on a certain date are priced the way they are.
With VX futures, however, there is no tradeable underlying asset to arbitrage to – so these rules don’t hold. You might try to price them by trying to forecast what VIX is going to be at expiry. That’s really the best you can do – but in practice VX futures tend to take on a bit of a life of their own, bouncing around any reasonable forecast of “fair value” with considerable volatility.
That can make them quite attractive for alpha trading.
The VX Futures Term Structure
So let’s look at the prices of VX futures at various expiry dates. We call this the “VX Term Structure”.
We can get snapshot historical VX prices from vixcentral.com
We’ll use the
rvest tidyverse package to scrape the data using R.
library(tidyverse) library(rvest) vixcentral <- read_html('http://vixcentral.com/historical/?days=5000') vix_ts <- vixcentral %>% html_node('table') %>% html_table(header = TRUE)
vix_ts <- vix_ts %>% # F9 to F12 have blanks, and such are loaded mutate(Date = as.Date(Date, format = '%Y-%m-%d'), F9 = as.numeric(F9), F10 = as.numeric(F10), F11 = as.numeric(F11), F12 = as.numeric(F12)) %>% select(Date, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12) %>% filter(!is.na(Date)) %>% arrange(Date) vix_ts_tidy <- vix_ts %>% pivot_longer(-Date, names_to = 'Contract', names_prefix = 'F', names_ptypes = list(Contract = integer()), values_to = 'Price') %>% filter(Price != 0 & !is.na(Price))
Let’s plot the term structure for the earliest date of each year for which we have data.
This will give us a series of line plots, with each line showing the term structure at a given date.
Each point on the x-axis represents the next VX contract to expire. So x = 1 represents the contract with the least time to expiry, x = 2 with the next least time to expiry and so on. The y-axis represents the price of the futures contract.
library(lubridate) firstdates <- vix_ts %>% mutate(year = year(Date)) %>% group_by(year) %>% summarise(Date = min(Date)) vix_ts_tidy %>% filter(Contract <= 8) %>% # Only plot first 8 contracts inner_join(firstdates, by = 'Date') %>% ggplot(aes(x = Contract, y = Price, color = factor(Date))) + geom_point() + geom_smooth(method = 'loess', formula = y ~ x, se = FALSE) + ggtitle('VX Futures Term Structure for 12 different days between 2009 and 2020')
As we go along the x-axis there is longer to expiry.
Most of the time we see that VX futures get more expensive the longer we have to expiry. There are exceptions, of course, such as the red series in 2009-03-18 and the purple series at the beginning of 2019. But at most times, if we want to gain exposure to the VIX index, we have to pay more, the further out we go.
There is generally a “cost” to holding a VX position. It costs us more the more time we want exposure and, all things being equal, the value of our VX position will lose money over time as time passes and we “slide down the curve”.
Why might this be?
Well, let’s plot VIX…
vixdata %>% ggplot(aes(x=Date, y=VIX)) + geom_line() + ggtitle('VIX Index')
What do you notice about this?
- There are more really big up moves than down moves
- It seems to be locally mean-reverting – it “comes back” closer to the mean value over time.
- There appears to be a “floor” under which VIX is unlikely to go much lower.
This last point makes intuitive sense. Unless something significant changes in the structure of the equity market, it’s unlikely we’ll see 30-day annualised volatility of SPX drop much lower than 9%, for example.
Let’s imagine it’s November 2017 and VIX is below 10.
vixdata %>% filter(Date >= '2017-11-01') %>% select(Date, VIX) %>% head(5)
## # A tibble: 5 x 2 ## Date VIX ## ## 1 2017-11-01 10.2 ## 2 2017-11-02 9.93 ## 3 2017-11-03 9.14 ## 4 2017-11-06 9.4 ## 5 2017-11-07 9.89
If you look at the chart of VIX above, you’ll notice that the VIX index has never printed below 9. So, on the 3rd of November 2017, you can understand plenty of people wanting to bet on VIX being higher, but much fewer people are going to want to bet on VIX being lower than 9.
For every VX futures contract traded there needs to be a buyer and seller.
So, with VIX at 9.14 you’re unlikely to find too many sellers. VIX is unlikely to go much lower than 9, and quite likely to go haywire to the upside at some point. So, in order for VX contracts to trade, they’re going to need to be priced such that people are prepared to sell them. They’ll need to trade at a higher price than the VIX index they settle to.
Now let’s look what the VX futures prices were on 3rd November 2017:
vix_ts_tidy %>% filter(Date == '2017-11-03')
## # A tibble: 9 x 3 ## Date Contract Price ## ## 1 2017-11-03 1 11.0 ## 2 2017-11-03 2 12.3 ## 3 2017-11-03 3 13.5 ## 4 2017-11-03 4 14.1 ## 5 2017-11-03 5 14.7 ## 6 2017-11-03 6 15.3 ## 7 2017-11-03 7 15.7 ## 8 2017-11-03 8 16.2 ## 9 2017-11-03 9 16.6
And indeed that’s exactly what we see.
Futures traders are only prepared to sell VX at a premium to the index. And the value of this premium increases as the futures contracts have longer to expiry.
A long position in VIX is a very attractive commodity when VIX is low, so you have to pay to hold it.
What about when VIX is very high? From looking at the chart above it would seem like you’d struggle to find buyers of VX at 80 or more when VIX hit 80 in March 2020. Let’s look at what happened then:
vixdata %>% filter(Date == '2020-03-16') %>% select(Date, VIX)
## # A tibble: 1 x 2 ## Date VIX ## ## 1 2020-03-16 82.7
It would be hard to find someone prepared to buy VX futures at or above 80, especially at longer expirations. VIX has never been much higher than that, and we have seen that it consistently reverts to the mean.
vix_ts_tidy %>% filter(Date == '2020-03-16')
## # A tibble: 9 x 3 ## Date Contract Price ## ## 1 2020-03-16 1 72.6 ## 2 2020-03-16 2 59.2 ## 3 2020-03-16 3 44.9 ## 4 2020-03-16 4 39.0 ## 5 2020-03-16 5 35.0 ## 6 2020-03-16 6 32.2 ## 7 2020-03-16 7 30.9 ## 8 2020-03-16 8 30.7 ## 9 2020-03-16 9 28.8
And indeed we see the opposite situation.
We can’t find buyers of the shortest VX futures contract at 82, but we could find them at 72.
The VX futures with 6 months to expiry were trading at 32, 60% less than the index.
We have the data, so let’s generalise this a little more. We’ll calculate the “basis” of VX futures as the percentage difference between the second VX futures contract by expiration, and plot it against the level of the “spot” VIX index.
vix_ts %>% inner_join(vixdata, by = 'Date') %>% mutate(slope = F2/VIX - 1) %>% ggplot(aes(x=VIX, y=slope)) + geom_point() + ggtitle('Premium of VX2 to VIX vs VIX level')
As we expected, when VIX is low we have to pay a premium to get long VX futures, as the market anticipates limited potential downside and nobody wants to get short at the index price. We can see this by the generally positive slope of the term structure between VX2 and VIX when VIX is low.
And when VIX is high the futures trade at a discount because the market anticipates reversion to mean, and few people want to get long at the index price. We can see this by the generally negative slope of the term structure between VX2 and VIX when VIX is low.
At this stage it should be clear to you that:
- The VIX index is predictable
- But you can’t trade the VIX index, you can only trade futures contracts that settle to it.
- And the most obvious predictable elements of the behaviour of the VIX index are “priced into” the “term structure” tradeable futures contracts.
- The futures usually trade at a premium to VIX – meaning that there’s a “cost” to being long VX.
- When the market is very stressed and VIX is very high, the futures usually trade at a discount to VIX – meaning that there is a “cost” to being short VX.
A Volatility Alpha Hint
Whilst we’re talking about it, I’ll mention that there is significant evidence that the VX futures term structure is predictive of VX futures returns. It’s almost as if the VX futures basis “over-adjusts” for the stylised facts of volatility.
The seminal paper on this is Simon and Campasso (2010): The VIX Futures Basis: Evidence and Trading Strategies.
The scatterplots below illustrate a similar effect where, following Chrilly Donninger, we have plotted VX returns over a day, a week, and month (from a constant maturity VX futures index) against the model-free implied volatility term structure slope
We see that the VX returns have a (noisy) positive dependency on the slope. This leads to carry trades where one goes:
- long VX products when short term implied volatility is more expensive than longer-term volatility
- short VX products when short term implied volatility is cheaper than long term implied volatility.
Here’s a very simple backtest of a strategy that takes a position in the SPVIXSTR index (30-day constant maturity VX futures) in the direction of that “carry”.
In addition to positive returns, you can see that this very simple trading strategy has tended to have large positive returns in times of market stress.
There is rarely a free lunch in the market.
If you find a trade that “looks like a lay-up”, such as shorting VIX products at VIX 80, then it’s more likely that you’ve missed something.
In this case, the thing you would have missed is that there was a significant “carrying cost” to getting long VX futures with VIX at 80. The VX futures were already pricing in a significant amount of mean-reversion in the index.
Investors piling into the USO Crude ETF because “crude can’t go any lower, surely” will also be learning this lesson right now…