3 votos

Formulación de OVM con costes

Estoy intentando formular esta sencilla función de utilidad MVO con una penalización lineal de costes de transacción añadida utilizando Quadprog en MATLAB

tcost = 0,001; lambda = 4; mu = vector de rendimientos esperados (digamos 4x1) S = matriz de covarianza (4x4)

max w'*mu - lambda *w' S w - lambda_TC * tcost *suma(abs(w(i) - w0(i))

Entiendo que para que sea lineal podemos sustituir w(i) - w0(i) por una variable y(i) sustituyendo la ecuación anterior por

max w'*mu - lambda *w' S w - lambda_TC * tcost *suma(y(i))

y añadimos las restricciones y(i)>= w(i) - w0(i) y y(i)>= - (w(i) - w0(i))

Además, tengo una restricción de sólo largo y la suma de los pesos debe sumar 1

No estoy seguro de cómo formular esto en quadprog en MATLAB. Cualquier ayuda será apreciada.

¡Muchas gracias!

2voto

Ngoc Pham Puntos 171

No estoy muy familiarizado con MATLAB. Sin embargo, en la programación cuadrática lo principal que he encontrado es establecer el problema correctamente y luego la codificación se vuelve mucho más fácil.

Como ha señalado este problema se puede expresar como un problema del cono cuadrático y resuelto por quadprog, pero hay que trabajar mucho más para conseguirlo en la forma correcta.

  1. Deberías convencerte de que bajo el cambio de variables y = w - w0 que sugeriste el problema se convierte en realidad en el de abajo con suma(y) = 0 (asumiendo suma(x0) = 1) y ya no tenemos que preocuparnos por w.

    max y'*mu - lambda * y'Sy - lambda_tc * tcost * sum(abs(y)) + constant

Puedes calcular esa constante si quieres pero como estamos maximizando no importa. El problema es que este problema todavía no está en una forma de programación cuadrática porque todavía tiene una función de valor absoluto.

  1. El siguiente paso es deshacerse de la abs(). El truco aquí es duplicar el número de variables de optimización como aludes en la pregunta. Llamamos y = (y_plus - y_minus)/2 donde ahora tenemos dos nuevas restricciones y_plus >= w - w0 e y_minus >= -(w - w0).

  2. Esto parece complicar el problema, pero nota que si definimos z como el vector de (y_plus, y_minus) para 8 variables podemos reescribir el problema de nuevo como el de abajo con sum(z) = 0.

    max z'*mu - lambda * z'Sz - lambda_tc * tcost * sum(z)

donde mu y S se han ampliado al doble de su tamaño original. mu se repite dos veces con un cambio de signo (ahora tiene 2*4 miembros) y H tiene ahora dos matrices S diagonales en bloque y ceros en bloque en las diagonales exteriores (matriz de 8 por 8 en total). Sin embargo, ¡ahora hemos eliminado el valor absoluto del problema!

  1. Para poner esto en forma estándar sólo tenemos que combinar los términos lineales en z. Así que las ecuaciones para 'f' en quadprod se vería como (Por favor, vuelva a comprobar mis signos aquí)

    (mu_i - lambda_tc * tcost) * yplus_i y (mu_i + lambda_tc * tcost) * yminus_i

  2. Ahora este problema se puede poner en el quadprog con la 'f' anterior y la 'S' extendida (de tamaño doble) como 'H'. Aeq,beq pueden restringir sum(z) = 0 y A,b restringen cada yplus_i>0 y yminus_i<0 ya que y_plus son cambios en w que son positivos y y_minus son cambios que son negativos.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X