Calendar Strategy: Option Expiry
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
Today, I want to follow up with the Calendar Strategy: Month End post. Let’s examine the perfromance Option Expiry days as presented in the The Mooost Wonderful Tiiiiiiime of the Yearrrrrrrrr! post.
First, I created two convenience functions for creating a calendar signal and back-testing calendar strategy: calendar.signal and calendar.strategy functions are in the strategy.r at github
Now, let’s dive in and examine historical perfromance of SPY during Option Expiry period in December:
###############################################################################
# Load Systematic Investor Toolbox (SIT)
# http://systematicinvestor.wordpress.com/systematic-investor-toolbox/
###############################################################################
setInternet2(TRUE)
con = gzcon(url('http://www.systematicportfolio.com/sit.gz', 'rb'))
source(con)
close(con)
#*****************************************************************
# Load historical data
#******************************************************************
load.packages('quantmod')
tickers = spl('SPY')
data <- new.env()
getSymbols.extra(tickers, src = 'yahoo', from = '1980-01-01', env = data, set.symbolnames = T, auto.assign = T)
for(i in data$symbolnames) data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)
bt.prep(data, align='keep.all', fill.gaps = T)
#*****************************************************************
# Setup
#*****************************************************************
prices = data$prices
n = ncol(prices)
dates = data$dates
models = list()
universe = prices > 0
# Find Friday before options expiration week in December
years = date.year(range(dates))
second.friday = third.friday.month(years[1]:years[2], 12) - 7
key.date.index = na.omit(match(second.friday, dates))
key.date = NA * prices
key.date[key.date.index,] = T
#*****************************************************************
# Strategy: Op-ex week in December most bullish week of the year for the SPX
# Buy: December Friday prior to op-ex.
# Sell X days later: 100K/trade 1984-present
# http://quantifiableedges.blogspot.com/2011/12/mooost-wonderful-tiiiiiiime-of.html
#*****************************************************************
signals = list(T0=0)
for(i in 1:15) signals[[paste0('N',i)]] = 0:i
signals = calendar.signal(key.date, signals)
models = calendar.strategy(data, signals, universe = universe)
strategy.performance.snapshoot(models, T, sort.performance=F)
Strategies vary in perfromance, next let’s examine a bit more details
# custom stats out = sapply(models, function(x) list( CAGR = 100*compute.cagr(x$equity), MD = 100*compute.max.drawdown(x$equity), Win = x$trade.summary$stats['win.prob', 'All'], Profit = x$trade.summary$stats['profitfactor', 'All'] )) performance.barchart.helper(out, sort.performance = F) # Plot 15 day strategy strategy.performance.snapshoot(models$N15, control=list(main=T)) # Plot trades for 15 day strategy last.trades(models$N15) # Make a summary plot of trades for 15 day strategy trades = models$N15$trade.summary$trades trades = make.xts(parse.number(trades[,'return']), as.Date(trades[,'entry.date'])) layout(1:2) par(mar = c(4,3,3,1), cex = 0.8) barplot(trades, main='Trades', las=1) plot(cumprod(1+trades/100), type='b', main='Trades', las=1)
Details for the 15 day strategy:

With this post I wanted to show how easily we can study calendar strategy performance using the Systematic Investor Toolbox.
Next, I will look at the importance of the FED meeting days.
To view the complete source code for this example, please have a look at the
bt.calendar.strategy.option.expiry.test() function in bt.test.r at github.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.



