T-Bond Seasonality
23 Mar 2015To install Systematic Investor Toolbox (SIT) please visit About page.
The Jay On The Markets wrote two posts about Treasury Bond Seasonality at:
Below I will try to adapt a code from the posts:
#*****************************************************************
# Load historical data
#*****************************************************************
library(SIT)
load.packages('quantmod')
tickers = 'TLT'
data = new.env()
getSymbols.extra(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T)
for(i in ls(data))
data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)
bt.prep(data, align='remove.na')
#*****************************************************************
# Setup
#*****************************************************************
prices = data$prices
models = list()
commission = list(cps = 0.01, fixed = 10.0, percentage = 0.0)
universe = prices > 0
key.date.index = date.month.ends(data$dates, F)
key.date = NA * prices
key.date[key.date.index,] = T
#*****************************************************************
# Benchmark
#*****************************************************************
data$weight[] = NA
data$weight$TLT = 1
models$TLT = bt.run.share(data, clean.signal=T, commission = commission, trade.summary=T, silent=T)
#*****************************************************************
# Last 5 trading days of the month
#*****************************************************************
signals = list(L5=-4:0)
signals = calendar.signal(key.date, signals)
signals$exL5 = ifna(!signals$L5,T)
models = c(models, calendar.strategy(data, signals, universe = universe, commission = commission))
#*****************************************************************
# Create Report
#*****************************************************************
#strategy.performance.snapshoot(models, T)
plotbt(models, plotX = T, log = 'y', LeftMargin = 3, main = NULL)
mtext('Cumulative Performance', side = 2, line = 1)
print(plotbt.strategy.sidebyside(models, make.plot=F, return.table=T, perfromance.fn=engineering.returns.kpi))| TLT | L5 | exL5 | |
|---|---|---|---|
| Period | Jul2002 - Mar2015 | Jul2002 - Mar2015 | Jul2002 - Mar2015 |
| Cagr | 8.08 | 5.15 | 1.64 |
| Sharpe | 0.63 | 0.82 | 0.19 |
| DVR | 0.56 | 0.7 | 0.07 |
| R2 | 0.89 | 0.86 | 0.37 |
| Volatility | 13.83 | 6.42 | 12.25 |
| MaxDD | -26.58 | -17.22 | -30.85 |
| Exposure | 99.97 | 23.74 | 76.22 |
| Win.Percent | 100 | 63.82 | 53.29 |
| Avg.Trade | 167.27 | 0.48 | 0.25 |
| Profit.Factor | NaN | 2.09 | 1.19 |
| Num.Trades | 1 | 152 | 152 |
print(last.trades(models$L5, make.plot=F, return.table=T))| models$L5 | weight | entry.date | exit.date | nhold | entry.price | exit.price | return |
|---|---|---|---|---|---|---|---|
| TLT | 100 | 2013-07-24 | 2013-07-31 | 7 | 102.49 | 102.66 | 0.17 |
| TLT | 100 | 2013-08-23 | 2013-08-30 | 7 | 99.66 | 101.29 | 1.63 |
| TLT | 100 | 2013-09-23 | 2013-09-30 | 7 | 101.27 | 101.95 | 0.67 |
| TLT | 100 | 2013-10-24 | 2013-10-31 | 7 | 103.65 | 103.41 | -0.23 |
| TLT | 100 | 2013-11-21 | 2013-11-29 | 8 | 99.17 | 100.61 | 1.46 |
| TLT | 100 | 2013-12-23 | 2013-12-31 | 8 | 100.15 | 98.73 | -1.42 |
| TLT | 100 | 2014-01-24 | 2014-01-31 | 7 | 104.18 | 104.95 | 0.75 |
| TLT | 100 | 2014-02-21 | 2014-02-28 | 7 | 103.66 | 105.50 | 1.78 |
| TLT | 100 | 2014-03-24 | 2014-03-31 | 7 | 106.18 | 106.28 | 0.09 |
| TLT | 100 | 2014-04-23 | 2014-04-30 | 7 | 108.37 | 108.50 | 0.12 |
| TLT | 100 | 2014-05-22 | 2014-05-30 | 8 | 109.74 | 111.71 | 1.79 |
| TLT | 100 | 2014-06-23 | 2014-06-30 | 7 | 109.40 | 111.43 | 1.86 |
| TLT | 100 | 2014-07-24 | 2014-07-31 | 7 | 112.49 | 112.17 | -0.29 |
| TLT | 100 | 2014-08-22 | 2014-08-29 | 7 | 115.72 | 117.46 | 1.51 |
| TLT | 100 | 2014-09-23 | 2014-09-30 | 7 | 114.17 | 114.98 | 0.72 |
| TLT | 100 | 2014-10-24 | 2014-10-31 | 7 | 118.69 | 118.22 | -0.39 |
| TLT | 100 | 2014-11-20 | 2014-11-28 | 8 | 118.64 | 121.73 | 2.60 |
| TLT | 100 | 2014-12-23 | 2014-12-31 | 8 | 123.05 | 125.42 | 1.93 |
| TLT | 100 | 2015-01-23 | 2015-01-30 | 7 | 134.24 | 137.73 | 2.60 |
| TLT | 100 | 2015-02-20 | 2015-02-27 | 7 | 126.30 | 129.28 | 2.36 |
print(plotbt.monthly.table(models$L5$equity, make.plot = F))| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year | MaxDD | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 | 1.3 | 0.3 | 1.9 | -0.7 | 1.8 | 5.9 | -2.3 | |||||||
| 2003 | 0.1 | 2.4 | 1.6 | 1.7 | -1.1 | -2.0 | -3.4 | 0.3 | 3.1 | -0.1 | -1.6 | -0.1 | 0.7 | -7.3 |
| 2004 | -0.4 | 1.4 | -1.7 | -0.5 | 1.6 | 1.3 | -0.5 | 1.9 | -1.3 | -0.5 | -2.1 | 0.3 | -0.6 | -5.2 |
| 2005 | 0.3 | -1.0 | 1.4 | 1.0 | 0.8 | 0.8 | -0.5 | 1.9 | -0.5 | -1.1 | -0.6 | 1.1 | 3.5 | -2.6 |
| 2006 | -1.4 | 0.5 | -2.5 | -0.8 | -1.1 | 1.0 | 0.6 | 0.8 | -0.4 | 2.9 | 1.1 | -1.6 | -0.9 | -5.5 |
| 2007 | -0.1 | 1.6 | -0.6 | 0.3 | -0.2 | 1.6 | 1.7 | 1.1 | 0.9 | -1.2 | 0.6 | 1.8 | 7.8 | -2.6 |
| 2008 | 0.6 | 2.4 | 0.6 | -0.1 | -1.2 | 2.5 | 0.6 | 0.8 | 1.3 | -4.1 | 1.2 | -1.2 | 3.3 | -9.2 |
| 2009 | -3.7 | -2.0 | 1.6 | -3.5 | -0.5 | 0.9 | 3.6 | 1.1 | 2.2 | 0.8 | 1.5 | -0.5 | 1.4 | -12.8 |
| 2010 | 0.3 | 2.4 | 0.2 | 2.2 | -2.0 | 2.5 | 0.6 | 0.7 | 0.5 | -1.0 | 1.4 | 1.6 | 9.8 | -2.8 |
| 2011 | -0.4 | 3.2 | -0.3 | 1.3 | 0.9 | -3.4 | 1.9 | 0.7 | -0.1 | 2.2 | -2.9 | 1.7 | 4.6 | -5.1 |
| 2012 | 3.7 | 0.5 | -0.9 | -0.5 | 3.4 | 0.1 | -1.7 | 2.3 | 2.2 | 1.9 | 0.4 | -0.7 | 11.1 | -3.8 |
| 2013 | -2.0 | 1.3 | 0.4 | 0.4 | -1.9 | 1.8 | 0.1 | 1.6 | 0.6 | -0.3 | 1.4 | -1.5 | 1.9 | -2.7 |
| 2014 | 0.7 | 1.7 | 0.1 | 0.1 | 1.7 | 1.8 | -0.3 | 1.5 | 0.7 | -0.4 | 2.6 | 1.9 | 12.6 | -1.7 |
| 2015 | 2.6 | 2.3 | 0.0 | 5.0 | -1.4 | |||||||||
| Avg | 0.0 | 1.3 | 0.0 | 0.1 | 0.0 | 0.8 | 0.2 | 1.2 | 0.7 | 0.1 | 0.2 | 0.4 | 4.7 | -4.6 |
Next, let’s test with Direxion Daily 20+ Yr Trsy Bull 3X ETF (TMF)
Below I will extend it with iShares 20+ Year Treasury Bond (TLT) which is not a perfect proxy, but will do for our testing purposes.
#*****************************************************************
# Load historical data
#*****************************************************************
tickers = 'TLT,TMF'
data = new.env()
getSymbols.extra(tickers, src = 'yahoo', from = '1980-01-01', env = data, auto.assign = T)
data$TMF = extend.data(data$TMF, create.leveraged(data$TLT, leverage=3), scale=T)
for(i in ls(data))
data[[i]] = adjustOHLC(data[[i]], use.Adjusted=T)
bt.prep(data, align='remove.na')
#*****************************************************************
# Setup
#*****************************************************************
prices = data$prices
# do not invest in TLT
prices$TLT = NA
models = list()
commission = list(cps = 0.01, fixed = 10.0, percentage = 0.0)
universe = prices > 0
key.date.index = date.month.ends(data$dates, F)
key.date = NA * prices
key.date[key.date.index,] = T
#*****************************************************************
# Benchmark
#*****************************************************************
data$weight[] = NA
data$weight$TMF = 1
models$TMF = bt.run.share(data, clean.signal=T, commission = commission, trade.summary=T, silent=T)
#*****************************************************************
# Last 5 trading days of the month
#*****************************************************************
signals = list(L5=-4:0)
signals = calendar.signal(key.date, signals)
signals$exL5 = ifna(!signals$L5,T)
models = c(models, calendar.strategy(data, signals, universe = universe, commission = commission))
#*****************************************************************
# Create Report
#*****************************************************************
#strategy.performance.snapshoot(models, T)
plotbt(models, plotX = T, log = 'y', LeftMargin = 3, main = NULL)
mtext('Cumulative Performance', side = 2, line = 1)
print(plotbt.strategy.sidebyside(models, make.plot=F, return.table=T, perfromance.fn=engineering.returns.kpi))| TMF | L5 | exL5 | |
|---|---|---|---|
| Period | Jul2002 - Mar2015 | Jul2002 - Mar2015 | Jul2002 - Mar2015 |
| Cagr | 17.4 | 16.02 | -0.85 |
| Sharpe | 0.59 | 0.86 | 0.16 |
| DVR | 0.43 | 0.67 | 0.01 |
| R2 | 0.73 | 0.79 | 0.05 |
| Volatility | 41.89 | 19.55 | 37.05 |
| MaxDD | -66.97 | -46.13 | -78.15 |
| Exposure | 99.97 | 23.74 | 76.22 |
| Win.Percent | 100 | 63.82 | 51.32 |
| Avg.Trade | 661.5 | 1.44 | 0.61 |
| Profit.Factor | NaN | 2.12 | 1.16 |
| Num.Trades | 1 | 152 | 152 |
print(last.trades(models$L5, make.plot=F, return.table=T))| models$L5 | weight | entry.date | exit.date | nhold | entry.price | exit.price | return |
|---|---|---|---|---|---|---|---|
| TMF | 100 | 2013-07-24 | 2013-07-31 | 7 | 49.88 | 50.03 | 0.30 |
| TMF | 100 | 2013-08-23 | 2013-08-30 | 7 | 45.57 | 47.80 | 4.89 |
| TMF | 100 | 2013-09-23 | 2013-09-30 | 7 | 47.60 | 48.53 | 1.95 |
| TMF | 100 | 2013-10-24 | 2013-10-31 | 7 | 50.93 | 50.53 | -0.79 |
| TMF | 100 | 2013-11-21 | 2013-11-29 | 8 | 44.30 | 46.39 | 4.72 |
| TMF | 100 | 2013-12-23 | 2013-12-31 | 8 | 45.58 | 43.60 | -4.34 |
| TMF | 100 | 2014-01-24 | 2014-01-31 | 7 | 50.99 | 52.09 | 2.16 |
| TMF | 100 | 2014-02-21 | 2014-02-28 | 7 | 50.10 | 52.94 | 5.67 |
| TMF | 100 | 2014-03-24 | 2014-03-31 | 7 | 53.72 | 53.87 | 0.28 |
| TMF | 100 | 2014-04-23 | 2014-04-30 | 7 | 56.92 | 57.08 | 0.28 |
| TMF | 100 | 2014-05-22 | 2014-05-30 | 8 | 58.99 | 62.10 | 5.27 |
| TMF | 100 | 2014-06-23 | 2014-06-30 | 7 | 58.11 | 61.48 | 5.80 |
| TMF | 100 | 2014-07-24 | 2014-07-31 | 7 | 63.09 | 62.47 | -0.98 |
| TMF | 100 | 2014-08-22 | 2014-08-29 | 7 | 68.38 | 71.48 | 4.53 |
| TMF | 100 | 2014-09-23 | 2014-09-30 | 7 | 65.29 | 66.73 | 2.21 |
| TMF | 100 | 2014-10-24 | 2014-10-31 | 7 | 72.97 | 72.11 | -1.18 |
| TMF | 100 | 2014-11-20 | 2014-11-28 | 8 | 72.73 | 78.66 | 8.15 |
| TMF | 100 | 2014-12-23 | 2014-12-31 | 8 | 80.70 | 86.04 | 6.62 |
| TMF | 100 | 2015-01-23 | 2015-01-30 | 7 | 104.60 | 112.72 | 7.76 |
| TMF | 100 | 2015-02-20 | 2015-02-27 | 7 | 86.62 | 92.58 | 6.88 |
for(n in names(models)) {
print('##', n)
print(plotbt.monthly.table(models[[n]]$equity, make.plot = F))
}TMF
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year | MaxDD | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 | 17.0 | 13.0 | -11.1 | -3.4 | 14.0 | 34.3 | -19.1 | |||||||
| 2003 | -2.1 | 9.4 | -4.4 | 3.0 | 19.7 | -5.8 | -27.6 | 3.4 | 18.3 | -9.2 | 0.7 | 3.8 | 0.0 | -40.9 |
| 2004 | 5.4 | 6.8 | 4.0 | -17.9 | -1.0 | 2.9 | 4.4 | 12.8 | 2.7 | 5.2 | -7.2 | 7.9 | 24.8 | -29.5 |
| 2005 | 10.9 | -4.6 | -1.7 | 11.8 | 9.6 | 6.3 | -10.0 | 10.6 | -10.6 | -6.8 | 1.8 | 9.1 | 24.8 | -20.5 |
| 2006 | -4.1 | 3.2 | -13.2 | -8.2 | -0.7 | 3.4 | 6.5 | 9.4 | 5.7 | 2.4 | 7.0 | -8.0 | 0.5 | -25.7 |
| 2007 | -3.1 | 10.3 | -5.1 | 2.6 | -6.8 | -3.4 | 10.0 | 5.3 | 0.4 | 5.3 | 16.5 | -2.5 | 30.4 | -22.2 |
| 2008 | 5.8 | -2.0 | 5.9 | -7.6 | -8.1 | 7.9 | -1.5 | 8.2 | 3.2 | -6.2 | 46.8 | 44.7 | 120.4 | -21.6 |
| 2009 | -35.4 | -5.7 | 11.3 | -22.6 | -14.6 | 0.1 | 0.3 | 5.8 | 7.4 | -9.4 | 3.0 | -20.1 | -61.9 | -64.1 |
| 2010 | 7.3 | -1.8 | -6.7 | 9.9 | 16.5 | 16.8 | -3.9 | 25.9 | -9.0 | -13.6 | -6.0 | -11.7 | 16.1 | -41.5 |
| 2011 | -9.4 | 4.5 | -0.5 | 6.6 | 10.4 | -7.4 | 13.3 | 27.4 | 41.3 | -12.9 | 4.9 | 9.5 | 109.2 | -30.2 |
| 2012 | -1.5 | -7.9 | -13.0 | 14.4 | 28.9 | -5.8 | 11.4 | -4.6 | -7.9 | -2.1 | 3.9 | -7.8 | 0.6 | -28.2 |
| 2013 | -9.6 | 3.4 | -1.8 | 14.3 | -19.7 | -10.3 | -7.4 | -4.5 | 1.5 | 4.1 | -8.2 | -6.0 | -39.0 | -44.5 |
| 2014 | 19.5 | 1.6 | 1.8 | 6.0 | 8.8 | -1.0 | 1.6 | 14.4 | -6.6 | 8.1 | 9.1 | 9.4 | 97.3 | -14.7 |
| 2015 | 31.0 | -17.9 | 4.5 | 12.4 | -28.5 | |||||||||
| Avg | 1.1 | 0.0 | -1.5 | 1.0 | 3.6 | 0.3 | -0.2 | 10.1 | 4.6 | -3.5 | 5.3 | 3.2 | 26.4 | -30.8 |
L5
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year | MaxDD | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 | 3.9 | 0.8 | 5.8 | -2.3 | 5.4 | 18.3 | -6.8 | |||||||
| 2003 | 0.2 | 7.4 | 5.0 | 5.1 | -3.3 | -5.9 | -9.9 | 0.8 | 9.4 | -0.5 | -4.7 | -0.2 | 1.4 | -20.7 |
| 2004 | -1.3 | 4.4 | -5.1 | -1.6 | 4.9 | 3.8 | -1.5 | 5.8 | -3.7 | -1.4 | -6.1 | 0.8 | -2.0 | -14.9 |
| 2005 | 0.8 | -2.9 | 4.1 | 3.1 | 2.5 | 2.4 | -1.5 | 5.7 | -1.5 | -3.2 | -1.9 | 3.4 | 11.0 | -7.4 |
| 2006 | -4.1 | 1.7 | -7.4 | -2.4 | -3.2 | 3.1 | 1.7 | 2.5 | -1.0 | 9.1 | 3.5 | -4.6 | -2.3 | -15.4 |
| 2007 | -0.4 | 4.8 | -1.8 | 0.8 | -0.5 | 5.0 | 5.2 | 3.4 | 2.7 | -3.5 | 1.8 | 5.6 | 25.1 | -7.7 |
| 2008 | 1.8 | 7.1 | 1.7 | -0.3 | -3.7 | 7.8 | 1.9 | 2.3 | 3.6 | -11.8 | 3.2 | -3.7 | 8.9 | -25.5 |
| 2009 | -11.1 | -5.9 | 4.8 | -12.4 | -1.7 | 2.8 | 12.5 | 5.0 | 8.7 | 2.6 | 5.3 | -1.7 | 5.7 | -36.4 |
| 2010 | 0.3 | 7.7 | 0.5 | 7.0 | -5.7 | 8.2 | 1.8 | 1.8 | 1.5 | -3.1 | 4.3 | 4.9 | 32.2 | -9.0 |
| 2011 | -1.2 | 9.6 | -1.0 | 3.8 | 2.8 | -9.9 | 6.0 | 2.1 | -0.8 | 5.6 | -8.7 | 4.8 | 11.8 | -14.9 |
| 2012 | 11.7 | 1.9 | -2.7 | -1.6 | 10.3 | 0.1 | -4.9 | 6.8 | 6.5 | 5.8 | 1.4 | -2.1 | 36.6 | -11.0 |
| 2013 | -5.9 | 4.0 | 1.4 | 1.2 | -5.8 | 5.4 | 0.2 | 4.8 | 1.9 | -0.8 | 4.7 | -4.4 | 6.0 | -8.1 |
| 2014 | 2.1 | 5.6 | 0.2 | 0.2 | 5.2 | 5.7 | -1.0 | 4.5 | 2.2 | -1.2 | 8.1 | 6.6 | 44.8 | -4.9 |
| 2015 | 7.7 | 6.8 | 0.0 | 15.1 | -4.1 | |||||||||
| Avg | 0.0 | 4.0 | 0.0 | 0.2 | 0.1 | 2.4 | 0.9 | 3.8 | 2.3 | 0.3 | 0.7 | 1.1 | 15.2 | -13.3 |
exL5
| Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec | Year | MaxDD | |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2002 | 12.2 | 11.8 | -16.2 | -1.4 | 7.8 | 11.6 | -19.5 | |||||||
| 2003 | -2.5 | 1.6 | -9.3 | -2.2 | 23.6 | 0.0 | -19.8 | 2.3 | 7.8 | -9.0 | 5.4 | 3.7 | -4.5 | -32.4 |
| 2004 | 6.5 | 2.1 | 9.4 | -16.8 | -5.9 | -1.2 | 5.7 | 6.4 | 6.4 | 6.5 | -1.4 | 6.7 | 23.5 | -27.4 |
| 2005 | 9.8 | -2.0 | -5.8 | 8.2 | 6.7 | 3.7 | -8.8 | 4.4 | -9.5 | -3.8 | 3.6 | 5.3 | 9.7 | -22.2 |
| 2006 | -0.2 | 1.3 | -6.5 | -6.1 | 2.4 | 0.1 | 4.5 | 6.5 | 6.6 | -6.3 | 3.2 | -3.8 | 0.4 | -16.6 |
| 2007 | -2.9 | 5.1 | -3.5 | 1.6 | -6.6 | -8.1 | 4.3 | 1.6 | -2.5 | 8.9 | 14.3 | -7.8 | 2.0 | -21.5 |
| 2008 | 3.8 | -8.6 | 4.0 | -7.5 | -4.8 | -0.1 | -3.4 | 5.5 | -0.6 | 6.2 | 42.0 | 50.0 | 98.9 | -27.3 |
| 2009 | -27.4 | 0.1 | 6.1 | -11.8 | -13.2 | -2.7 | -11.0 | 0.7 | -1.3 | -11.9 | -2.4 | -18.9 | -64.6 | -64.6 |
| 2010 | 6.8 | -9.0 | -7.3 | 2.6 | 23.5 | 7.8 | -5.7 | 23.5 | -10.5 | -11.0 | -10.0 | -16.0 | -13.8 | -43.1 |
| 2011 | -8.5 | -4.9 | 0.4 | 2.5 | 7.2 | 2.7 | 6.7 | 24.6 | 42.3 | -17.6 | 14.7 | 4.4 | 84.1 | -24.3 |
| 2012 | -11.9 | -9.7 | -10.7 | 16.2 | 16.7 | -6.0 | 17.0 | -10.8 | -13.6 | -7.6 | 2.4 | -5.9 | -27.2 | -34.7 |
| 2013 | -4.0 | -0.7 | -3.2 | 12.8 | -14.8 | -15.1 | -7.7 | -9.0 | -0.5 | 4.9 | -12.4 | -1.8 | -43.2 | -48.8 |
| 2014 | 16.9 | -3.9 | 1.4 | 5.6 | 3.3 | -6.5 | 2.6 | 9.4 | -8.7 | 9.3 | 0.8 | 2.5 | 34.6 | -16.7 |
| 2015 | 21.5 | -23.2 | 4.5 | -2.5 | -33.6 | |||||||||
| Avg | 0.6 | -4.0 | -1.6 | 0.4 | 3.2 | -2.1 | -1.3 | 6.0 | 2.1 | -3.7 | 4.5 | 2.0 | 7.8 | -30.9 |
(this report was produced on: 2015-03-24)