Как определить отрицательное ограничение только в Aeq * X ‹= Beq

Я использую quadprog ссылку, чтобы найти портфель оптимальных весов.

До сих пор мне удалось реализовать только длинное ограничение (т.е. веса не могут быть меньше нуля w >= 0 and w1 + w2 + ... wN = 1) следующим образом:

FirstDegree             = zeros(NumAssets,1);
SecondDegree            = Covariance;
Aeq                     = ones(1,NumAssets);
beq                     = 1;
A                       = -eye(NumAssets);
b                       = zeros(NumAssets,1);

x0                      = 1/NumAssets*ones(NumAssets,1);
MinVol_Weights          = quadprog(SecondDegree,FirstDegree,A,b,Aeq,beq,[],[],x0, options);

Теперь я пытаюсь установить короткие ограничения, т. е. все веса должны быть в сумме равными -1, и все они должны быть строго меньше или равны нулю. Как это можно переписать?


person JohnAndrews    schedule 23.01.2017    source источник


Ответы (1)


Обратите внимание, что вы можете переписать любое неравенство «больше чем» a ≥ b в неравенство «меньше чем» -a ≤ -b переворачивая знаки. В вашем примере выберите

Aeq = ones(1,NumAssets);
beq = -1;
A   = eye(NumAssets);
b   = zeros(NumAssets,1);

Это означает Aeq*w == w(1) + w(2) + … + w(NumAssets) == -1 и A*w <= 0, что равнозначно w(i) <= 0 для всех i.

person Lumen    schedule 25.01.2017
comment
Работает отлично! - person JohnAndrews; 25.01.2017
comment
Может попросить продолжение. Как бы вы переписали его, чтобы допустить как положительные, так и отрицательные стороны? Вот моя мысль: Aeq = one(1,NumAssets); бек = 1; А = []; б = []; - person JohnAndrews; 25.01.2017
comment
Вы определенно правы в части A = []; b = [];. Однако вы не можете добиться того, чтобы веса в сумме давали 1 и –1 одновременно. Ваш Aeq = ones(1,NumAssets); beq = 1; означает, что в сумме они должны давать 1. Если это то, что вы хотели, то идите правильно. - person Lumen; 25.01.2017
comment
Хм.. Им не нужно добавлять до одного как такового. Если они в сумме дают -1, это тоже нормально. Так что, я думаю, я оставлю это [] тогда? - person JohnAndrews; 25.01.2017
comment
К сожалению, абсолютное значение не является линейной функцией. Таким образом, вы не можете использовать ограничение, которое говорит «сумма этого должна быть равна –1 или +1». Вы можете сказать –1 ≤ Σ w_i ≤ 1 на A = [eye(NumAssets); ones(1, NumAssets); -ones(1, NumAssets); и b = [zeros(NumAssets, 1); 1; 1]; с Aeq = [] и beq = []. - person Lumen; 25.01.2017
comment
Спасибо за это. Однако это не сработало, дает мне равные веса. Я повторно разместил его как отдельный вопрос здесь: stackoverflow.com/questions/41862287/ - person JohnAndrews; 26.01.2017