as.sropt {SharpeR}R Documentation

Compute the Sharpe ratio of the Markowitz portfolio.

Description

Computes the Sharpe ratio of the Markowitz portfolio of some observed returns.

Usage

as.sropt(X, drag = 0, ope = 1, epoch = "yr")

## Default S3 method:
as.sropt(X, drag = 0, ope = 1, epoch = "yr")

## S3 method for class 'xts'
as.sropt(X, drag = 0, ope = 1, epoch = "yr")

Arguments

X

matrix of returns, or xts object.

drag

the 'drag' term, c0/Rc_0/R. defaults to 0. It is assumed that drag has been annualized, i.e. has been multiplied by ope\sqrt{ope}. This is in contrast to the c0 term given to sr.

ope

the number of observations per 'epoch'. For convenience of interpretation, The Sharpe ratio is typically quoted in 'annualized' units for some epoch, that is, 'per square root epoch', though returns are observed at a frequency of ope per epoch. The default value is 1, meaning the code will not attempt to guess what the observation frequency is, and no annualization adjustments will be made.

epoch

the string representation of the 'epoch', defaulting to 'yr'.

Details

Suppose xix_i are nn independent draws of a qq-variate normal random variable with mean μ\mu and covariance matrix Σ\Sigma. Let xˉ\bar{x} be the (vector) sample mean, and SS be the sample covariance matrix (using Bessel's correction). Let

ζ(w)=wxˉc0wSw\zeta(w) = \frac{w^{\top}\bar{x} - c_0}{\sqrt{w^{\top}S w}}

be the (sample) Sharpe ratio of the portfolio ww, subject to risk free rate c0c_0.

Let ww_* be the solution to the portfolio optimization problem:

maxw:0<wSwR2ζ(w),\max_{w: 0 < w^{\top}S w \le R^2} \zeta(w),

with maximum value z=ζ(w)z_* = \zeta\left(w_*\right). Then

w=RS1xˉxˉS1xˉw_* = R \frac{S^{-1}\bar{x}}{\sqrt{\bar{x}^{\top}S^{-1}\bar{x}}}

and

z=xˉS1xˉc0Rz_* = \sqrt{\bar{x}^{\top} S^{-1} \bar{x}} - \frac{c_0}{R}

The units of zz_* are \mboxtime1/2\mbox{time}^{-1/2}. Typically the Sharpe ratio is annualized by multiplying by \mboxope\sqrt{\mbox{ope}}, where \mboxope\mbox{ope} is the number of observations per year (or whatever the target annualization epoch.)

Note that if ope and epoch are not given, the converter from xts attempts to infer the observations per epoch, assuming yearly epoch.

Value

An object of class sropt.

Author(s)

Steven E. Pav shabbychef@gmail.com

See Also

sropt, sr, sropt-distribution functions, dsropt, psropt, qsropt, rsropt

Other sropt: confint.sr(), dsropt(), is.sropt(), pco_sropt(), power.sropt_test(), reannualize(), sropt_test(), sropt

Examples

nfac <- 5
nyr <- 10
ope <- 253
# simulations with no covariance structure.
# under the null:
set.seed(as.integer(charToRaw("be determinstic")))
Returns <- matrix(rnorm(ope*nyr*nfac,mean=0,sd=0.0125),ncol=nfac)
asro <- as.sropt(Returns,drag=0,ope=ope)
# under the alternative:
Returns <- matrix(rnorm(ope*nyr*nfac,mean=0.0005,sd=0.0125),ncol=nfac)
asro <- as.sropt(Returns,drag=0,ope=ope)
# generating correlated multivariate normal data in a more sane way
if (require(MASS)) {
  nstok <- 10
  nfac <- 3
  nyr <- 10
  ope <- 253
  X.like <- 0.01 * matrix(rnorm(500*nfac),ncol=nfac) %*% 
    matrix(runif(nfac*nstok),ncol=nstok)
  Sigma <- cov(X.like) + diag(0.003,nstok)
  # under the null:
  Returns <- mvrnorm(ceiling(ope*nyr),mu=matrix(0,ncol=nstok),Sigma=Sigma)
  asro <- as.sropt(Returns,ope=ope)
  # under the alternative
  Returns <- mvrnorm(ceiling(ope*nyr),mu=matrix(0.001,ncol=nstok),Sigma=Sigma)
  asro <- as.sropt(Returns,ope=ope)
}

# using real data.
if (require(xts)) {
 data(stock_returns)
 asro <- as.sropt(stock_returns)
}  

[Package SharpeR version 1.3.0 Index]