This post will be about comparing a volatility signal using three different variations of implied volatility indices to predict when to enter a short volatility position.
In volatility trading, there are three separate implied volatility indices that have a somewhat long history for trading–the VIX (everyone knows this one), the VXV (more recently changed to be called the VIX3M), which is like the VIX, except for a three-month period), and the VXMT, which is the implied six-month volatility period.
This relationship gives investigation into three separate implied volatility ratios: VIX/VIX3M (aka VXV), VIX/VXMT, and VIX3M/VXMT, as predictors for entering a short (or long) volatility position.
So, let’s get the data.
require(downloader)require(quantmod)require(PerformanceAnalytics)require(TTR)require(data.table)download("http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vix3mdailyprices.csv", destfile="vxvData.csv")download("http://www.cboe.com/publish/ScheduledTask/MktData/datahouse/vxmtdailyprices.csv", destfile="vxmtData.csv")VIX <- fread("http://www.cboe.com/publish/scheduledtask/mktdata/datahouse/vixcurrent.csv", skip = 1)VIXdates <- VIX$DateVIX$Date <- NULL; VIX <- xts(VIX, order.by=as.Date(VIXdates, format = '%m/%d/%Y'))vxv <- xts(read.zoo("vxvData.csv", header=TRUE, sep=",", format="%m/%d/%Y", skip=2))vxmt <- xts(read.zoo("vxmtData.csv", header=TRUE, sep=",", format="%m/%d/%Y", skip=2))download("https://dl.dropboxusercontent.com/s/jk6der1s5lxtcfy/XIVlong.TXT", destfile="longXIV.txt")xiv <- xts(read.zoo("longXIV.txt", format="%Y-%m-%d", sep=",", header=TRUE))xivRets <- Return.calculate(Cl(xiv))
One quick strategy to investigate is simple–the idea that the ratio should be below 1 (I.E. contango in implied volatility term structure) and decreasing (below a moving average). So when the ratio will be below 1 (that is, with longer-term implied volatility greater than shorter-term), and the ratio will be below its 60-day moving average, the strategy will take a position in XIV.
Here’s the code to do that.
stratStatsfunction(rets) { stats <- rbind(table.AnnualizedReturns(rets), maxDrawdown(rets)) stats[5,] <- stats[1,]/stats[4,] stats[6,] <- stats[1,]/UlcerIndex(rets) rownames(stats)[4] <- "Worst Drawdown" rownames(stats)[5] <- "Calmar Ratio" rownames(stats)[6] <- "Ulcer Performance Index" return(stats)}maShort <- SMA(vixVix3m, 60)maMed <- SMA(vixVxmt, 60)maLong <- SMA(vix3mVxmt, 60)sigShort <- vixVix3m < 1 & vixVix3m < maShortsigMed <- vixVxmt < 1 & vixVxmt < maMed sigLong <- vix3mVxmt < 1 & vix3mVxmt < maLong retsShort <- lag(sigShort, 2) * xivRets retsMed <- lag(sigMed, 2) * xivRets retsLong <- lag(sigLong, 2) * xivRetscompare <- na.omit(cbind(retsShort, retsMed, retsLong))colnames(compare) <- c("Short", "Medium", "Long")charts.PerformanceSummary(compare)stratStats(compare)
With the following performance:
> stratStats(compare) Short Medium LongAnnualized Return 0.5485000 0.6315000 0.638600Annualized Std Dev 0.3874000 0.3799000 0.378900Annualized Sharpe (Rf=0%) 1.4157000 1.6626000 1.685600Worst Drawdown 0.5246983 0.5318472 0.335756Calmar Ratio 1.0453627 1.1873711 1.901976Ulcer Performance Index 3.7893478 4.6181788 5.244137
In other words, the VIX3M/VXMT sports the lowest drawdowns (by a large margin) with higher returns.
So, when people talk about which implied volatility ratio to use, I think this offers some strong evidence for the longer-out horizon as a predictor for which implied vol term structure to use. It’s also why it forms the basis of my subscription strategy.
Thanks for reading.
NOTE: I am currently seeking a full-time position (remote or in the northeast U.S.) related to my skill set demonstrated on this blog. Please message me on LinkedIn if you know of any opportunities which may benefit from my skill set.
var vglnk = { key: '949efb41171ac6ec1bf7f206d57e90b8' }; (function(d, t) {var s = d.createElement(t); s.type = 'text/javascript'; s.async = true;s.src = '//cdn.viglink.com/api/vglnk.js';var r = d.getElementsByTagName(t)[0]; r.parentNode.insertBefore(s, r); }(document, 'script'));R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: Data science, Big Data, R jobs, visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...