Gracias a todos por la adivinación. He probado fmincon
. Desgraciadamente no convergía a ninguna solución y no me hacía una idea de qué restricción la está rompiendo y en qué dirección debo modificar la restricción para llegar a una solución. Así que esto es lo que finalmente hice.
- Seguir utilizando
linprog
para la optimización.
- Calcular $w_b$ y $w_s$ y calcular la rotación de la cartera como $w_c = w_b+w_s$
- si $w_c > 0.10*w_{total}$
- Crear un vector de tasas de duración tal que $\delta_r \in [\frac{\delta_{rTot}}{10},\delta_{rTot}] $
- Crear un vector de duración de propagación tal que $\delta_s \in [\frac{\delta_{sTot}}{10},\delta_{sTot}] $
- Para cada $\delta(i)_r$ Dibujo los márgenes de $\delta(1)_s...\delta(10)_s$ y volver a ejecutar
linprog
. Guardo cada una de las soluciones exitosas $\delta(i)_s$ , $\delta_r(j)$ OEA y $w_c$ .
Por lo tanto, al final tengo todas las soluciones factibles y los límites de duración correspondientes. Ahora puedo sugerir algunas carteras óptimas con duraciones aceptables, OAS y costes de transacción. (Tengo una función que modela esto para mí basado en la cantidad pendiente, comprar / vender cantidades, etc) Es la fuerza bruta, pero funciona para mí. De este modo, no sólo conozco las posibilidades no viables, sino también todas las posibles bajo una estrategia de inversión, ya sea
- Aumentar el OAS y mantener el diferencial y la duración bajo un límite
- Mantener el OAS pero reducir la duración
- Una combinación de ambos con un bajo coste de transacción
Sólo quería que los demás lo supieran por si le sirve de ayuda a alguien.
EDITAR
Terminé codificando usando fmincon . He modelado el obtivo para aumentar el OAS y el bit de restricción no lineal como
function [c,ceq]=NonLiniearConstraints(~,x,w_i)
churn = 0.10;
res = sum(abs(x-w_i));
c(1) = res - 2*churn; % Buy + Sell = Total churn
ceq = [];
end
He comprobado que produce los mismos resultados que el de isqlin
que trata de minimizar el churn utilizando el método del mínimo cuadrado. Así que he marcado la respuesta de Brian como la correcta.