1
$\begingroup$

I have a data frame of bets, with 1 being a win and 0 being a loss. These bets are correlated so I cannot just pick the highest winning percentage. Goal is to get 2 optimizations, 1 for max sharpe ration, and 1 for minMAD for a given return. This is similar to any portfolio questions, but with the unique constraint that each bet can only be placed once and some bets are correlated with one another

> df
  X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
A  0  1  0  1  0  0  0  1  1   0
B  0  1  0  0  1  1  1  1  1   1
C  1  0  0  0  0  0  0  1  1   0
D  1  0  1  1  1  0  0  1  0   1
E  0  0  1  0  1  0  1  1  1   0
F  0  1  0  1  0  1  1  0  1   1
G  1  0  0  0  0  1  1  1  1   0
H  0  0  1  1  0  0  1  1  0   1
I  1  0  0  0  0  1  1  1  1   0
J  0  1  1  0  0  1  0  1  0   0

Bets can either be included or excluded, but each bet can only be placed 1 time. I posted a questions over the weekend Optimization with Binary decision variable and simulated database thinking an equal weighted quadratic optimization could solve the problem but I could not figure out how to program binary variables. After doing so research today, I saw an example of a GLPK program that used mean absolute deviation and transformed it for a LP.

I am trying to tweak this for a binary variable, but have no experience with optimizations. What are some good resource to learn how to program the matrix. Here is the goal.

Minimize - Mean Absolute Deviation

S.T.

Number of bets = 4

Bets are a binary variable

Winning percentage >= 0.52

And

Maximize winning percentage / MAD

ST

Weights are equal (1/n) or 0.25, and sum to 1

Can someone help point me in the right direction. I am new to R and never set up a LP before. Some resource to help learn, and advice on set up will be much appreciated. I spend this weekend trying to figure it out spinning circles. Also I plan on playing around with the constraints and objective function once I get a base model going so please pass along good resources on R optimizations so I can learn. S.O. has been a great resource helping me learn R, right now I am using excel as a stop gap but the read data set is too big for the standard excel solve so I have to make several adjustments to get any usable results.

Thanks for all of your help.

So this is what I have so far, but the output is not correct.

> nAssets = nrow(df)
> nScenarios = ncol(df)
> Mean = rowMeans(df)
> data = as.matrix(df)
> sucessRate = .52
>   vec <- c(weights=rep(0, nAssets), scenarios=rep(1/nScenarios, nScenarios))
> mat <- rbind(
+       MAD.LE = cbind(data, -diag(nScenarios)),
+       MAD.GE = cbind(data, +diag(nScenarios)),
+       RETURN = t(c(Mean, rep(0, nScenarios))),
+       BUDGET = t(c(rep(1, nAssets), rep(0, nScenarios))),
+       X = cbind(matrix(rep(0, nAssets*nScenarios),ncol=nAssets), diag(nScenarios)),
+       WEIGHTS = cbind(diag(nAssets), matrix(rep(0, nScenarios*nAssets), nrow=nAssets)))
> mat <- rbind(
+       MAD.LE = cbind(data, -diag(nScenarios)),
+       MAD.GE = cbind(data, +diag(nScenarios)),
+       RETURN = t(c(Mean, rep(0, nScenarios))),
+       BUDGET = t(c(rep(1, nAssets), rep(0, nScenarios))),
+       X = cbind(matrix(rep(0, nAssets*nScenarios),ncol=nAssets), diag(nScenarios)),
+       WEIGHTS = cbind(diag(nAssets), matrix(rep(0, nScenarios*nAssets), nrow=nAssets)))
> rhs <- c(
+       MAD.LE = rep(0, nScenarios),
+       MAD.GE = rep(0, nScenarios),
+       RETURN = sucessRate,
+       BUDGET = 1,
+       X = rep(0, nScenarios),
+       WEIGHTS = rep(0, nAssets))
>  dir <- c(
+       MAD.LE = rep("<=", nScenarios),
+       MAS.GE = rep(">=", nScenarios),
+       RETURN = "==",
+       BUDGET = "==",
+       X = rep(">=", nScenarios),
+       WEIGHTS = rep(">=", nAssets))
>  Rglpk::Rglpk_solve_LP(vec, mat, dir, rhs)
$optimum
[1] 0.31

$solution
 [1] 0.000000e+00 1.000000e-01 0.000000e+00 0.000000e+00 9.000000e-01 0.000000e+00 0.000000e+00
 [8] 0.000000e+00 0.000000e+00 9.860761e-32 1.000000e-01 1.000000e+00 0.000000e+00 9.000000e-01
[15] 9.000000e-01 1.000000e-01 0.000000e+00 9.860761e-32 0.000000e+00 1.000000e-01

$status
[1] 0

What mistake did I make that is yielding more than 10 weights, and how do I get the weights equal and only 4 bets selected. Here is MatLab code for almost exactly what I am looking for, can someone help translate what is missing to R.

http://www.mathworks.com/help/optim/examples/mixed-integer-quadratic-programming-portfolio-optimization.html

$\endgroup$

0

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Browse other questions tagged or ask your own question.