7 votos

¿Cómo definir la función objetivo de un problema de optimización personalizado?

Me gustaría encontrar las asignaciones que minimicen alguna métrica definida por el usuario (Sortino, drawdown mínimo, etc) para una cartera de activos.

¿Cómo se formularían las funciones objetivo para pasarlas al optimizador?

Tengo experiencia en la optimización de carteras para la mínima varianza y Sharpe, pero cuando el objetivo es diferente, ¿cómo se abordaría y formularía el problema?

11voto

mendicant Puntos 489

La varianza mínima puede resolverse de forma sencilla y eficiente mediante un optimizador cuadrático, ya que la única entrada clave es una matriz de covarianza.

El Drawdown o el Sortino no pueden ser optimizados a través de una matriz de covarianza a menos que se asuma alguna relación funcional entre las covarianzas/varianzas y su métrica de riesgo de interés. De todos modos, lo más probable es que acabe con una cartera similar a la de mínima varianza con esta estrategia, ya que bajo el supuesto de una rentabilidad conjunta distribuida normalmente, los valores con las covarianzas/varianzas más elevadas también tendrán la mayor reducción.

El optimizador resuelve qué conjunto de pesos maximiza o minimiza una función objetivo. Por lo tanto, necesita formular una función objetivo que represente la utilidad esperada de su cartera dado un conjunto de ponderaciones. La función de utilidad sería la suma de su alfa esperada y tendría una penalización por drawdown/sortino. Una forma sencilla (¿cruda?) de expresar el drawdown o sortino esperado es suponer que el drawdown o sortino esperado para un valor es aproximado por el drawdown / sortino histórico.

Puede utilizar el PortfolioAnalytics en R para medir el riesgo histórico (drawdown, sortino, etc.) de una función y pasarlo a un optimizador. Esto es un poco arriesgado, ya que la reducción histórica puede no ser un buen predictor de la reducción futura (y hay que tener en cuenta las interacciones entre los activos). Ahora que tiene una función para el riesgo, utilice un optimizador que busque en el espacio de pesos para ver dónde se minimiza su función objetivo. Necesita un optimizador que busque en todo el espacio de pesos (como un algoritmo genético o un generador de carteras aleatorias) en lugar de un optimizador cuadrático o basado en el gradiente, ya que su función de reducción del riesgo probablemente no pueda diferenciarse.

Brian Peterson y Peter Carl tienen una buena ilustración de cómo tomar funciones objetivo arbitrarias y utilizar un algoritmo basado en la búsqueda para resolverlas aquí . Creo que su presentación le ayudará a concretar en la práctica las ideas sugeridas anteriormente.

Actualización: Si su función objetivo es convexa, entonces un optimizador cuadrático como quadprog o un algoritmo de aprendizaje automático como el descenso de gradiente estocástico garantizará una solución. Si su función objetivo no es convexa, tendrá que utilizar una estrategia de optimización alternativa (algos genéticos, métodos de región de confianza, optimizadores no lineales como NLOPTR etc.). Varios de estos otros métodos no garantizan la convergencia (de hecho, pueden encontrar sólo los óptimos locales). Además, consumen mucho más tiempo. La gravedad de este problema depende de la naturaleza de la función objetivo, el tiempo de iteración y la capacidad de resolver la optimización en paralelo con semillas aleatorias, el nivel de precisión que se requiere dado el ruido de las entradas. Por ejemplo, los optimizadores no convexos son, en general, demasiado lentos e innecesarios para aplicaciones como el comercio de alta frecuencia. Además, puede encontrar soluciones inferiores a la resolución de problemas cuadráticos más sencillos en los que al menos puede garantizar un óptimo.

Consejo: Si decide utilizar algoritmos genéticos como DEOptim En este caso, puede considerar sembrar su población inicial con soluciones de una optimización cuadrática de varianza media (a lo largo de diferentes puntos de la frontera) para acelerar la convergencia.

También puedes acelerar el proceso si inviertes en una GPU CUDA para manejar las operaciones paralelas.

5voto

arfon Puntos 829

Si está usando Python, tal vez quiera echar un vistazo a esta pregunta a la que el cvxopt La biblioteca fue la respuesta más popular.

Si no es así, o si no quieres usar cvxopt, entonces la configuración básica no es diferente de usar la optimización de la media-varianza. Casi siempre caracterizará su problema como una función que toma un único argumento vectorial (las ponderaciones de la cartera) y devuelve un valor escalar (la puntuación de riesgo/recompensa). Un optimizador genérico puede encontrar las ponderaciones que maximizan esa puntuación.

Tenga en cuenta que cualquier optimización puede ser más representativa de la capacidad de ajuste de curvas de su algoritmo que algo real.

Este es un pseudocódigo muy abstracto para optimizar una relación de Sortino en Python, utilizando la herramienta de SciPy minimizar optimizador. Otros lenguajes seguirán un camino similar, y navegando por la documentación se pueden introducir cosas más sofisticadas como límites de peso, otras restricciones, etc.

#First set up any global variables you don't need to compute each time
import numpy as np
import scipy

stock_returns = ...
risk_free = ...

#Next define your risk/reward function for a set of portfolio returns
def sortino(portfolio_returns):
    downside_returns = portfolio_returns[:]
    downside_returns[portfolio_returns > 0] = 0
    return np.mean(portfolio_returns) / np.mean(zeroed_returns)

#Now set up your optimization problem,
#returning a negative value because we will use a minimization optimizer
def fn_to_optimize(weightsVector):
    portfolio_returns = np.dot(weightsVector, stock_returns) 
    sortino_ratio = sortino(portfolio_returns - risk_free)
    return -1 * sortino_ratio

#Finally, use a generic solver like SciPy's minimize to optimize the weights
initial_weights = np.ones(10) * 0.1 
solution = scipy.optimize.minimize(fn_to_optimize,  initial_weights, ...)

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