Estoy trabajando en este documento, http://www.nber.org/papers/w8922.pdf
Quiero aplicar las restricciones de peso de la cartera ver página 6-7.
Este es el breve resumen de mi problema:
Dejemos que w
sea el conjunto de pesos que representan una cartera. Entonces, el problema de la media-varianza consiste en encontrar las ponderaciones de la cartera que minimicen la varianza de la misma, argmin w'Sw
con sujeción a w'I = 1
que representa pesos que suman 1 y S
es la matriz de covarianza estimada.
En este marco, las ponderaciones de la cartera están restringidas por límites inferiores y superiores como:
A continuación, los autores muestran que la siguiente proposición es para la matriz de covarianza simétrica y semidefinida positiva para las carteras de varianza global mínima:
Aquí la nueva matriz de covarianza es la versión reducida de S
. Estoy tratando de implementar esto en Matlab mediante fmincon
función. También añado una restricción de retorno del objetivo como w'mean = rho
donde mean
es el vector columna de la rentabilidad esperada de los activos y rho
es el rendimiento previsto.
Creo el archivo portrisk.m para la función objetivo:
function f = portrisk(w, covmat)
f = w'* covmat * w;
end
Y las restricciones no lineales se organizan en el archivo constraint.m en matlab.
function [c,ceq] = constraint (w)
c=[-w]; % nonlinear inequality constraints
ceq = []; % nonlinear equality constraints
end
Aquí están los códigos:
% initialization
x0=[ones(p,1)/p]; % initialiazed to 1/p
% linear equality constraints (w'I=1, sum of the weights has to be 1 and target return)
Aeq = [meanx; repmat(1, 1, p)]; % matrix for linear equality constraints
rho = 0.0012
beq = [rho; 1]; % vector for linear equality constraint
% upper and lower bound constraints
lb = zeros(p,1);
ub = ones(p,1);
% constraints as both less or higher than a constant
A = [repmat(1, 1, p); repmat(-1, 1, p) ];
b = [1; 0];
% options
options = optimoptions('fmincon','Algorithm','interior-point','Display','iter');
% run optimization function, lambda is the langrange multipliers
[w, fval, exitflag, output, lambda, grad, hessian] = fmincon(@portrisk, x0 , A, b,
Aeq, beq, lb, ub,@constraint,options);
Sin embargo, no he podido obtener una solución. ¿Podrían ayudarme en qué me equivoco? Gracias por cualquier ayuda.