3 votos

Optimización del objetivo de volatilidad - Python

Estoy probando una estrategia de objetivo de volatilidad en Python . Este proceso implica la resolución del siguiente problema de optimización en cada fecha de reequilibrio

$$\min_w \left(w^T\Sigma w - \bar\sigma^2\right)^2$$ s.t. $$\mu^T w\ge \bar\mu$$ $$1^T w = 1$$

¿Cuál sería el mejor algoritmo para implementar este problema?

4voto

James Thorpe Puntos 221

Esta entrada del blog como sugiere esta respuesta , tiene una implementación bastante completa de una cartera de maximización de rendimiento con riesgo objetivo. La siguiente es una implementación simplificada que escribí para un proyecto anterior, para su referencia. Tenga en cuenta que la construcción de matrices en cvxopt no es totalmente sencilla, y puede tomar algún tiempo para acostumbrarse a la transición de np.

La entrada del blog a la que se hace referencia utiliza la media de las rentabilidades históricas para crear previsiones de rentabilidad, mientras que mi función de abajo toma un vector de rentabilidades como entrada porque he utilizado un método de cálculo diferente para las rentabilidades prospectivas.

import cvxopt as cvx

def markowitz_opt(ret_vec, covar_mat, max_risk):
    U,V = np.linalg.eig(covar_mat)
    U[U<0] = 0
    Usqrt = np.sqrt(U)
    A = np.dot(np.diag(Usqrt), V.T)

    # Calculating G and h matrix
    G1temp = np.zeros((A.shape[0]+1, A.shape[1]))
    G1temp[1:, :] = -A
    h1temp = np.zeros((A.shape[0]+1, 1))
    h1temp[0] = max_risk

    ret_c = len(ret_vec)
    for i in np.arange(ret_c):
        ei = np.zeros((1, ret_c))
        ei[0, i] = 1
        if i == 0:
            G2temp = [cvx.matrix(-ei)]
            h2temp = [cvx.matrix(np.zeros((1,1)))]
        else:
            G2temp += [cvx.matrix(-ei)]
            h2temp += [cvx.matrix(np.zeros((1,1)))]

    # Construct list of matrices
    Ftemp = np.ones((1, ret_c))
    F = cvx.matrix(Ftemp)
    g = cvx.matrix(np.ones((1,1)))

    G = [cvx.matrix(G1temp)] + G2temp
    H = [cvx.matrix(h1temp)] + h2temp

    # Solce using QCQP
    cvx.solvers.options['show_progress'] = False
    sol = cvx.solvers.socp(
        -cvx.matrix(ret_vec), 
        Gq=G, hq=H, A=F, b=g)
    xsol = np.array(sol['x'])
    return xsol, sol['status']

1voto

dotnetcoder Puntos 1262

Supongo que las variables barradas son constantes.

Es evidente que el mínimo se obtiene cuanto más se acerca el elemento cuadrático a $\bar{\sigma}^2$ por lo que el problema se puede reformular como

$$ \min_{w,t} t $$ s.t. $$ w^T \Sigma w -t \leq \bar{\sigma} $$ $$ w^T \Sigma w +t \geq \bar{\sigma} $$ $$ \mu^T w \geq \bar{\mu} $$ $$ 1^Tw=1 $$ $$ t \geq 0 $$

Se trata de un Problema Lineal Restringido Cuadráticamente (QCLPs), que es una subclase de los Programas Cuadráticos Restringidos Cuadráticamente (QCQPs), que están relacionados con los Programas Cónicos de Segundo Orden (SOCPs).

No sé qué algoritmos funcionarán mejor, lamentablemente, pero sugeriría que el CVXOPT de Python podría tener alguna documentación, o debido a la naturaleza del problema me atrevería a adivinar que la Programación Cuadrática Secuencial valdría la pena probar. Espero que esta respuesta pueda orientarte a ti o a alguien más en la dirección correcta.

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