Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
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 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.