msharpeScreening: Screening using the modified Sharpe outperformance ratio

msharpeScreeningR Documentation

Screening using the modified Sharpe outperformance ratio

Description

Function which performs the screening of a universe of returns, and computes the modified Sharpe outperformance ratio.

Usage

msharpeScreening(X, level = 0.9, na.neg = TRUE, control = list(), Y = NULL)

Arguments

X

Matrix (T \times N) of T returns for the N funds. NA values are allowed.

level

Modified Value-at-Risk level. Default: level = 0.90.

na.neg

A logical value indicating whether NA values should be returned if a negative modified Value-at-Risk is obtained. Default na.neg = TRUE.

control

Control parameters (see *Details*).

Y

Optional matrix (T \times M) of returns for a second (peer) group of M funds. When supplied, the ratios are computed for each fund in X against the funds in Y (cross-group screening) instead of against the other funds in X; a single focal fund versus a peer group corresponds to X being a vector. Columns of Y identical to the focal fund are automatically excluded. Default: Y = NULL, i.e. within-group screening.

Details

The modified Sharpe ratio (Favre and Galeano 2002, Gregoriou and Gueyie 2003) is one industry standard for measuring the absolute risk adjusted performance of hedge funds. We propose to complement the modified Sharpe ratio with the fund's outperformance ratio, defined as the percentage number of funds that have a significantly lower modified Sharpe ratio. In a pairwise testing framework, a fund can have a significantly higher modified Sharpe ratio because of luck. We correct for this by applying the false discovery rate approach by Storey (2002).

For the testing, only the intersection of non-NA observations for the two funds are used.

The argument control is a list that can supply any of the following components:

  • 'type' Asymptotic approach (type = 1) or studentized circular bootstrap approach (type = 2). Default: type = 1.

  • 'ttype' Test based on ratio (type = 1) or product (type = 2). Default: type = 2.

  • 'hac' heteroscedastic-autocorrelation consistent standard errors. Default: hac = FALSE.

  • 'nBoot' Number of bootstrap replications for computing the p-value. Default: nBoot = 499.

  • 'bBoot' Block length in the circular bootstrap. Default: bBoot = 1, i.e. iid bootstrap. (The data-driven choice bBoot = 0 is only available in msharpeTesting, not in screening.)

  • 'pBoot' Symmetric p-value (pBoot = 1) or asymmetric p-value (pBoot = 2). Default: pBoot = 1.

  • 'nCore' Number of cores to be used. Default: nCore = 1.

  • 'minObs' Minimum number of concordant observations to compute the ratios. Default: minObs = 10.

  • 'minObsPi' Minimum number of observations to compute pi0. Default: minObsPi = 1.

  • 'lambda' Threshold value to compute pi0. Default: lambda = NULL, i.e. data driven choice.

  • 'gammaPos' One-sided quantile level (of the standard Normal distribution) used as the critical value for counting outperformed peers: a peer counts as outperformed when the pairwise t-statistic exceeds qnorm(gammaPos) (a negative threshold for gammaPos < 0.5), and the expected fraction 1 - gammaPos of false positives among the equal-performing peers is then subtracted. Default: gammaPos = 0.4 (the value recommended in Ardia and Boudt, 2018).

  • 'gammaNeg' Mirror image of gammaPos for the peers that outperform the focal fund: the count uses tstat <= qnorm(gammaNeg) and subtracts the expected fraction gammaNeg of false positives. Default: gammaNeg = 0.6.

  • 'fastAdjust' Use a fast vectorised inversion in the truncated-normal bias correction of \pi^0 instead of one uniroot call per value. This is the dominant cost when lambda is data driven and gives a large speed-up on big universes. The bisection locates the root to about 1e-12; since uniroot stops at its own tolerance (about 1.2e-4), the two paths typically differ by a few 1e-5, the fast path being the more accurate. Default: fastAdjust = FALSE, i.e. the original code path, kept as default so that published results reproduce exactly.

Value

A list with the following components:

n: Vector (of length N) of number of non-NA observations.

npeer: Vector (of length N) of number of available peers.

msharpe: Vector (of length N) of unconditional modified Sharpe ratios.

dmsharpe: Matrix (of size N \times N) of modified Sharpe ratios differences.

tstat: Matrix (of size N \times N) of t-statistics.

pval: Matrix (of size N \times N) of p-values of test for modified Sharpe ratios differences.

lambda: Vector (of length N) of lambda values.

pizero: Vector (of length N) of probability of equal performance.

pipos: Vector (of length N) of probability of outperformance performance.

pineg: Vector (of length N) of probability of underperformance performance.

Note

Further details on the methodology with an application to the hedge fund industry is given in Ardia and Boudt (2018).

Some internal functions where adapted from Michael Wolf MATLAB code.

Application of the false discovery rate approach applied to the mutual fund industry has been presented in Barras, Scaillet and Wermers (2010).

Author(s)

David Ardia and Kris Boudt.

References

Ardia, D., Boudt, K. (2015). Testing equality of modified Sharpe ratios. Finance Research Letters 13, 97–104.

Ardia, D., Boudt, K. (2018). The peer performance ratios of hedge funds. Journal of Banking and Finance 87, 351–368.

Barras, L., Scaillet, O., Wermers, R. (2010). False discoveries in mutual fund performance: Measuring luck in estimated alphas. Journal of Finance 65(1), 179–216.

Favre, L., Galeano, J.A. (2002). Mean-modified Value-at-Risk Optimization with Hedge Funds. Journal of Alternative Investments 5(2), 21–25.

Gregoriou, G. N., Gueyie, J.-P. (2003). Risk-adjusted performance of funds of hedge funds using a modified Sharpe ratio. Journal of Wealth Management 6(3), 77–83.

Ledoit, O., Wolf, M. (2008). Robust performance hypothesis testing with the Sharpe ratio. Journal of Empirical Finance 15(5), 850–859.

Storey, J. (2002). A direct approach to false discovery rates. Journal of the Royal Statistical Society B 64(3), 479–498.

See Also

msharpe, msharpeTesting, sharpeScreening and alphaScreening.

Examples

## Load the data (randomized data of monthly hedge fund returns)
data("hfdata")
rets = hfdata[,1:4]

## Modified Sharpe screening
msharpeScreening(rets, control = list(nCore = 1))

## Modified Sharpe screening with the studentized circular bootstrap
## (the 'hac' flag is ignored when type = 2)
msharpeScreening(rets, control = list(nCore = 1, type = 2))

PeerPerformance documentation built on Aug. 3, 2026, 1:08 a.m.