This post will cover a function to simplify creating Harry Long (of Houston) type rebalancing strategies from SeekingAlpha for interested readers. As Harry Long has stated, most, if not all of his strategies are more for demonstrative purposes rather than actual recommended investments.

So, since Harry Long has been posting some more articles on Seeknig Alpha, I’ve had a reader or two ask me to analyze his strategies (again). Instead of doing that, however, I’ll simply put this tool here, which is a wrapper that automates the acquisition of data and simulates portfolio rebalancing with one line of code.

Here’s the tool.

require(quantmod) require(PerformanceAnalytics) require(downloader) LongSeeker <- function(symbols, weights, rebalance_on = "years", displayStats = TRUE, outputReturns = FALSE) { getSymbols(symbols, src='yahoo', from = '1990-01-01') prices <- list() for(i in 1:length(symbols)) { if(symbols[i] == "ZIV") { download("https://www.dropbox.com/s/jk3ortdyru4sg4n/ZIVlong.TXT", destfile="ziv.txt") ziv <- xts(read.zoo("ziv.txt", header=TRUE, sep=",", format="%Y-%m-%d")) prices[[i]] <- Cl(ziv) } else if (symbols[i] == "VXX") { download("https://dl.dropboxusercontent.com/s/950x55x7jtm9x2q/VXXlong.TXT", destfile="vxx.txt") vxx <- xts(read.zoo("vxx.txt", header=TRUE, sep=",", format="%Y-%m-%d")) prices[[i]] <- Cl(vxx) } else { prices[[i]] <- Ad(get(symbols[i])) } } prices <- do.call(cbind, prices) prices <- na.locf(prices) returns <- na.omit(Return.calculate(prices)) returns$zeroes <- 0 weights <- c(weights, 1-sum(weights)) stratReturns <- Return.portfolio(R = returns, weights = weights, rebalance_on = rebalance_on) if(displayStats) { stats <- rbind(table.AnnualizedReturns(stratReturns), maxDrawdown(stratReturns), CalmarRatio(stratReturns)) rownames(stats)[4] <- "Max Drawdown" print(stats) charts.PerformanceSummary(stratReturns) } if(outputReturns) { return(stratReturns) } }It fetches the data for you (usually from Yahoo, but a big thank you to Mr. Helumth Vollmeier in the case of ZIV and VXX), and has the option of either simply displaying an equity curve and some statistics (CAGR, annualized standard dev, Sharpe, max Drawdown, Calmar), or giving you the return stream as an output if you wish to do more analysis in R.

Here’s an example of simply getting the statistics, with an 80% XLP/SPLV (they’re more or less interchangeable) and 20% TMF (aka 60% TLT, so an 80/60 portfolio), from one of Harry Long’s articles.

LongSeeker(c("XLP", "TLT"), c(.8, .6))Statistics:

portfolio.returns Annualized Return 0.1321000 Annualized Std Dev 0.1122000 Annualized Sharpe (Rf=0%) 1.1782000 Max Drawdown 0.2330366 Calmar Ratio 0.5670285Equity curve:

Nothing out of the ordinary of what we might expect from a balanced equity/bonds portfolio. Generally does well, has its largest drawdown in the financial crisis, and some other bumps in the road, but overall, I’d think a fairly vanilla “set it and forget it” sort of thing.

And here would be the way to get the stream of individual daily returns, assuming you wanted to rebalance these two instruments weekly, instead of yearly (as is the default).

tmp <- LongSeeker(c("XLP", "TLT"), c(.8, .6), rebalance_on="weeks", displayStats = FALSE, outputReturns = TRUE)And now let’s get some statistics.

table.AnnualizedReturns(tmp) maxDrawdown(tmp) CalmarRatio(tmp)Which give:

> table.AnnualizedReturns(tmp) portfolio.returns Annualized Return 0.1328 Annualized Std Dev 0.1137 Annualized Sharpe (Rf=0%) 1.1681 > maxDrawdown(tmp) [1] 0.2216417 > CalmarRatio(tmp) portfolio.returns Calmar Ratio 0.5990087Turns out, moving the rebalancing from annually to weekly didn’t have much of an effect here (besides give a bunch of money to your broker, if you factored in transaction costs, which this doesn’t).

So, that’s how this tool works. The results, of course, begin from the latest instrument’s inception. The trick, in my opinion, is to try and find proxy substitutes with longer histories for newer ETFs that are simply leveraged ETFs, such as using a 60% weight in TLT with an 80% weight in XLP instead of a 20% weight in TMF with 80% allocation in SPLV.

For instance, here are some proxies:

SPXL = XLP

SPXL/UPRO = SPY * 3

TMF = TLT * 3That said, I’ve worked with Harry Long before, and he develops more sophisticated strategies behind the scenes, so I’d recommend that SeekingAlpha readers take his publicly released strategies as concept demonstrations, as opposed to fully-fledged investment ideas, and contact Mr. Long himself about more customized, private solutions for investment institutions if you are so interested.

Thanks for reading.

NOTE: I am currently in the northeast. While I am currently contracting, I am interested in networking with individuals or firms with regards to potential collaboration opportunities.

Advertisements