A Basic Logical Invest Global Market Rotation Strategy
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
This may be one of the simplest strategies I’ve ever presented on this blog, but nevertheless, it works, for some definition of “works”.
Here’s the strategy: take five global market ETFs (MDY, ILF, FEZ, EEM, and EPP), along with a treasury ETF (TLT), and every month, fully invest in the security that had the best momentum. While I’ve tried various other tweaks, none have given the intended high return performance that the original variant has.
Here’s the link to the original strategy.
While I’m not quite certain of how to best go about programming the variable lookback period, this is the code for the three month lookback.
require(quantmod) require(PerformanceAnalytics) symbols <- c("MDY", "TLT", "EEM", "ILF", "EPP", "FEZ") getSymbols(symbols, from="1990-01-01") prices <- list() for(i in 1:length(symbols)) { prices[[i]] <- Ad(get(symbols[i])) } prices <- do.call(cbind, prices) colnames(prices) <- gsub("\.[A-z]*", "", colnames(prices)) returns <- Return.calculate(prices) returns <- na.omit(returns) logicInvestGMR <- function(returns, lookback = 3) { ep <- endpoints(returns, on = "months") weights <- list() for(i in 2:(length(ep) - lookback)) { retSubset <- returns[ep[i]:ep[i+lookback],] cumRets <- Return.cumulative(retSubset) rankCum <- rank(cumRets) weight <- rep(0, ncol(retSubset)) weight[which.max(cumRets)] <- 1 weight <- xts(t(weight), order.by=index(last(retSubset))) weights[[i]] <- weight } weights <- do.call(rbind, weights) stratRets <- Return.portfolio(R = returns, weights = weights) return(stratRets) } gmr <- logicInvestGMR(returns) charts.PerformanceSummary(gmr)
And here’s the performance:
> rbind(table.AnnualizedReturns(gmr), maxDrawdown(gmr), CalmarRatio(gmr)) portfolio.returns Annualized Return 0.287700 Annualized Std Dev 0.220700 Annualized Sharpe (Rf=0%) 1.303500 Worst Drawdown 0.222537 Calmar Ratio 1.292991
With the resultant equity curve:
While I don’t get the 34% advertised, nevertheless, the risk to reward ratio over the duration of the backtest is fairly solid for something so simple, and I just wanted to put this out there.
Thanks for reading.
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.