# Again with variability of long-short decile tests

**Portfolio Probe » R language**, and kindly contributed to R-bloggers]. (You can report issue about the content on this page here)

Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.

A simpler approach to producing the variability.

## Previously

The post “Variability in long-short decile strategy tests” proposed a way of assessing the variability of strategy tests in which a long-short portfolio is created by equally weighting the top and bottom deciles.

## Improved idea

Joe Mezrich suggests maintaining equal weights but bootstrapping the assets within the deciles. For me that passes the jealousy test — why didn’t I think of that?

It eliminates the arbitrariness of the selection of the range of weights to use in the previous method.

Figure 1 shows the variability of 1000 bootstrap paths for the MACD signal that the previous post used.

Figure 1: Efficacy of MACD via long-short deciles with bootstrapped equal weights. The bootstrap variability is bigger than the biggest of the variabilities investigated previously.

## Appendix R

The function to do the bootstrapping is a very mildly revised version of the function that does the random weighting.

pp.decileTestBoot <- function(signal, prices, trials=1000, groups=10) { # R function to test a signal # via long-short deciles # and bootstrapping the deciles # put in the public domain 2012 by Burns Statistics # testing status: # seems to work stopifnot(all(dim(signal) == dim(prices)), length(groups) == 1, identical(sort(colnames(signal)), sort(colnames(prices)))) ntimes <- nrow(prices) eqwtval <- rep(NA, ntimes) names(eqwtval) <- rownames(prices) randwtval <- array(NA, c(length(eqwtval), trials), list(names(eqwtval), NULL)) uret <- tail(prices, -1) / head(prices, -1) - 1 randwtval[1,] <- eqwtval[1] <- 100 nside <- round(ncol(prices) / groups) if(trials) { tseq <- 1:trials t.eret <- numeric(trials) } for(i in 1:(ntimes-1)) { tb <- pp.topBottom(signal[i, ], n=nside) botret <- uret[i, tb$bottom] topret <- uret[i, tb$top] this.eret <- mean(topret) - mean(botret) eqwtval[i+1] <- eqwtval[i] * (1 + this.eret) if(trials) { for(j in tseq) { t.eret[j] <- mean(sample(topret, nside, replace=TRUE)) - mean(sample(botret, nside, replace=TRUE)) } randwtval[i+1, ] <- randwtval[i, ] * (1 + t.eret) } } ans <- list(equal.weight=eqwtval, random.weight=randwtval, nside=nside, call=match.call()) class(ans) <- "SignalTest" ans }

**leave a comment**for the author, please follow the link and comment on their blog:

**Portfolio Probe » R language**.

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.