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.