0

我有一个模拟观察的数据框,我正在尝试进行优化,以在给定的风险水平下获得最大的成功。问题是我不知道如何在约束中编程。这是我的 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。

一种方法

目标函数 = Max(average(sum(Simutaltion [i])

约束:

观察是二元的

观察 = 4

SD(portfolio)) < X 或 Min(success) > 3

其他方法:

目标函数 = Min(SD(sum(Simutaltion [i])) 或 Max((average(sum(Simutaltion [i])/(SD(portfolio))

约束:

观察是二元的

观察 = 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 获得一个重量限制,那也可以。

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

4

1 回答 1

2

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

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

在此处输入图像描述

这里 n=4 和 d 是您作为矩阵的数据框。我们甚至可以通过观察可以在预处理期间完成风险方程来进一步简化:如果他们的 rowsum 小于 2,则从数据框中删除所有团队。

现在我们有了模型,我们需要将其转换为求解器接受的形式。我看到你使用了 LpSolveAPI。由于该模型非常简单,因此在调用 lpSolveAPI 时转换该模型并不难。

于 2015-12-05T18:31:30.927 回答