二元决策变量和模拟数据库的优化

时间:2015-12-05 14:08:44

标签: r optimization linear-programming quadratic-programming

我有一个模拟观测数据框,我正在尝试进行优化,以便在给定的风险水平下获得最大的成功。问题是我不知道如何在约束中编程。这是我的DF的子集,行是团队,X1:X10是成功和失败的模拟结果

    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
1   0  1  0  1  0  0  0  1  1   0
2   0  1  0  0  1  1  1  1  1   1
3   1  0  0  0  0  0  0  1  1   0
4   1  0  1  1  1  0  0  1  0   1
5   0  0  1  0  1  0  1  1  1   0
6   0  1  0  1  0  1  1  0  1   1
7   1  0  0  0  0  1  1  1  1   0
8   0  0  1  1  0  0  1  1  0   1
9   1  0  0  0  0  1  1  1  1   0
10  0  1  1  0  0  1  0  1  0   0

目标是最大化sum(colMeans(DF))

根据下面的评论,我想我会写出我想要解决的数学。从研究来看,有几种不同的方法可以做到这一点,但我不知道如何编写约束。我的大数据集是10,000 X 10,000。

一种方法

目标函数=最大值(平均值(总和(Simutaltion [i])

约束:

观察是二元的

观察= 4

SD(投资组合))< X或Min(成功)> 3

其他方法:

目标函数=最小值(SD(sum(Simutaltion [i]))或Max((平均值(sum(Simutaltion [i])/(SD(投资组合)

约束:

观察是二元的

观察= 4

平均值(总和(Simulatin [i]))> 5

所以我一直在玩这个,我开始到了某个地方。

library(quantprog)
library(Matrix)
dmat = cov(t(df))
dmat = dmat$mat
dvec = rowMeans(df)
n = nrow(dmat)
Amat = matrix(1,nrow = n)
bvec = 1
meq = 1
sol <- solve.QP(dmat, dvec = -dvec, Amat = Amat, meq = meq)
sol
$solution
 [1] -2.2700081 -1.0040420  5.9587712 -2.8265966  0.2037187  1.1641067 -2.0099030  1.5024252 -2.0099030
[10]  1.2914309

$value
[1] -0.730477

$unconstrained.solution
 [1]   6.750   6.750   6.750 -81.000 -38.250 -78.750 -12.375  36.000 -12.375 -29.250

$iterations
[1] 2 0

$Lagrangian
[1] 0.5626516

$iact
[1] 1

当我对bvec = c(1, rep(0|-.25, n))进行此更改时 我得到的解决方案基本上都是0,

$solution
 [1]  6.018572e-17 -5.455221e-16  4.873879e-13 -4.176466e-15 -8.236146e-17 -2.663993e-16  9.764273e-17
 [8] -4.092027e-17 -2.630662e-13  0.000000e+00

使用过tseries并得到了这些结果,

portfolio.optim(t(df), covmat = as.matrix(dmat) )
$pw
 [1] -6.146157e-17  8.336774e-20  1.818182e-01  2.272727e-01  1.212121e-01  3.030303e-01  0.000000e+00
 [8]  2.658696e-17  6.164972e-15  1.666667e-01

$px
 [1] 0.4090909 0.4696970 0.5151515 0.5303030 0.3484848 0.4696970 0.4242424 0.6969697 0.6060606 0.5303030

$pm
[1] 0.5

$ps
[1] 0.1005038

如果我可以为那些也能起作用的tseries获得一个重量限制。

有关编辑约束的任何提示也希望将最小成功率添加为约束。谢谢,

1 个答案:

答案 0 :(得分:2)

我会分两个步骤来解决这个问题。首先在数学中写下模型,然后尝试在一个软件中实现这个模型。让我们从最简单的线性模型开始。使用约束内的标准偏差会要求重型机械(模型变为MINLP或至少是二次约束的混合整数问题)。

我相信数学模型可以表述为:

enter image description here

这里n = 4,d是你的数据框作为矩阵。我们甚至可以通过观察风险等式在预处理期间完成来简化更多:如果所有团队的行数小于2,则从数据框中删除所有团队。

现在我们有了模型,我们需要将它变成解算器接受的形式。我看到你使用了LpSolveAPI。由于模型非常简单,因此在调用lpSolveAPI时强制转换此模型并不困难。