Path: blob/master/sandbox/testing_DEoptim_cardinality_constraint.R
1433 views
1# DEoptim with max positions constraint2# Uses fnMap to impose a cardinality constraint with DEoptim34library(PerformanceAnalytics)5library(PortfolioAnalytics)6library(DEoptim)78data(edhec)9R <- edhec1011# use example objective function from12# http://cran.r-project.org/web/packages/DEoptim/vignettes/DEoptimPortfolioOptimization.pdf13obj <- function(w) {14if(sum(w) == 0){15w <- w + 1e-216}17w <- w / sum(w)18CVaR <- ES(weights=w,19method="gaussian",20portfolio_method="component",21mu=mu,22sigma=sigma)23tmp1 <- CVaR$ES24tmp2 <- max(CVaR$pct_contrib_ES - 0.05, 0)25out <- tmp1 + tmp226return(out)27}2829mu <- colMeans(R)30sigma <- cov(R)3132N <- ncol(R)33minw <- 034maxw <- 135lower <- rep(minw, N)36upper <- rep(maxw, N)3738eps <- 0.0253940weight_seq <- generatesequence(min=minw, max=maxw, by=0.001, rounding=3)4142rpconstraint <- constraint(assets=N, min_sum=1-eps, max_sum=1+eps,43min=lower, max=upper, weight_seq=weight_seq)44set.seed(1234)45rp <- random_portfolios(rpconstraints=rpconstraint, permutations=N*10)46rp <- rp / rowSums(rp)4748controlDE <- list(reltol=.000001,steptol=150, itermax = 5000,trace = 250,49NP=as.numeric(nrow(rp)),initialpop=rp)50set.seed(1234)51out1 <- DEoptim(fn = obj, lower=lower, upper=upper, control=controlDE)5253weights1 <- out1$optim$bestmem54weights1 <- weights1 / sum(weights1)55sum(weights1)56out1$optim$bestval5758# Implement a cardinality constraint for max positions with DEoptim59# http://grokbase.com/t/r/r-help/126fsz99gh/r-deoptim-example-illustrating-use-of-fnmap-parameter-for-enforcement-of-cardinality-constraints60mappingFun <- function(x, max.pos) {61N <- length(x)62num <- N - max.pos63# Two smallest weights are given a value of 064x[order(x)][1:num] <- 065x / sum(x)66}6768out2 <- DEoptim(fn = obj, lower=lower, upper=upper, control=controlDE, fnMap=function(x) mappingFun(x, max.pos=10))69weights2 <- out2$optim$bestmem70weights2 <- weights2 / sum(weights2)71out2$optim$bestval72sum(round(weights2, 4))7374# mappingGroupFun <- function(x) {75# i <- 176# while(sum(x[1:2]) > 0.4 & i <= 5) {77# x[1:2] <- x[1:2] - 0.0178# i <- 1 + 179# }80# x / sum(x)81# }82#83# out3 <- DEoptim(fn = obj, lower=lower, upper=upper, control=controlDE, fnMap=mappingGroupFun)84# weights3 <- out3$optim$bestmem85# sum(weights[1:2])86# out3$optim$bestval87# sum(round(weights3, 4))8889909192