4 votos

Portafolio óptimo de la Frontera Eficiente

Encontré este código en el sitio plotly, utilizando CVXOPT para encontrar la frontera eficiente y luego la cartera óptima. La función óptima es

def optimal_portfolio(returns):
    n = len(returns)
    returns = np.asmatrix(returns)

    N = 100
    mus = [10**(5.0 * t/N - 1.0) for t in range(N)]

    # Convertir a matrices cvxopt
    S = opt.matrix(np.cov(returns))
    pbar = opt.matrix(np.mean(returns, axis=1))

    # Crear matrices de restricción
    G = -opt.matrix(np.eye(n))   # matriz identidad negativa de n x n
    h = opt.matrix(0.0, (n ,1))
    A = opt.matrix(1.0, (1, n))
    b = opt.matrix(1.0)

    # Calcular los pesos de la frontera eficiente usando programación cuadrática
    portfolios = [solvers.qp(mu*S, -pbar, G, h, A, b)['x'] 
                  for mu in mus]
    ## CALCULAR RIESGOS Y RETORNOS PARA LA FRONTERA
    returns = [blas.dot(pbar, x) for x in portfolios]
    risks = [np.sqrt(blas.dot(x, S*x)) for x in portfolios]
    ## CALCULAR EL POLINOMIO DE 2º GRADO DE LA CURVA DE LA FRONTERA
    m1 = np.polyfit(returns, risks, 2)
    x1 = np.sqrt(m1[2] / m1[0])
    # CALCULAR LA CARTERA ÓPTIMA
    wt = solvers.qp(opt.matrix(x1 * S), -pbar, G, h, A, b)['x']
    return np.asarray(wt), returns, risks

weights, returns, risks = optimal_portfolio(return_vec)

Mi pregunta se refiere a las líneas donde el código ajusta una parábola a la frontera eficiente

m1 = np.polyfit(returns, risks, 2)

toma la raíz cuadrada de la división de la intercepción por el coeficiente de x al cuadrado

x1 = np.sqrt(m1[2] / m1[0])

y lo pone en la optimización

t = solvers.qp(opt.matrix(x1 * S), -pbar, G, h, A, b)['x']

¿Alguien puede explicar por qué se hace esto?

¡Gracias!

1 votos

Deberías estudiar las matemáticas para derivar la frontera de media-varianza (Hay versiones por todos lados, pero aquí tienes un ejemplo.) Luego verifica si lo que están resolviendo es correcto o tiene sentido. Para las carteras en la frontera, la varianza del rendimiento de la cartera es cuadrática respecto al retorno esperado (por lo que asumo que están ajustando un polinomio de 2do grado).

1voto

RoeeBoo Puntos 1

En la ecuación cuadrática de la forma $y= ax^2+bx+c = 0$, cuando $b=0$ entonces $+/-\sqrt{(c/a)}$ son los valores de intersección con el eje $x$. Además, esta es la solución de la ecuación. Utilizando las fórmulas de Vieta uno puede ver que: $x1*x2 = c/a$ También, utilizando la solución trigonométrica: $x= \sqrt{(c/a)}*tan(\theta)$ Por lo tanto, tal vez haya necesidad de rotar el eje en 90 grados a la derecha para entenderlo mejor y cambiar el eje de simetría. Y supongo que hay una conexión con el foco de la parábola

0voto

labyrinth Puntos 591

Tenga en cuenta que mus no es una serie de valores de retorno esperados; es una serie de 'pesos' que representan el parámetro de aversión al riesgo, es decir, la importancia relativa de la varianza en el trade-off retorno-varianza, también el multiplicador de Lagrange en un problema de optimización de dos criterios. (Ver página 187, Figura 4.12 del libro Optimización convexa)

Compare solvers.qp(mu*S, -pbar, G, h, A, b)['x'] con solvers.qp(opt.matrix(x1 * S), -pbar, G, h, A, b)['x'], tenga en cuenta que $(x_1, x_2)=(\sqrt{c/a}, \sqrt{c/a})$ es el vértice de la parábola, por lo tanto, $x_1$ representa el parámetro de aversión al riesgo que conduce a la cartera óptima con menor std.

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