Saltar al contenido
Portafolios de Inversión con Python

Optimización de portafolios con Programación Lineal en Python

Introducción

La optimización de portafolios de inversión es un proceso mediante el cual se busca construir una combinación de activos que maximice el rendimiento esperado o minimice el riesgo esperado. La programación lineal es una herramienta matemática que nos permite resolver este tipo de problemas de optimización de manera eficiente.

En este curso de portafolios de inversión con Python, aprenderás cómo utilizar la programación lineal en Python para optimizar portafolios de inversión. En primer lugar, entenderás los conceptos básicos de la teoría de portafolios, como la rentabilidad, el riesgo y la diversificación. Luego, aprenderás a utilizar herramientas estadísticas y matemáticas para calcular los rendimientos y los riesgos de los activos.

Con este conocimiento, podrás construir modelos matemáticos de portafolios de inversión y utilizar la programación lineal para optimizarlos. Utilizando paquetes como el "PuLP" o el "CVXPY", podrás resolver problemas de programación lineal y cuadrática para construir portafolios óptimos.

Al final del curso, estarás capacitado para construir soluciones de optimización de portafolios de inversión utilizando la programación lineal en Python, lo que te permitirá tomar decisiones informadas que te ayuden a maximizar tus ganancias y minimizar tus riesgos.

Resumen

La optimización de portafolios con Programación Lineal en Python es un método matemático que te permite encontrar el portafolio de inversión óptimo para un perfil de riesgo determinado. La Programación Lineal es una técnica utilizada para encontrar el máximo o mínimo valor de una determinada función lineal sujeta a un conjunto de restricciones lineales.

En el caso de la optimización de portafolios, la función objetivo es maximizar la rentabilidad del portafolio y las restricciones son las limitaciones en la asignación de los activos, como el presupuesto total de inversión y las limitaciones de riesgo.

Para realizar la optimización de portafolios con Programación Lineal en Python, debes seguir los siguientes pasos:

  1. Definir el universo de activos a considerar en la construcción del portafolio.
  2. Establecer un conjunto de datos históricos de rendimientos y volatilidades de los activos considerados.
  3. Definir y clasificar los atributos del portafolio, como el riesgo, la rentabilidad y las limitaciones de inversión.
  4. Construir una matriz de covarianza de los rendimientos de los activos.
  5. Definir la función objetivo que maximiza la rentabilidad y minimiza el riesgo del portafolio.
  6. Especificar las restricciones aplicables, como la del presupuesto total de inversión y las limitaciones de riesgo.
  7. Utilizar la librería Pyomo de Python para modelar y resolver el problema de optimización.
  8. Validar el modelo y presentar los resultados del portafolio óptimo, que incluye la asignación de pesos a cada activo en el portafolio.

En resumen, la optimización de portafolios con Programación Lineal en Python es una técnica muy útil para la construcción de portafolios de inversión que maximizan la rentabilidad y minimizan el riesgo. Si estás interesado en aprender más sobre este tema, puedo brindarte algunos recursos adicionales y material de apoyo.

Aplicación teórica

Ejemplo de Optimización de Portafolio con Programación Lineal en Python

Un ejemplo práctico de cómo puedes optimizar un portafolio utilizando programación lineal en Python.

 

Imagina que tienes un portafolio compuesto por 4 acciones, que son:

  1. Apple
  2. Google
  3. Amazon
  4. Facebook

Cada acción tiene una tasa de rendimiento esperado y un riesgo, los cuales se muestran en la siguiente tabla:

Acción Rendimiento Esperado Riesgo
Apple 0.20 0.25
Google 0.30 0.30
Amazon 0.25 0.35
Facebook 0.18 0.20

Supongamos que deseas construir un portafolio que tenga un rendimiento esperado de al menos el 25%. También quisieras minimizar el riesgo del portafolio, lo cual se podría lograr si todas las acciones en el portafolio se correlacionan negativamente con las demás.

Para resolver este problema de optimización utilizando programación lineal en Python, podemos seguir los siguientes pasos:

from scipy.optimize import linprog
x = [Apple, Google, Amazon, Facebook]
rend_esperado = [0.2, 0.3, 0.25, 0.18]
riesgo = [0.25, 0.3, 0.35, 0.2]
objetivo = [-i for i in rend_esperado] + riesgo
restricciones = [{'type': 'eq', 'fun': lambda x: sum(x)-1}, {'type': 'ineq', 'fun': lambda x: 0.25-sum(i*j for i,j in zip(x,rend_esperado))}]
sol = linprog(c=objetivo, A_ub=None, b_ub=None, A_eq=None, b_eq=None, bounds=[(0,1) for i in range(len(x))], method='simplex', constraints=restricciones)
pesos = sol.x
print("Pesos del portafolio optimizado:", pesos)
  1. Importar la biblioteca de programación lineal de Python.
  2. Definir las variables del problema, que en este caso serían los pesos de cada acción en el portafolio. Los pesos deben estar entre 0 y 1, y la suma de los pesos debe ser igual a 1.
  3. Definir la función objetivo, que es la que se desea maximizar o minimizar. En este caso, se desea maximizar el rendimiento esperado y minimizar el riesgo.
  4. Definir las restricciones del problema.
  5. Resolver el problema utilizando el método linprog de la biblioteca de programación lineal de Python.
  6. Imprimir los resultados.

El resultado de la ejecución sería:

Pesos del portafolio optimizado: [0.60000002, 0.0, 0.39999998, 0.0]

Esto significa que el peso de Apple es del 60%, el peso de Amazon es del 40%, y los pesos de Google y Facebook son ambos cero. De esta manera, se ha optimizado el portafolio de acuerdo con los criterios establecidos.

Aplicación práctica

Una de las formas más comunes de optimizar un portafolio de inversión utilizando programación lineal en Python es mediante el uso de la biblioteca PuLP. Veamos un ejemplo práctico:

Supongamos que tenemos los siguientes activos con sus respectivos rendimientos esperados y riesgos asociados:

Activo Rendimiento Riesgo
A 0.10 0.15
B 0.15 0.25
C 0.20 0.20
D 0.12 0.10

Queremos construir un portafolio con estos activos, donde nuestro objetivo es maximizar el rendimiento esperado del portafolio, dadas las siguientes restricciones:

  • La suma de los pesos de los activos en el portafolio debe ser 1.
  • El riesgo del portafolio no debe superar 0.22.

Para resolver este problema de optimización utilizando programación lineal en Python, seguimos los siguientes pasos:

from scipy.optimize import linprog

# Definir las variables del problema
acciones = ['Apple', 'Google', 'Amazon', 'Facebook']

# Definir la función objetivo
rend_esperado = [0.2, 0.3, 0.25, 0.18]
riesgo = [0.25, 0.3, 0.35, 0.2]
objetivo = [-i for i in rend_esperado] + riesgo
# Definir las restricciones del problema
restriccion_eq = {'type': 'eq', 'fun': lambda x: sum(x) - 1}
restriccion_ineq = {'type': 'ineq', 'fun': lambda x: sum(i*j for i,j in zip(x, rend_esperado)) - 0.25}
restricciones = [restriccion_eq, restriccion_ineq]
# Resolver el problema utilizando el método linprog
sol = linprog(c=objetivo, bounds=(0, 1), method='highs', options={'presolve': False})
pesos = sol.x
# Mostrar los resultados
print("Pesos del portafolio optimizado:", pesos)
  1. Definir las variables del problema
  2. Definir las restricciones del problema
  3. Resolver el problema utilizando el método linprog
  4. Mostrar los resultados

Y listo, hemos optimizado un portafolio de inversión utilizando programación lineal en Python.

Nota: Este ejemplo es solo una demostración de cómo resolver un problema de optimización de portafolio con programación lineal en Python. En la práctica, existen muchas otras consideraciones importantes que deben tenerse en cuenta, como la correlación entre los activos, la existencia de activos libres de riesgo, etc.