During construction of typical efficient frontier, risk is usually measured by the standard deviation of the portfolio’s return. Maximum Loss and Mean-Absolute Deviation are alternative measures of risk that I will use to construct efficient frontier. I will use methods presented in Comparative Analysis of Linear Portfolio Rebalancing Strategies: An Application to Hedge Funds by Krokhmal, P., S. Uryasev, and G. Zrazhevsky (2001) paper to construct optimal portfolios.
Let x.i, i= 1,…,n be weights of instruments in the portfolio. We suppose that j= 1,…,T scenarios of returns with equal probabilities are available. I will use historical assets returns as scenarios. Let us denote by r.ij the return of i-th asset in the scenario j. The portfolio’s Maximum Loss (page 34) can be written as
It can be formulated as a linear programming problem
This linear programming problem can be easily implemented
min.maxloss.portfolio <- function
(
ia, # input assumptions
constraints # constraints
)
{
n = ia$n
nt = nrow(ia$hist.returns)
# objective : maximum loss, w
f.obj = c( rep(0, n), 1)
# adjust prior constraints, add w
f.con = rbind(constraints$A, 0)
f.dir = c(rep('=', constraints$meq), rep('>=', len(constraints$b) - constraints$meq))
f.rhs = constraints$b
# -SUM <over i> r.ij * x.i <= w, for each j from 1 ... T
a1 = rbind( matrix(0, n, nt), 0)
b1 = rep(0, nt)
a1[1:n,] = t(ia$hist.returns)
a1[(n + 1),] = +1 # w
f.con = cbind( f.con, a1 )
f.dir = c(f.dir, rep('>=', nt))
f.rhs = c(f.rhs, b1)
# find optimal solution
x = NA
sol = try(lp.anyx('min', f.obj, t(f.con), f.dir, f.rhs, -100), TRUE)
if(!inherits(sol, 'try-error')) {
x = sol$solution[1:n]
}
return( x )
}
The portfolio’s Mean-Absolute Deviation (MAD) (page 33) can be written as
It can be formulated as a linear programming problem
This linear programming problem can be implemented
min.mad.portfolio (
ia, # input assumptions
constraints # constraints
)
{
n = ia$n
nt = nrow(ia$hist.returns)
# objective : Mean-Absolute Deviation (MAD)
# 1/T * [ SUM (u+.j + u-.j) ]
f.obj = c( rep(0, n), (1/nt) * rep(1, 2 * nt) )
# adjust prior constraints, add u+.j, u-.j
f.con = rbind( constraints$A, matrix(0, 2 * nt, ncol(constraints$A) ) )
f.dir = c(rep('=', constraints$meq), rep('>=', len(constraints$b) - constraints$meq))
f.rhs = constraints$b
# [ SUM r.ij * x.i ] - 1/T * [ SUM [ SUM r.ij * x.i ] ] = u+.j - u-.j , for each j = 1,...,T
a1 = rbind( matrix(0, n, nt), -diag(nt), diag(nt))
b1 = rep(0, nt)
a1[1:n,] = t(ia$hist.returns) - repmat(colMeans(ia$hist.returns), 1, nt)
f.con = cbind( f.con, a1 )
f.dir = c(f.dir, rep('=', nt))
f.rhs = c(f.rhs, b1)
# find optimal solution
x = NA
min.x.bounds = c( rep(-100, n), rep(0, 2 * nt) )
sol = try(lp.anyx('min', f.obj, t(f.con), f.dir, f.rhs, min.x.bounds), TRUE)
if(!inherits(sol, 'try-error')) {
x = sol$solution[1:n]
}
return( x )
}
Let’s examine efficient frontiers computed under different risk measures using historical input assumptions presented in the Introduction to Asset Allocation post:
############################################################################### # Create Efficient Frontier ############################################################################### n = ia$n # x.i >= 0 constraints = new.constraints(diag(n), rep(0, n), type = '>=') # x.i constraints = add.constraints(diag(n), rep(0.8, n), type = ' # SUM x.i = 1 constraints = add.constraints(rep(1, n), 1, type = '=', constraints) # create efficient frontier(s) ef.risk = portopt(ia, constraints, 50, 'Risk') ef.maxloss = portopt(ia, constraints, 50, 'Max Loss', min.maxloss.portfolio) ef.mad = portopt(ia, constraints, 50, 'MAD', min.mad.portfolio) # Plot multiple Efficient Frontiers layout( matrix(1:4, nrow = 2) ) plot.ef(ia, list(ef.risk, ef.maxloss, ef.mad), portfolio.risk, F) plot.ef(ia, list(ef.risk, ef.maxloss, ef.mad), portfolio.maxloss, F) plot.ef(ia, list(ef.risk, ef.maxloss, ef.mad), portfolio.mad, F) # Plot multiple Transition Maps layout( matrix(1:4, nrow = 2) ) plot.transitopn.map(ef.risk) plot.transitopn.map(ef.maxloss) plot.transitopn.map(ef.mad)
The Mean-Absolute Deviation and Standard Deviation risk measures are very similar by construction – they both measure average deviation, so it is not a surprise that their efficient frontiers and transition maps are close. On the other hand, the Maximum Loss measures the extreme deviation and has very different efficient frontier and transition map.
R-bloggers.com offers daily e-mail updates about R news and tutorials on topics such as: visualization (ggplot2, Boxplots, maps, animation), programming (RStudio, Sweave, LaTeX, SQL, Eclipse, git, hadoop, Web Scraping) statistics (regression, PCA, time series, trading) and more...



Zero Inflated Models and Generalized Linear Mixed Models with R.
Zuur, Saveliev, Ieno (2012).