algoritmos simheurísticos para la optimización del crédito...

187
1 Universitat Rovira i Virgili - Universitat Oberta de Catalunya Máster en Ingeniería Computacional y Matemática Algoritmos Simheurísticos para Optimizar el Crédito Comercial en PYMEs Trabajo Final de Máster Autor : Director as: Juan Felici Ferrís D.ª Laura Calvet Liñán Dr.ª Eva Vallada Regalado Valencia - 7 de julio de 2017

Upload: ledang

Post on 17-Jun-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1

Universitat Rovira i Virgili - Universitat Oberta deCatalunya

Máster en Ingeniería Computacional y Matemática

Algoritmos Simheurísticos paraOptimizar el Crédito Comercial

en PYMEs

Trabajo Final de Máster

Autor: Directoras:Juan Felici Ferrís D.ª Laura Calvet Liñán

Dr.ª Eva Vallada Regalado

Valencia - 7 de julio de 2017

Page 2: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos
Page 3: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Agradecimientos

Quisiera dar las gracias a las directoras de este trabajo: D.ª Laura Cal-vet Liñán y Dr.ª Eva Vallada Regalado, por el amable trato que me handispensado y su disposición total para ayudarme.

Gracias a mi familia y amigos por su apoyo incondicional desde el inicio.

I

Page 4: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

II

Page 5: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Resumen

El crédito comercial es un acuerdo, entre proveedor y cliente, que per-mite el aplazamiento del pago de una compraventa de bienes o prestación deservicios. Esta forma de financiación es de gran relevancia para las PYMEs,sobre todo en periodos de recesión. La concesión de crédito comercial, sinembargo, conlleva asumir riesgos debido a la exposición al impago. Una delas estrategias para gestionar este riesgo es el uso de métodos cuantitativos.

En el marco de la gestión del riesgo, este trabajo desarrolla un sistemade apoyo a las decisiones, de código abierto, que permite a las PYMEs de-terminar la cantidad y el periodo de crédito comercial que deben concedera cada cliente. La elaboración de esta herramienta se ha realizado en trespartes: definición del modelo de riesgo, diseño del algoritmo de resolución eimplementación computacional.

El modelo de riesgo empleado está basado en la aproximación por portafo-lio. Esta forma de abordar el problema consiste en considerar el conjunto deinversiones como un todo, en contraposición a la evaluación transacción atransacción.

La estrategia empleada para la optimización del portafolio es el uso desimheurísticas. Se trata de algoritmos de optimización que integran técni-cas metaheurísticas con métodos de simulación. El algoritmo propuesto aquícombina la simulación de Monte-Carlo con un algoritmo genético. Mientras lasimulación se encarga de representar la naturaleza estocástica del problema,la técnica metaheurística se ocupa de explorar el espacio de soluciones.

Tras definir el modelo y algoritmo de resolución se implementa el modelocomputacional. Para ello se utiliza el lenguaje de programación Python.

Por último, se realizan una serie de experimentos donde se comparandiferentes algoritmos según su nivel de complejidad y realismo.

Palabras clave: Crédito comercial; PYMEs; Gestión del riesgo; Méto-dos cuantitativos; Optimización de portafolios; Simheurísticas; Simulaciónde Monte-Carlo; Algoritmos genéticos; Python; Optimización dinámica.

III

Page 6: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

IV

Page 7: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Abstract

Trade credit is a commercial agreement that allows a customer to paythe supplier in a deferred way. For many Small and Medium Enterprises(SMEs) trade credit represents a great portion of their assets. Nevertheless,the granting of credit decisions involve assuming risk due to exposure atdefault. A way to manage that risk is to use quantitative methods.

This project develops an open-source Decision Support System (DSS) totackle the risk management process in SMEs, when deciding about the creditconditions that can be offered to their customers. The framework of the DSSconsists of three phases: definition of the model, design of the algorithm andimplementation.

A portfolio approach has been used to configure the model. This waythe group of investments are treated as a whole, instead of considering eachinvestment individually.

The algorithm proposed herein combines Monte-Carlo simulation with agenetic algorithm. While the Monte-Carlo simulation deals with stochasticity,the genetic algorithm deals with the non-linearity, non-convexity nature ofthe problem. This combination of simulation and metaheuristics is calledsimheuristics.

Once the model and algorithm are designed, the Python programminglanguage is employed to implement the DSS.

Finally, a set of experiments are carried out to compare the performanceof different algorithms according to their level of complexity and realism.The lowest level treats the exposure at default as a deterministic variable;the highest level deals with actual data and stochastic exposures at defaultin order to perform a dynamic optimization.

Key words: Trade credit; Small and medium enterprises; Quantitativemethods; Risk Management; Portfolio optimization; Monte-Carlo simulation;Genetic algorithms; Simheuristics; Python; Dynamic optimization.

V

Page 8: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

VI

Page 9: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Índice general

Figuras XIV

Cuadros XVI

Nomenclatura XVIII

Introducción XXObjetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXIVJustificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXVMapa de la memoria . . . . . . . . . . . . . . . . . . . . . . . . . . XXVI

I Gestión del Crédito Comercial 1

1. Crédito comercial 21.1. ¿Qué es el crédito comercial? . . . . . . . . . . . . . . . . . . 21.2. PYMEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41.3. Ejemplos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51.4. Gestión del riesgo . . . . . . . . . . . . . . . . . . . . . . . . . 6

2. Teoría moderna del portafolio 82.1. La frontera eficiente . . . . . . . . . . . . . . . . . . . . . . . 82.2. Rendimiento y riesgo . . . . . . . . . . . . . . . . . . . . . . . 92.3. Diversificación . . . . . . . . . . . . . . . . . . . . . . . . . . . 112.4. Portafolio de N acciones . . . . . . . . . . . . . . . . . . . . . 162.5. Aplicación sobre el TC . . . . . . . . . . . . . . . . . . . . . . 17

VII

Page 10: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.5.1. Distribución de pérdidas . . . . . . . . . . . . . . . . . 172.5.2. Fuentes de incertidumbre . . . . . . . . . . . . . . . . 19

3. Algoritmos simheurísticos 203.1. ¿Qué son los algoritmos simheurísticos? . . . . . . . . . . . . . 203.2. Simulación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223.3. Metaheurística . . . . . . . . . . . . . . . . . . . . . . . . . . 24

3.3.1. Algoritmos genéticos . . . . . . . . . . . . . . . . . . . 24

II Modelo de Diseño 28

4. Modelo conceptual 294.1. TCPOP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

4.1.1. Introducción al problema . . . . . . . . . . . . . . . . 294.1.2. Planteamiento del problema . . . . . . . . . . . . . . . 314.1.3. STCPOP . . . . . . . . . . . . . . . . . . . . . . . . . 334.1.4. DSTCPOP . . . . . . . . . . . . . . . . . . . . . . . . 34

4.2. Modelo matemático . . . . . . . . . . . . . . . . . . . . . . . . 374.2.1. Datos . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

4.2.1.1. Datos requeridos . . . . . . . . . . . . . . . . 374.2.1.2. Obtención de datos . . . . . . . . . . . . . . 39

4.2.2. Definición del modelo . . . . . . . . . . . . . . . . . . 394.2.2.1. Objetivo . . . . . . . . . . . . . . . . . . . . 394.2.2.2. Asunciones . . . . . . . . . . . . . . . . . . . 394.2.2.3. Simplificaciones . . . . . . . . . . . . . . . . 404.2.2.4. Identificación de datos de entrada y salida . . 40

4.2.3. Descripción formal de modelo . . . . . . . . . . . . . . 404.2.4. Representación del modelo . . . . . . . . . . . . . . . . 41

5. Algoritmo de resolución 425.1. Metaheurística . . . . . . . . . . . . . . . . . . . . . . . . . . 43

5.1.1. TCPOP . . . . . . . . . . . . . . . . . . . . . . . . . . 435.2. Simheurística . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

VIII

Page 11: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.2.1. STCPOP . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.2. DSTCPOP . . . . . . . . . . . . . . . . . . . . . . . . 46

III Modelo Computacional 49

6. Implementación del sistema 506.1. Librerías . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 546.2. Modelo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

6.2.1. Cargar datos . . . . . . . . . . . . . . . . . . . . . . . 556.2.2. Generación del portafolio . . . . . . . . . . . . . . . . 56

6.3. Algoritmo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 586.3.1. Individuo . . . . . . . . . . . . . . . . . . . . . . . . . 586.3.2. Población . . . . . . . . . . . . . . . . . . . . . . . . . 606.3.3. Algoritmo genético . . . . . . . . . . . . . . . . . . . . 626.3.4. Funciones generales . . . . . . . . . . . . . . . . . . . . 67

6.3.4.1. TCPOP . . . . . . . . . . . . . . . . . . . . . 676.3.4.2. STCPOP . . . . . . . . . . . . . . . . . . . 696.3.4.3. DSTCPOP . . . . . . . . . . . . . . . . . . . 71

6.4. Main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 716.5. Ejecución del DSS . . . . . . . . . . . . . . . . . . . . . . . . 736.6. Ejecución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

IV Experimentos y Análisis 75

7. Diseño e implementación de experimentos 767.1. Diseño . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767.2. Implementación . . . . . . . . . . . . . . . . . . . . . . . . . . 79

7.2.1. Generación del conjunto de datos . . . . . . . . . . . . 797.2.1.1. Probabilidad de impago y su volatilidad . . . 807.2.1.2. Exposición en impago . . . . . . . . . . . . . 817.2.1.3. Pertenencia a sectores . . . . . . . . . . . . . 857.2.1.4. Pérdida dado el impago . . . . . . . . . . . . 86

IX

Page 12: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2.1.5. Beneficio neto . . . . . . . . . . . . . . . . . 877.2.1.6. Evento de impago . . . . . . . . . . . . . . . 87

7.2.2. Procesamiento del conjunto de datos . . . . . . . . . . 907.2.3. Generación de informe de resultados . . . . . . . . . . 91

8. Análisis de resultados 938.1. Entorno y condiciones de ejecución . . . . . . . . . . . . . . . 93

8.1.1. Los datos de entrada de simulación . . . . . . . . . . . 938.1.2. Plataforma de ejecución . . . . . . . . . . . . . . . . . 94

8.2. Informes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 948.2.1. Informe numéricos . . . . . . . . . . . . . . . . . . . . 948.2.2. Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . 96

9. Conclusiones y trabajo futuro 989.1. Conclusiones técnicas . . . . . . . . . . . . . . . . . . . . . . . 989.2. Conclusiones personales . . . . . . . . . . . . . . . . . . . . . 999.3. Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Bibliografía 103

Apéndices 106A. Código del DSS (DSS.py) . . . . . . . . . . . . . . . . . . . . 106B. Código generador de datos (DataGen.py) . . . . . . . . . . . . 147

X

Page 13: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

XI

Page 14: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Índice de figuras

0.0.1.Esquema del problema de optimización del crédito comercial. . XXII

1.1.1.Tipos de pago en función del tiempo. . . . . . . . . . . . . . . 3

2.1.1.Conjunto de posibles portafolios y frontera eficiente. . . . . . . 92.3.1.En verde los posibles portafolios mediante combinación de la

acción 1 y acción 2 con ρ = 1. . . . . . . . . . . . . . . . . . . 122.3.2.En verde los posibles portafolios mediante combinación de la

acción 1 y acción 2 con ρ = 0. . . . . . . . . . . . . . . . . . . 132.3.3.En verde los posibles portafolios mediante combinación de la

acción 1 y acción 2 con ρ = −1. . . . . . . . . . . . . . . . . . 142.3.4.El riesgo del portafolio se aproxima a la media de las covari-

anzas según aumenta el número de activos. . . . . . . . . . . . 152.4.1.Representación gráfica de 9 acciones. . . . . . . . . . . . . . . 162.5.1.Típica distribución del retorno para el crédito comercial, según

su función de densidad de probabilidad . . . . . . . . . . . . . 182.5.2.Típica distribución de las pérdidas para el crédito comercial . 19

3.1.1.Esquema del tratamiento de un problema con algoritmos simheurís-ticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

3.2.1.El método de Monte Carlo toma la distribución de probabili-dad de un conjunto de variables como parámetros de entrada. 23

3.3.1.Procedimiento de un algoritmo genético. . . . . . . . . . . . . 25

4.1.1.Ejemplo de distribución de tres clientes en la línea del tiempo. 31

XII

Page 15: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1.2.Estimación determinista del crédito comercial que pedirán tresclientes en el periodo. . . . . . . . . . . . . . . . . . . . . . . . 33

4.1.3.Estimación estocástica del crédito comercial que pedirán tresclientes en el periodo. . . . . . . . . . . . . . . . . . . . . . . . 34

4.1.4.Cuando llega el primer cliente el crédito comercial requeridoes un valor determinado. . . . . . . . . . . . . . . . . . . . . . 35

4.1.5.Para el segundo cliente existe la restricción, en el portafo-lio, del crédito otorgado al primer cliente. Además el segundocliente emite un requerimiento de crédito comercial determi-nado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

4.1.6.Cuando llega el último cliente del periodo ya hemos toma-do decisiones sobre el crédito comercial para los anterioresclientes, esto se convierte en una restricción en nuestro portafo-lio y afecta a la cantidad de crédito comercial que recibirá elúltimo cliente. . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

6.0.1.Diagrama de flujo del DSS. . . . . . . . . . . . . . . . . . . . 536.6.1.Ejemplo de ejecución del DSS sobre la variante estocástica. . . 746.6.2.Ejemplo de la salida al ejecutar el DSS para 5 clientes. . . . . 74

7.1.1.La experimentación se realiza en dos escenarios: baja y al-ta volatilidad. Existe una comparación a dos niveles: entreaproximaciones (individual y portafolio) y entre los algorit-mos pertenecientes a cada aproximación. . . . . . . . . . . . . 78

7.2.1.Diagrama de flujo del test. . . . . . . . . . . . . . . . . . . . . 797.2.2.Ilustración de la correlación entre la exposición en impago (eje

x) y la probabilidad de impago (eje y). . . . . . . . . . . . . . 827.2.3.Histogramas correspondientes a datos que siguen una distribu-

ción normal (arriba) y distribución uniforme (abajo). . . . . . 837.2.4.Ejecución del programa DataTest.py desde la terminal. . . . . 897.2.5.Directorio Test donde están contenidos los archivos .csv para

ejecutar las pruebas. . . . . . . . . . . . . . . . . . . . . . . . 897.2.6.Comando python que ejecuta el test programado sobre el di-

rectorio Test. . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

XIII

Page 16: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2.7.Informe report.html y diagramas generados tras la ejecucióndel test. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

8.2.1.Diagrama Box-Whisker en el escenario de baja volatilidad. . . 958.2.2.Diagrama Box-Whisker en el escenario de alta volatilidad. . . 96

XIV

Page 17: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

XV

Page 18: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Índice de cuadros

8.1. Medidas del beneficio obtenido en un escenario de baja volatil-idad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

8.2. Medidas del beneficio obtenido en un escenario de alta volatil-idad. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

XVI

Page 19: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

XVII

Page 20: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Nomenclatura

B2B Business-to-Business

DE Default Event

DSS Decision Support System

DSTCPOP Dynamic Stochastic Trade Credit Portfolio Optimization Prob-lem

EAD Exposure At Default

GRASP Greedy Randomized Adaptive Search Procedure

ILS Iterated Local Search

LGD Loss Given Default

PD Probability fo Default

PYME Pequeña Y Mediana Empresa

SME Small and Medium Enterprise

STCPOP Stochastic Trade Credit Portfolio Optimization Problem

TCPOP Trade Credit Portfolio Optimization Problem

TC Trade Credit

XVIII

Page 21: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

XIX

Page 22: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Introducción

Hoy se puede afirmar con un grado aceptable de certeza que el procesode cosmogénesis se inició hace unos 13.800 millones de años [2]. Duranteeste largo periodo se han originado diferentes y nuevas formas de realidadsecundadas por el principio de causalidad. Tras la formación de la materiasigue la aparición de la vida, primero, y de formas complejas de vida, después.

El proceso de transformación, en los seres vivos, se conoce como evolu-ción biológica. Al carácter progresivo e irreversible de la evolución parece iraparejado el de cerebración creciente, sobre todo evidente en el proceso dehominización. Esta ortogénesis del sistema nervioso implica un aumento enlos niveles de subjetivación, que procura una mayor autonomía funcional ypropicia la aparición de la conciencia refleja. Todo esto hace del ser humanoun individuo más independiente de su entorno, capaz de alterarlo y adaptarloa sus necesidades. Esta capacidad del ser humano, unida al constante procesode humanización, da origen a multitud de sistemas complejos.

Sistemas complejos

Entendemos por sistema un conjunto de elementos que interactúan entresí; podemos diferenciar cuatro clases principales de sistemas [3]:

Sistemas naturales, e.g. la disposición de los cuerpos celestes o el tem-poral de la Tierra.

Sistemas físicos diseñados, e.g. una casa, un coche, una radio, etc.

Sistemas abstractos diseñados, e.g. las matemáticas.

XX

Page 23: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Sistemas de actividad humana, e.g. sistemas políticos, familia, países,etc.

De estos cuatro, los tres últimos requieren la intervención humana.Muchas situaciones, sin embargo, no pueden quedar definidas por un sólo

tipo de sistemas. Es el caso, por ejemplo, de bancos o supermercados, dondetenemos sistemas de actividad humana a la par que sistemas físicos diseñados;nos referimos a éstos como sistemas de operaciones [22].

Sistemas de operaciones

La presencia de los sistemas de operaciones es ubicua en la sociedadmoderna, y creciente conforme avanza nuestra tecnología; podemos tomarcomo ejemplo los sistemas de telecomunicaciones, los sistemas intermodalesde transporte o las cadenas de abastecimiento de las empresas. La naturalezade estos sistemas [15] queda definida por su:

Variabilidad: tanto cambios predecibles como impredecibles suelen in-tervenir en gran parte de los sistemas de operaciones.

Interconectividad: los cambios en algún componente del sistema afectanirremediablemente a los otros componentes del sistema.

Complejidad: podemos diferenciar dos tipos de complejidad; compleji-dad combinatoria y complejidad dinámica. La primera hace referenciaa el aumento más que lineal del espacio de soluciones al aumentar eltamaño del problema. La segunda se da con los cambios, a lo largo deltiempo, en la interconectividad de los componentes del sistema [17].

Estas propiedades suponen un reto a la hora de estudiar y entender el compor-tamiento de los sistemas de operaciones. Con ese fin, y para generar solucionesque permitan un uso eficiente de los sistemas, se han desarrollado diversasherramientas que, junto con la capacidad computacional actual, conducen aresultados satisfactorios. Es el caso de los métodos de simulación y el desar-rollo de algoritmos complejos.

XXI

Page 24: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Optimización de sistemas

En términos generales, este trabajo se enmarca en la optimización de unsistema complejo mediante las herramientas antes mencionadas; en particu-lar, se pretende crear una herramienta que haga uso de algoritmos simheurís-ticos para optimizar la gestión del crédito comercial, aspecto de relevanteimportancia en el buen hacer y rendimiento de las PYMEs.1

Aproximación al problema

En este trabajo tratamos el problema de la gestión del crédito comercialen PYMEs desde el punto de vista del prestamista. Es decir, asumimos quesomos responsables de las decisiones de crédito comercial de una PYME, yqueremos saber qué cantidad y por cuánto tiempo debemos ofrecer créditocomercial a nuestros clientes (ver Figura 0.0.1). La decisión debe estar basadaen la maximización de los beneficios esperados y la minimización de riesgos.

Figura 0.0.1: Esquema del problema de optimización del crédito comercial.Fuente: Elaboración propia

Para llevar a cabo esta tarea debemos conocer la calificación de las em-presas por su nivel de riesgo. Asumimos, en este trabajo, que el nivel de

1El acrónimo PYME hace referencia a la pequeña y medianas empresa.

XXII

Page 25: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

riesgo de las PYMEs vendrá dado por técnicas específicas para evaluar estetipo de empresas, desarrolladas por Terrádez en [19]. Se pretende modelar elproblema mediante una función objetivo que nos relacione todas las variablesimplicadas en el nivel riesgo-beneficio.

La forma, propuesta aquí, de abordar el problema, es comenzar con elmodelo más simple para ir aumentando el nivel de complejidad gradualmente[13].Así pues, se realiza, primero, un planteamiento determinista del problema,luego estocástico y por último dinámico. En el Capítulo 4 se revisa con mayordetalle las especificaciones del problema.

XXIII

Page 26: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

ObjetivosEste trabajo tiene por objeto la elaboración, en código abierto, de un

sistema de apoyo a las decisiones23 que pueda ser empleado por el responsablede una PYME en el proceso de toma de decisiones sobre la cantidad y fechade vencimiento del crédito comercial que puede ofrecer a sus clientes. Setrata de una herramienta que permite una evaluación cuantitativa de lascaracterísticas del crédito comercial, y que ofrece un soporte sobre el quebasar las decisiones. Con el fin mencionado se llevarán a cabo las siguientetareas:

Estudio teórico de los términos, herramientas y aspectos relevantes deltrabajo.

Desarrollo del modelo conceptual del problema; requiere el estudio, ladescripción y la simplificación del problema real.

Diseño del algoritmo; desarrollo del método de resolución e integracióncon el modelo conceptual para formar un modelo de diseño que seafácilmente convertible en código fuente.

Implementación del sistema; se refiere a la codificación del modelo dediseño en un modelo computacional.

Diseño de experimentos y análisis de los resultados; evaluación del sis-tema.

2DSS por sus siglas en inglés Decision Support System.3Podemos definir un DDS como un sistema basado en computador que, mediante el

uso de modelos y algoritmos, procesa información para asistir al encargado en su toma dedecisiones.

XXIV

Page 27: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

JustificaciónVarios son los motivos que justifican que, en periodos de recesión, las

condiciones de acceso a financiación se endurezcan. Este hecho afecta espe-cialmente a las PYMEs, debido a su menor capacidad de negociación y asu complicada evaluación por parte de las entidades financieras. El créditocomercial surge como una alternativa a estas dificultades.

Este trabajo se enmarca en la necesidad, por parte de las PYMEs, decontar con herramientas cuantitativas que les permitan una mejor gestión delcrédito comercial. Esta gestión es crucial en el rendimiento y salud financierade las empresas, ya que el TC4 suele representar un alto porcentaje de losactivos de las PYMEs. No obstante, este problema no se ha tratado conprofundidad en la literatura científica debido a su complejidad en términos deelevado grado de información asimétrica, diversidad de escenarios y rapidezen cambios de solvencia.

4TC hace referencia al crédito comercial, por sus siglas en inglés Trade Credit.

XXV

Page 28: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Mapa de la memoriaEl trabajo está divido en cuatro partes, según la naturaleza de su objeto

de estudio:

Parte I: Teórica.

Parte II: Matemática.

Parte III: Informática.

Parte IV: Práctica.

La linea temporal del trabajo muestra la relación de dependencia unívo-ca entre las partes. La transición de teoría a práctica se produce de formaescalonada, empleando primero las matemáticas y luego la informática.

A continuación se detalla el nombre de cada parte así como el contenidode los capítulos que la componen:

Parte I: Gestión del crédito comercial

Capítulo 1. Crédito comercial: se presenta la definición de créditocomercial, su impacto en las PYMEs y las estrategias para su gestión.

Capítulo 2. Teoría moderna del portafolio: se explican los fundamentosde la teoría moderna del portafolio y qué papel desempeña en la gestióndel crédito comercial.

Capítulo 3. Algoritmos simheurísticos: revisión teórica de los algo-ritmos simheurísticos y de las partes que lo componen: simulación ymetaheurística.

Parte II: Modelo de Diseño

Capítulo 4. Modelo conceptual: tras la comprensión del problema sedetermina su representación matemática. Para ello se identifican lasvariables de entrada y salida, al mismo tiempo se determina el contenidodel modelo, la función objetivo y el nivel de detalle. En este paso seidentifican las simplificaciones que tomamos y su justificación.

XXVI

Page 29: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 5. Algoritmo de resolución: este capítulo detalla la construc-ción de las técnicas de resolución que se emplean sobre el modelo. Unaprimera parte está dedicada a la elaboración de un algoritmo genéticoque es tratado como primera aproximación al problema; en la segundaparte se introducen técnicas de simulación junto a metaheurísticas; enla tercera parte se aplica el algoritmo simheurístico de forma dinámica.

Parte III: Modelo Computacional

Capítulo 6. Implementación del sistema: en este punto se realiza lacodificación del modelo de diseño, es decir, su representación específicaen software. Para la consecución de esta tarea se emplea el lenguaje deprogramación Python. El capítulo se divide en secciones haciendo ref-erencia al modelo conceptual, algoritmo de resolución y otros elementosdel código.

Parte IV: Experimentos y Análisis

Capítulo 7. Diseño e implementación de experimentos: se describen yaplican experimentos sobre el sistema desarrollado. Se realizan pruebascon datos simulados sobre diferentes tipos de algoritmos y modelos.Por un lado se compara el modelo individual con el de portafolio; porotro lado se compara el desempeño de las diferentes aproximaciones enportafolio: determinista, estocástica y dinámica.

Capítulo 8. Análisis de resultados: se presentan de forma clara losresultados de los experimentos y se extrae su significado.

Capítulo 9. Conclusiones y trabajo futuro: en este capítulo se expre-san las conclusiones técnicas y personales del trabajo, se compartenreflexiones y se realiza un balance de la consecución de los objetivospropuestos. Además, se proponen varias lineas de estudio sobre las queseguir desarrollando el trabajo.

XXVII

Page 30: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Parte I

Gestión del Crédito Comercial

1

Page 31: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 1

Crédito comercial

Antes de comenzar la elaboración del DSS debemos entender qué es elcrédito comercial y qué papel desempeña en las PYMEs.

1.1. ¿Qué es el crédito comercial?El concepto que nos ocupa en este capítulo es de uso extendido en el

ámbito comercial y de negocios; se trata del crédito comercial, y lo podemosdefinir como sigue:

El crédito comercial [21] es un acuerdo entre proveedor y cliente, quepermite el aplazamiento del pago de una compraventa de bienes o de unaprestación de servicios.

En el crédito comercial, por tanto, el proveedor actúa como prestamista yel cliente como prestatario. Ambos deben estipular, en el contrato, un plazode pago que el cliente debe cumplir, de lo contrario, el proveedor podríaemprender acciones legales.

Las condiciones de dicho acuerdo [23] suelen establecerse en términos deplazo neto de pago y, posiblemente, la aplicación de un determinado descuen-to si el pago se realiza en un plazo de tiempo mucho más corto del acordado(ver Figura 1.1.1). Así pues, ((2-10 net 30)) haría referencia a un plazo neto

2

Page 32: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1.1. DEFINICIÓN CAPÍTULO 1. CRÉDITO COMERCIAL

de pago de 30 días, con un descuento del 2% si el pago se realizara en los 10primeros días.

Figura 1.1.1: Tipos de pago en función del tiempo.Fuente: Elaboración propia

Las condiciones del crédito comercial vendrán determinadas por la relaciónde poder entre las empresas implicadas y su grado de confianza. La capaci-dad de negociación de cada empresa viene dada por diversos factores, comoel nivel de facturación, historial crediticio, etc. Cuanto más solvente y fuertese muestre una empresa mayor capacidad para conseguir acuerdos favorablestiene.

Las principales características del crédito comercial son:

Forma de financiación a corto plazo.

Financiación B2B1.

Permite adquirir una mercancía que, ya vendida, le permite ser pagode la misma al proveedor.

1Business to Business (B2B) es el término utilizado para definir el tipo de transaccionesentre empresas.

3

Page 33: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1.2. PYMES CAPÍTULO 1. CRÉDITO COMERCIAL

1.2. PYMEs y crédito comercialEl crédito comercial puede ser considerado desde dos perspectivas: prestamista

o prestatario. A continuación se detallan los beneficios y perjuicios que tieneel TC en las PYMEs según estas dos perspectivas:

Desde el punto de vista del prestatario:

• Beneficios: en periodos de recesión, el acceso al crédito bancario sereduce por el endurecimiento de las condiciones, sobre todo a lasPYMEs. Para responder a sus necesidades de financiación muchashacen uso del crédito comercial. Éste resulta ser un gran recursopara aquellas PYMEs que están iniciando su negocio y carecende historial crediticio. Además, el crédito comercial favorece larelación de confianza entre empresas y permite al cliente operarcon independencia de la situación de la tesorería.

• Perjuicios: exige un mayor grado de responsabilidad.

Desde el punto de vista del prestamista:

• Beneficios: los beneficios del crédito comercial para las PYMEsson diversos, en primer lugar, dar facilidades de pago a tus clientessupone un incremento en las ventas. Además, favorece una relaciónestable entre proveedor y cliente.

• Perjuicios: las pequeñas y medianas empresas son las más vulnera-bles a los impagos, gastos administrativos de la gestión del crédito,coste de oportunidad, etc.

4

Page 34: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1.3. EJEMPLOS CAPÍTULO 1. CRÉDITO COMERCIAL

1.3. Ejemplos de crédito comercialUn famoso ejemplo de crédito comercial lo protagonizó Steve Jobs y Steve

Wozniak para la venta del Apple I, el primer ordenador de la compañía. Suprimer encargo fueron 50 ordenadores para una tienda local llamada TheByte Shop. Jobs, con el encargo negoció, con el proveedor de componentes,un pedido suficiente para la fabricación de 100 ordenadores, junto con uncrédito comercial de 30 días de plazo. Apple produjo 50 ordenadores en elplazo estipulado, lo que le permitió entregar los ordenadores a The Byte Shop,y con el ingreso se pagó al proveedor de componentes. Así Apple quedó conpiezas adicionales para la fabricación y venta de 50 ordenadores más que lesupondrían un beneficio neto.

No obstante, el crédito comercial no es sólo usado por empresas pequeñasque no tienen acceso a otras fuentes de financiación, como en el caso antescomentado. Las ventajas que ofrece el crédito comercial son explotadas, tam-bién, por grandes empresas, es el caso de Wal-Mart.

La empresa Wal-Mart, el mayor comercio de venta al por menor del mun-do, ha usado el crédito comercial como fuente de financiación por encima delpréstamo bancario [14]; el crédito comercial en Wal-Mart supera 8 veces lacantidad de capital invertido por accionistas. Esta empresa no suele aceptaracuerdos con proveedores sin un crédito comercial de al menos 60 días deplazo, la gran capacidad de negociación de esta empresa le permite obtenercondiciones de crédito comercial muy favorables.

5

Page 35: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1.4. GESTIÓN DEL RIESGO CAPÍTULO 1. CRÉDITO COMERCIAL

1.4. Gestión del riesgo de crédito comercialUna de las grandes cuestiones sobre el crédito comercial es si debería ser

ofrecido o no. Existe siempre riesgo de tener un cliente que incurra en impagode facturas. Eso puede ser devastador especialmente en pequeños negocios.

Para evitar ésto, es imprescindible realizar revisiones de crédito a losclientes, se deben investigar minuciosamente a través de estadísticos comer-ciales o historial de pagos.

La gestión del riesgo es una de las funciones clave de la actividad empre-sarial, se pretende reducir riesgos o transmitirlos a terceros mediante con-tratos con empresas especializadas. Actualmente nos encontramos en unaépoca en la que la toma de decisiones está caracterizada por [10]:

Complejidad del problema.

Incremento del riesgo y la incertidumbre.

Gran impacto de las decisiones.

Alternativas y criterios de conflicto entre decisiones.

Restricciones en los recursos: naturales, humanos, dinero, tiempo, etc.

Importancia de la capacidad de reacción ante eventos dinámicos.

Por estos motivos, la tendencia en el mundo empresarial está marcada por elincremento en el uso de modelos y métodos cuantitativos para el proceso detoma de decisiones, así sucede también para la gestión del crédito comercial.

Cuatro son las etapas de la gestión de crédito comercial de proveedores,que culmina con la concesión o no del crédito comercial al cliente:

1. Análisis de los clientes.

2. Negociación de las condiciones de crédito.

3. Instrumentación.

4. Decisión.

6

Page 36: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

1.4. GESTIÓN DEL RIESGO CAPÍTULO 1. CRÉDITO COMERCIAL

Nunca podremos predecir las consecuencias de una decisión, pero medianteherramientas cuantitativas podemos hacer una evaluación más precisa y ob-jetiva del escenario de riesgo. La concesión de crédito comercial debe serconsiderada una inversión a corto plazo, por ello ha de ser evaluada segúnsu rentabilidad. Podemos tomar diferentes estrategias según el perfil de laempresa: de riesgos flexibles, de riesgo bajo o de riesgo alto.

Los determinantes del riesgo del crédito comercial se pueden resumir en:

Importe del crédito: a mayor importe mayor será el riesgo de la op-eración, pues en caso de impago el perjuicio será muy alto.

Plazo de entrega: el riesgo aumenta al alargar los plazos de entrega,ya que la predicción sobre el estado económico de la empresa será másdifícil. El riesgo sería nulo sólo en caso de realizarse un pago anticipado.

Solvencia del cliente: la solvencia del cliente se cuantifica con modelosestadísticos en los que influyen diversos determinantes.

Medio de pago: transferencia, documento cambiario, etc.

Marco contractual: cláusulas, garantías, arbitraje, etc.

En este trabajo consideraremos únicamente los tres determinantes de mayorpeso, esto es: el importe del crédito, el plazo de entrega y la solvencia delcliente.

7

Page 37: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 2

Teoría moderna del portafolio

La teoría moderna del portafolio fue introducida por el economista HarryMarkowitz en 1952 [9], y establece un marco matemático que permite com-binar de forma óptima los activos de un portafolio. Su aplicación supone, enel portafolio de inversiones, un incremento del rendimiento esperado dadoun nivel de riesgo, o alternativamente, una reducción del riesgo ajustando elrendimiento esperado. El concepto clave de la teoría moderna del portafolioes que el rendimiento esperado y el riesgo de un activo no debe ser consider-ado de forma aislada, sino en el contexto de un portafolio de inversiones.

La teoría moderna del portafolio fue diseñada pensando en la partici-pación de acciones de empresas, en las siguientes secciones veremos comoactúa en ese caso y si puede ser ajustada para la gestión del crédito comer-cial.

2.1. La frontera eficienteUno de los conceptos centrales en la teoría moderna del portafolio es el

de frontera eficiente.La teoría moderna del portafolio está basada en el hecho de que un in-

versor objetivo escogerá un portafolio óptimo para:

1. Maximizar el rendimiento esperado dado un nivel de riesgo.

2. Minimizar el riesgo dado un nivel de rendimiento esperado.

8

Page 38: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.2. RENDIMIENTO Y RIESGO CAPÍTULO 2. PORTAFOLIO

La frontera eficiente es el conjunto de combinaciones de portafolios que per-miten al inversor cumplir uno de esos dos objetivos.

Figura 2.1.1: Conjunto de posibles portafolios y frontera eficiente.Fuente: Elaboración propia

En Figura 2.1.1 podemos ver un conjunto de puntos que representan difer-entes combinaciones de portafolios. Los puntos pintados de verde represen-tan la frontera eficiente, es decir, aquellos portafolios que ofrecen un óptimorendimiento para un riesgo dado o un riesgo mínimo para un rendimientodado.

Por tanto, para obtener un portafolio óptimo debemos movernos sobre lafrontera eficiente, según el nivel de riesgo que estemos dispuestos a asumir.

2.2. Rendimiento esperado y riesgoComo podemos ver en la Figura 2.1.1, para la optimización del portafolio

usamos dos términos: el rendimiento esperado y el riesgo. A continuaciónexplicamos en qué consiste cada uno de ellos:

9

Page 39: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.2. RENDIMIENTO Y RIESGO CAPÍTULO 2. PORTAFOLIO

Rendimiento esperado: es el centro de la distribución de la variablerendimiento. Para la acción i, el rendimiento esperado es µi, que es lamedia de su distribución de rendimiento.

E[Ri] = µi (2.2.1)

Donde,Ri es rendimiento de la acción i-ésima (Adimensional)µi es el rendimiento esperado de la acción i-ésima (Adimensional)

Riesgo: está relacionado con la probabilidad de que no se cumpla elrendimiento esperado. El riesgo suele ser expresado en forma de desviaciónestándar del rendimiento esperado. La desviación estándar es la raízcuadrada de la varianza, que mide la dispersión de la distribución derendimiento. La varianza para la acción i es:

σ2i = E[(E[Ri]−Ri)

2] (2.2.2)

Donde,Ri es rendimiento de la acción i-ésima (Adimensional)σ2i es la varianza de µi (Adimensional)

Caber resaltar que el riesgo no es un concepto bien definido, y puedenusarse otros elementos que lo representen; no obstante, en este trabajo, comohabitualmente se hace en la teoría moderna del portafolio, usamos la varianzay desviación estándar.

10

Page 40: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.3. DIVERSIFICACIÓN CAPÍTULO 2. PORTAFOLIO

2.3. DiversificaciónLa diversificación es una técnica de gestión de riesgo basada en la combi-

nación de diferentes tipos de inversiones en un portafolio. La diversificaciónsupone que la combinación de diferentes acciones produce mayores rendimien-tos y menor riesgo que la consideración de las acciones por separado. Esto sedebe a los diferentes grados de correlación existentes entre los productos deinversión. Como ejemplo, tomaremos en esta sección el caso de un portafoliode dos acciones:

Dado un portafolio formado por la acción 1 y la acción 2, se debe de-terminar el porcentaje de portafolio invertido en cada acción. El porcentajeo peso del portafolio invertido en la acción 1 será w1 y el peso invertido enla acción 2 será w2. Siguiendo la ecuación 2.4.1 el rendimiento esperado delportafolio será:

µP = w1 · µ1 + w2 · µ2

Es decir, el retorno esperado del portafolio será la suma ponderada delretorno esperado de las dos acciones.

En el caso de la varianza del portafolio tenemos, según la ecuación 2.4.2:

σ2P = w1 · w1 · σ11 + w2 · w2 · σ22 + w1 · w2 · σ12 + w2 · w1 · σ21

Donde,σ11 = σ2

1 es la varianza de la acción 1σ22 = σ2

2 es la varianza de la acción 2σ12 = σ21 es la covarianza entre la acción 1 y la acción 2

Por tanto, podemos escribir:

σ2P = w2

1 · σ21 + w2 · σ2

2 + 2 · w1 · w2 · σ12 (2.3.1)

El último termino de la ecuación 2.3.1 hace referencia a la covarianza, este

11

Page 41: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.3. DIVERSIFICACIÓN CAPÍTULO 2. PORTAFOLIO

término lo podemos sustituir por un término más intuitivo, la correlación. Lacorrelación nos resulta más fácil de interpretar porque no depende de escalas,su valor está comprendido en el rango [−1, 1]. La siguiente expresión definela correlación:

ρ =σ12

σ1 · σ2

(2.3.2)

Reescribiendo la ecuación 2.3.1:

σ2P = w2

1 · σ21 + w2 · σ2

2 + 2 · w1 · w2 · ρ · σ1 · σ2 (2.3.3)

Donde ρ ∈ [−1, 1]. Podemos diferenciar ahora tres casos extremos y rep-resentativos:

1. ρ = 1, las acciones están perfectamente correlacionadas positivamente:en este caso no hay efecto de diversificación (ver Figura 2.3.1).

Figura 2.3.1: En verde los posibles portafolios mediante combinación de laacción 1 y acción 2 con ρ = 1.

Fuente: Elaboración propia

12

Page 42: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.3. DIVERSIFICACIÓN CAPÍTULO 2. PORTAFOLIO

2. ρ = 0 las acciones no están correlacionadas: la combinación de accionesgenera un efecto grande de diversificación, pues el último término dela ecuación 2.3.3 será 0, tendremos menos contribuciones a la varianzadel portafolio (ver Figura 2.3.2).

Figura 2.3.2: En verde los posibles portafolios mediante combinación de laacción 1 y acción 2 con ρ = 0.

Fuente: Elaboración propia

13

Page 43: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.3. DIVERSIFICACIÓN CAPÍTULO 2. PORTAFOLIO

3. ρ = −1, las acciones están perfectamente correlacionadas negativa-mente: con estas condiciones el último término de la ecuación2.3.3 esnegativo e igual a la suma de los dos primeros. En este caso se consigueuna varianza cero del portafolio, es decir, no hay riesgo (ver Figura2.3.3).

Figura 2.3.3: En verde los posibles portafolios mediante combinación de laacción 1 y acción 2 con ρ = −1.

Fuente: Elaboración propia

En caso de ser la correlación un valor comprendido entre los expuestos resul-taría en una solución intermedia a las mostradas. Hemos visto el ejemplo deun portafolio de dos acciones, a continuación hablamos sobre los límites dela diversificación cuando aumentamos el número de acciones.

14

Page 44: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.3. DIVERSIFICACIÓN CAPÍTULO 2. PORTAFOLIO

La diversificación en activos no correlacionados supone un incremento enla eficiencia del portafolio, no obstante este rendimiento esta limitado [16].Conforme se van introduciendo un mayor número de activos en el portafolio,el límite de la desviación estándar del portafolio se aproxima a la media delas covarianzas de los activos (ver Figura 2.3.4).

Figura 2.3.4: El riesgo del portafolio se aproxima a la media de las covarianzassegún aumenta el número de activos.

Fuente: Elaboración propia

En la Figura 2.3.4 vemos la presencia de una asíntota sobre el indicador deriesgo. Esta asíntota marca el riesgo sistemático, que es el valor límite al quetiende nuestra medida de riesgo conforme el portafolio contenga más activos.Por otra parte, el riesgo residual, también llamado riesgo diversificable, es elriesgo del que nos podemos desprender mediante la diversificación.

15

Page 45: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.4. PORTAFOLIO DE N ACCIONES CAPÍTULO 2. PORTAFOLIO

2.4. Portafolio de N accionesPodemos representar un conjunto de acciones de la siguiente forma:

Figura 2.4.1: Representación gráfica de 9 acciones.Fuente: Elaboración propia

Las acciones de la Figura 2.4.1 quedan definidas según la localización enel gráfico, en función del rendimiento esperado y la desviación estándar. Siasumimos que el comportamiento del rendimiento esperado para cada acciónsigue una distribución normal, el rendimiento esperado del portafolio seguiráesa misma distribución. Generalizando los conceptos vistos en esta secciónpara un portafolio con N activos, la varianza y el rendimiento esperado sedefinen como sigue:

16

Page 46: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.5. APLICACIÓN SOBRE EL TC CAPÍTULO 2. PORTAFOLIO

Rendimiento esperado del portafolio:

µP =N∑i=1

wi · E[Ri] (2.4.1)

Donde,µP es rendimiento esperado del portafolio (Adimensional)wi es el peso de la acción i-ésima (Adimensional)Ri es rendimiento de la acción i-ésima (Adimensional)

Varianza del portafolio:

σ2P =

N∑i=1

N∑j=1

wiwjσij (2.4.2)

Donde,σP es la varianza del portafolio (Adimensional)wi es el peso de la acción i-ésima (Adimensional)wj es el peso de la acción j-ésima (Adimensional)σij es la covarianza entre la acción i-ésima y la j-ésima (Adimensional)

2.5. Aplicación de la teoría moderna del portafo-lio al crédito comercial

La teoría moderna del portafolio fue desarrollada pensando en la inversiónde acciones. Para la aplicación de esta teoría al crédito comercial debemostener en cuenta, entre otos aspectos, la distribución de pérdidas del créditocomercial y las fuentes de incertidumbre.

2.5.1. La distribución de pérdidas del crédito comercial

En la teoría moderna del portafolio asumimos que el inversor es objetivoy evita el riesgo, de forma que si le son ofrecidos dos portafolios con el mismorendimiento esperado siempre elegirá aquel que suponga un menor riesgo, sinconsiderar otros factores. Esta asunción no supone ningún problema a la horade trasladar la teoría moderna del portafolio al caso del crédito comercial.

17

Page 47: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.5. APLICACIÓN SOBRE EL TC CAPÍTULO 2. PORTAFOLIO

La otra asunción que se realiza en la teoría moderna del portafolio es que elrendimiento esperado de cada activo sigue una distribución normal, es decir,la distribución del rendimiento esperado queda definido completamente porsu media y su desviación estándar. Ésto implica que el rendimiento esperadodel portafolio también seguirá la misma distribución.

En realidad, la distribución del rendimiento esperado de las acciones nosigue una distribución normal, sin embargo suele ser una buena aproximación.En el caso del crédito comercial esta asunción dista de la realidad (ver Figura2.5.1). Por otra parte debemos considerar que, trabajar con las pérdidasesperadas puede resultar más útil para considerar el crédito comercial. Ladistribución de pérdidas no sigue una distribución normal (ver Figura 2.5.2),sino una distribución asimétrica de cola larga. Ésto dificulta el cálculo precisodel valor en riesgo y el déficit esperado en los cuartiles de los extremos [4].

Figura 2.5.1: Típica distribución del retorno para el crédito comercial, segúnsu función de densidad de probabilidad

Fuente: Elaboración propia

18

Page 48: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

2.5. APLICACIÓN SOBRE EL TC CAPÍTULO 2. PORTAFOLIO

Figura 2.5.2: Típica distribución de las pérdidas para el crédito comercialFuente: Elaboración propia

Este es uno de los motivos por los que no podemos emplear exactamenteel modelo desarrollado en la teoría moderna del portafolio. Sin embargo,podemos realizar una adaptación, usando los conceptos de beneficio esperado,riesgo y sobre todo el valor de la diversificación.

2.5.2. Fuentes de incertidumbre

No existe una forma directa de estimar la covarianza de un portafolio decrédito comercial. Ya que la mayoría de clientes no habrá cometido impagosno podemos estimar la covarianza de impagos mediante la colección de datosde un tiempo pasado. Por esta razón es más complicado elaborar modelosde riesgo sobre portafolios de crédito, se deben incluir en el modelo otrosindicadores y se evalúan eventos más inciertos.

Por otra parte, las PYMEs no ofrecen tantas fuentes de información re-specto a su desempeño en contraposición con las empresas que cotizan enla bolsa de valores. Esto hace más difícil encontrar los indicadores que nosmarquen un posible evento de impago.

19

Page 49: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 3

Algoritmos simheurísticos

Se ha explicado, en los capítulos anteriores, qué es el crédito comercial yla importancia de los métodos cuantitativos para su gestión. La herramientacuantitativa usada en este trabajo para la gestión del crédito comercial sebasa en la modelización del problema basándonos en la teoría del portafolioy su optimización empleando algoritmos simheurísticos. En este capítulo seexplica qué son los algoritmos simheurísticos y qué partes lo componen.

3.1. ¿Qué son los algoritmos simheurísticos?En el núcleo de este trabajo se encuentra la aplicación de algoritmos

simheurísticos [6] para resolver el problema que nos ocupa, y que trataremoscon mayor detenimiento en secciones posteriores. Mientras tanto debemostener claro qué conocemos por algoritmos simheurísticos; a continuación seofrece una definición general de este concepto :

Los algoritmos simheurísticos son algoritmos de optimización1 queresultan de la integración de técnicas metaheurísticas con métodos de simu-lación.

1Los algoritmos de optimización son métodos de exploración eficiente del espacio desoluciones de un problema, generalmente complejo, para hallar una solución óptima opseudo-óptima.

20

Page 50: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.1. DEFINICIÓN CAPÍTULO 3. SIMHEURÍSTICAS

El aspecto fundamental de los algoritmos simheurísticos es la combinaciónde simulación con algoritmos avanzados (ver Figura 3.1.1). Veamos porqué:

Simulación: permite modelar la variabilidad impredecible del problema.

Algoritmos avanzados: conducen a una solución pseudo-óptima de prob-lemas complejos.

Figura 3.1.1: Esquema del tratamiento de un problema con algoritmossimheurísticos.

Fuente: Elaboración propia

La simulación es una herramienta de modelado y estudio del compor-tamiento de sistemas, pero no es una herramienta de optimización en sí. Porotra parte, la metaheurística es una técnica no determinista que nos ofrecesoluciones pseudo-óptimas a un problema, pero no tiene en cuenta el com-portamiento estocástico de éste. Ya que la mayoría de sistemas complejospresentan aleatoriedad, es una perspectiva de gran interés tratarlos con unaherramienta como los algoritmos simheurísticos.

21

Page 51: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.2. SIMULACIÓN CAPÍTULO 3. SIMHEURÍSTICAS

3.2. SimulaciónLos modelos de simulación se encuentran en nuestro día a día. Por ejemp-

lo, en las previsiones meteorológicas emitidas por los informativos o en los jue-gos de consola. Pero la simulación no necesita estar basada en computación,también existen simuladores físicos, tómese como ejemplo los coches de radio-control. La simulación se define, del modo más general, como la imitación deun sistema, es decir, replicar o copiar el compartimiento de algo. Atendiendoa esta definición, podemos dividir la simulación según su naturaleza:

Estática: una copia del sistema en un punto del tiempo.

Dinámica: imita el progreso de un sistema en el tiempo.

En este trabajo nos ocupamos de la simulación dinámica, y más concreta-mente la basada en computador.

Como se ha comentado en la introducción de este trabajo los sistemasde operaciones se caracterizan por su variabilidad. En nuestro caso se tratade una variabilidad impredecible, en referencia a que no sabemos con certezaqué clientes harán pedidos en cierto periodo de tiempo, ni sus demandas decrédito comercial. Para emular esta variabilidad es usada la simulación.

Existen una gran variedad de métodos de simulación. Entre los métodosmás usados podemos destacar:

Simulación de eventos discretos: el sistema es representado medianteentidades siguiendo un flujo desde una actividad (representado por unretraso de tiempo). Las actividades son separadas mediante colas. Lascolas se generan cuando una entidad llega más rápido de lo que puedeser procesada en la siguiente actividad.

Dinámica de sistemas: se trata de una simulación continua que rep-resenta el mundo real mediante un conjunto de elementos y bucles derealimentación.

Simulación basada en agentes: representa el mundo real mediante treselemento; agentes, relación entre agentes y relación con entorno. Los

22

Page 52: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.2. SIMULACIÓN CAPÍTULO 3. SIMHEURÍSTICAS

agentes marcan los atributos y comportamiento de los elementos, larelación entre agentes y entornos son normas que deben seguir los ele-mentos.

Simulación de Monte-Carlo [1]: el objetivo de la simulación de MonteCarlo es emular un entorno de riesgo donde las salidas están sujetas acambios (Figura 3.2.1 ).

En este trabajo empleamos únicamente el método de Monte Carlo, que porotra parte es el más usado en el mundo de la modelización debido a su granaplicabilidad y facilidad de uso.

Figura 3.2.1: El método de Monte Carlo toma la distribución de probabilidadde un conjunto de variables como parámetros de entrada.

Fuente: Elaboración propia

La simulación de Monte-Carlo toma el nombre del famoso casino del Prin-cipado de Mónaco ya que, igual que en los juego de azar que en dicho lugar sepractican, los parámetros de salida de la simulación están sujetos a cambiosy probabilidades. Este método representa el mundo real mediante un con-junto de variables representadas por su distribuciones de probabilidad (verFigura 3.2.1 ). Estas variables en forma de distribución se relacionan (medi-ante cierta ecuación) para determinar los parámetros de salida. En la Figura

23

Page 53: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.3. METAHEURÍSTICA CAPÍTULO 3. SIMHEURÍSTICAS

3.2.1 se muestran tres fuentes de variabilidad (X1, X2 y X3) que, combi-nadas en la simulación, usando la función Y , produce una nueva distribuciónde probabilidad P (Y ).

3.3. MetaheurísticaEncontrar soluciones óptimas a numerosos problemas científicos e indus-

triales puede ser computacionalmente intratable. En estas ocasiones nos con-formamos con obtener soluciones “buenas” o pseudo-óptimas, es lo que pre-tende la metaheurística [18].

La metaheurística es el principal subcampo de la optimización estocás-tica [7]. La optimización estocástica es el conjunto de técnicas y algoritmosque contienen cierto grado de aleatoriedad con el fin de encontrar solucionespseudo-óptimas a problemas complejos.

La palabra “heurística” proviene de la antigua palabra griega heuristikein,que significa el arte de descubrir nuevas estrategias. El sufijo meta tambiénproveniente del griego y hace referencia a “más allá” en el sentido de unnivel superior. La metaheurística se aplica cuando la heurística se muestraineficiente para resolver un problema, debido a su naturaleza no convexa.

Entre los algoritmos metaheurísticos podemos destacar los algoritmosgenéticos, por su generalismo y buenos resultados en un amplio abanico deproblemas.

3.3.1. Algoritmos genéticos

¿Cuáles son las características de los problemas que son buenos candidatospara ser resueltos mediante algoritmos genéticos [5]?:

Si el problema es demasiado difícil para ser plasmado en lenguaje deprogramación.

Cuando no está clara la forma de resolver el problema.

Si el problema es dinámico, cambia constantemente.

24

Page 54: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.3. METAHEURÍSTICA CAPÍTULO 3. SIMHEURÍSTICAS

Cuando no es posible explorar todo el espacio de soluciones.

Cuando una solución pseudo-óptima es aceptable.

Los algoritmos genéticos surgen como una emulación del comportamientode los organismos vivos y su evolución. De acuerdo con la teoría evolutiva,los individuos de una población más adaptados a su entorno tienen mayorprobabilidad de sobrevivir y tener descendencia, es lo que se conoce como se-lección natural. Generación tras generación la población estará más adaptadaa su entorno. Con esta idea surgen los algoritmos genéticos, en primer lu-gar se construye una población de individuos (que serán posibles soluciones),y mediante la evaluación de los mismos y la selección de los más aptos seconstruyen generaciones posteriores. Tras un número suficiente de genera-ciones se selecciona la solución más apta, que nos reportará un resultadopseudo-óptimo a nuestro problema.

Podemos resumir el proceso del algoritmo genético en la Figura 3.3.1:

Figura 3.3.1: Procedimiento de un algoritmo genético.Fuente: Elaboración propia

25

Page 55: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.3. METAHEURÍSTICA CAPÍTULO 3. SIMHEURÍSTICAS

Como vemos en la Figura 3.3.1, el proceso es como sigue [5]:

1. El algoritmo genético inicializa la población de posibles soluciones. Estainicialización puede realizarse de forma aleatoria o mediante algunatécnica heurística.

2. El siguiente paso es evaluar los individuos de la población. Ésto lorealizamos a partir de una función de adaptación ((fitness function))que cuantifica el desempeño de cada individuo. En este punto podemosguardar el valor del individuo más adaptado y la media de toda lapoblación.

3. Tras la evaluación, el algoritmo decide si debe continuar o tiene unasolución satisfactoria que cumple con los criterios especificados.

4. En caso de no encontrar una solución satisfactoria se seleccionan losindividuos de la población, a mayor nivel de adaptación mayores prob-abilidades de ser seleccionado.

5. Aplicamos el cruce entre los individuos seleccionados, creando nuevosindividuos que reemplazan a los menos adaptados de la población an-terior, estos nuevos individuos pueden sufrir mutaciones.

6. En este momento se dispone de una nueva población, la evaluamos y elproceso empieza de nuevo. Cuando el algoritmo encuentra una soluciónsatisfactoria el bucle se rompe.

Entre los parámetros que definen un algoritmo genético podemos destacar:

Tasa de cruces: frecuencia con que se aplica el cruce entre individuos.Una mayor tasa de cruce permite la aparición de potenciales soluciones,sin embargo lleva asociada una pérdida de la información inicial de losindividuos.

Tasas de mutación: define la frecuencia en la que se producen muta-ciones en la descendencia de los individuos. La tasa de mutación estarelacionada con una amplia búsqueda en el espacio de soluciones y evitaestancarse en óptimos locales.

26

Page 56: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

3.3. METAHEURÍSTICA CAPÍTULO 3. SIMHEURÍSTICAS

Tamaño de la población: número de individuos en cada generación. Amayor población mayor probabilidad de encontrar un individuo sat-isfactorio, al mismo tiempo se requiere un mayor uso de los recursoscomputacionales.

Un buen balance de estos tres parámetros es importante para el desempeñodel algoritmo genético y deben modificarse según las características del prob-lema que deseemos tratar.

27

Page 57: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Parte II

Modelo de Diseño

28

Page 58: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 4

Modelo conceptual

La elaboración del modelo conceptual se refiere al proceso de abstrac-ción del sistema frente al mundo real. En este proceso de abstracción sedebe desarrollar, primero, la comprensión del problema [15], y luego su rep-resentación mediante un modelo matemático. Además, toda representacióndel mundo real lleva intrínsecamente asociada una simplificación, que debequedar reflejada en el modelo conceptual.

Este capítulo se ha dividido en dos secciones: la primera hace referenciaal problema de optimización del crédito comercial, y se dedica a la compren-sión del problema; la segunda sección trata el modelo matemático, primerodefiniendo las condiciones de contorno y luego su estructura.

4.1. Problema de optimización del crédito com-ercial

4.1.1. Introducción al problema

Como se ha comentado en la Introducción, apartado de Aproximación alproblema (ver Figura 0.0.1), queremos tratar el problema de la gestión delcrédito comercial en PYMEs. Se trata de resolver cuál es la cantidad y elplazo de tiempo que le debemos ofrecer a cada uno de nuestros clientes paramaximizar beneficios y minimizar riesgos. Estamos actuando desde el punto

29

Page 59: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

de vista del prestamista.Este problema ha sido tratado históricamente mediante la estrategia seat-

of-the-pants1 por parte de la dirección de la PYME. Sin embargo, el recientedesarrollo de herramientas cuantitativas, y su buen desempeño en proble-mas de la misma naturaleza, sugiere que se pueden aplicar estas técnicas alproblema del crédito comercial. Algunas de las entidades que elaboran estasherramientas son las agencias de rating, que evalúan la solvencia de las em-presas en función de numerosos factores, relativos tanto a agentes externoscomo específicos de la empresa. No obstante, la evaluación de las PYMEs sevuelve más compleja debido a la información asimétrica existente. Asumimosen este trabajo que la evaluación de solvencia de las PYMEs viene dada porlos métodos descritos en [19].

Se podría pensar que una vez obtenido el nivel de riesgo del crédito comer-cial (extraído del nivel de solvencia de las PYMEs) ya estamos en disposiciónde tomar decisiones sobre su concesión o no a nuestros clientes. De este modo,marcando el nivel de riesgo que estamos dispuestos a asumir y comparán-dolo con el nivel de riesgo de cada empresa, concederemos o no el créditocomercial.

Sin embargo, esta aproximación al problema, transacción a transacción,está lejos de ser la óptima. La gestión basada en la teoría moderna del portafo-lio permite obtener un rendimiento mayor, es decir, permite maximizar losingresos ajustando el riesgo.

Los principios de la teoría moderna del portafolio han sido usados exi-tosamente en la gestión de portafolios de acciones, por esta razón vamos aestudiar su aplicación al crédito comercial. Se pretende crear un portafoliode crédito comercial.

1Seat-of-the-pants: es una expresión anglosajona para referirse al método de tomar lasdecisiones en base a la experiencia e intuición.

30

Page 60: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

4.1.2. Planteamiento del problema

Como se ha comentado en la subsección anterior, en este trabajo plante-mos el problema de la gestión del crédito comercial actuando como prestamis-tas. Desde esta perspectiva debemos identificar la forma de maximizar losbeneficios ajustando el riesgo. La teoría moderna del portafolio ha sido ex-puesta en el Capítulo 2 como modelo de representación de las inversiones.Este modelo se basa en la consideración del conjunto de inversiones comoun todo. No obstante, en nuestro caso, el del crédito comercial, no todos losclientes aparecen en el mismo momento para hacer sus pedidos, y por tan-to no disponemos del conjunto de clientes para elaborar nuestro portafolio.Consideremos como ejemplo que aparecen cinco clientes en nuestra PYMEen el mismo momento. En este caso podemos realizar la valoración de dichasempresas, conocer de forma determinista el valor del crédito comercial querequiere cada una y elaborar nuestro portafolio. En la realidad estas empresasno aparecerán de forma sincronizada (ver Figura 4.1.1), si aparecen, pues apriori no sabemos de forma determinista qué empresas realizarán un pedidoy por cuanto valor.

Figura 4.1.1: Ejemplo de distribución de tres clientes en la línea del tiempo.Fuente: Elaboración propia

Como se muestra en la Figura 4.1.1 los clientes no realizan los pedidosal mismo tiempo, pero se pueden englobar todos ellos en un periodo. Elportafolio lo elaboraremos en base a estos periodos, que podrían ser de un

31

Page 61: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

mes o varios meses. Esto nos obliga a hacer predicciones sobre los clientes quevamos a tener y los pedidos que van a realizar. Esta tarea se puede realizarmediante el uso de datos históricos y estudio de las empresas.

Por otra parte, asumimos que todas las empresas querrán realizar el pagode sus pedidos con crédito comercial, ya que resulta una práctica beneficiosa.

Resumiendo el problema, tenemos un conjunto M de m clientes quequieren pagar sus pedidos con crédito comercial. Para decidir la porción decŕedito comercial que se otorga a cada cliente se crea un portafolio.

Cada cliente tiene como datos:

Exposición en impago: la cantidad de crédito comercial demandadapor cada cliente referente a su pedido. Será una estimación basada endatos históricos.

Probabilidad de impago: calculada del historial de la empresa.

Volatilidad de la probabilidad de impago: medida de variabilidadde la probabilidad de impago.

Beneficio neto: porción del valor del pedido que resulta en beneficiopara la empresa, varía según los productos del pedido.

Pérdida dado el impago: valor esperado de la cantidad expuesta quese pierde si el cliente entra en impago. En nuestro trabajo asumiremosque se pierde toda la cantidad expuesta.

En el planteamiento base se considera la exposición en impago como una esti-mación determinista, es decir consideramos una cantidad de crédito comercialque esperamos que pida el cliente i-ésimo (ver Figura 4.1.2). A continuaciónexplicamos las dos extensiones del planteamiento base particularizando paraun portafolio de periodo trimestral.

32

Page 62: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

Figura 4.1.2: Estimación determinista del crédito comercial que pedirán tresclientes en el periodo.

Fuente: Elaboración propia

4.1.3. Primera extensión - STCPOP

En este caso se considera que, mediante datos históricos y otros métodoscuantitativos, hemos conseguido crear una distribución de probabilidades so-bre la cantidad de crédito comercial que pedirá cada cliente. Nótese que enel caso anterior (TCPOP) utilizamos un único valor como estimación de lacantidad de TC, por tanto pasamos de una estimación de un único valor auna estimación de distribución de valores. Esta estimación se realizará sobreel periodo elegido, en este caso tres meses.

Las distribuciones de probabilidad marcarán la exposición en impago. Setrata, por tanto, de una exposición en impago estocástica (ver Figura 4.1.3).Para tratar la naturaleza estocástica del problema incorporaremos simulaciónde Monte-Carlo a nuestro algoritmo de optimización.

Hay que establecer que forma tiene las funciones de densidad de proba-bilidad para la exposición en impago de los clientes.

33

Page 63: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

Figura 4.1.3: Estimación estocástica del crédito comercial que pedirán tresclientes en el periodo.

Fuente: Elaboración propia

4.1.4. Segunda extensión - DSTCPOP

La segunda extensión trata de asignar la cantidad de crédito comercialconcedido a cada cliente de forma dinámica. Tendremos una estimación delos clientes que vamos a tener en un trimestre, pero hasta que no realiza elprimer cliente el pedido no calculamos la cantidad que éste debe recibir (verFigura 4.1.4). Es decir decidimos la cantidad de cŕedito que le corresponde acada cliente conforme piden el crédito en base a las predicciones de futurospedidos de otros clientes.

34

Page 64: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

Figura 4.1.4: Cuando llega el primer cliente el crédito comercial requerido esun valor determinado.

Fuente: Elaboración propia

Figura 4.1.5: Para el segundo cliente existe la restricción, en el portafolio,del crédito otorgado al primer cliente. Además el segundo cliente emite unrequerimiento de crédito comercial determinado.

Fuente: Elaboración propia

35

Page 65: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.1. TCPOP CAPÍTULO 4. MODELO

Figura 4.1.6: Cuando llega el último cliente del periodo ya hemos tomadodecisiones sobre el crédito comercial para los anteriores clientes, esto se con-vierte en una restricción en nuestro portafolio y afecta a la cantidad de créditocomercial que recibirá el último cliente.

Fuente: Elaboración propia

En primer lugar (ver Figura 4.1.4), cuando viene el primer cliente, ten-dremos una exposición al impago determinista (el primer cliente pide unacantidad de TC concreta) y el resto estocásticas (no sabemos a ciencia ciertacual será la cantidad de TC que pidan los futuros clientes), en este puntootorgamos una cantidad determinada de crédito comercial al primer cliente.

Con la restricción de que no se puede cambiar la cantidad de crédito otor-gado al primer cliente, esperamos al segundo cliente (ver Figura 4.1.5), en estepunto tenemos que la imposición en impago del segundo cliente es determin-ista, mientras que para el tercer cliente tenemos una estimación estocástica.Se vuelve a calcular el portafolio para los tres clientes con la restricción delprimer cliente, y así otorgamos un determinado crédito comercial al segundocliente.

En la Figura 4.1.5 vemos como el portafolio va variando dinámicamente.desde su posición inicial (Figura 4.1.4) Esta forma de proceder, añadiendo larestricción de los créditos concedidos se repite hasta que recibimos todos losclientes (ver Figura 4.1.6).

La idea fundamental de este modo de proceder es que la cantidad de

36

Page 66: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.2. MODELO MATEMÁTICO CAPÍTULO 4. MODELO

crédito comercial que recibe cada cliente no depende únicamente de él, sinode las cantidades de TC concedidas a anteriores clientes, y las prediccionesde TC de futuros clientes.

En esta sección, en resumen, hemos desarrollado tres posibles soluciones anuestro problema según la naturaleza de la variable de exposición en impago(que refleja la cantidad de crédito comercial):

TCPOP: determinista, considerando que sabíamos de antemano todoslos pedidos.

STCPOP: estocástico, desconociendo qué pedidos van a realizar losclientes.

DSTCPOP: dinámico, integrando valores deterministas de la exposi-ción en impago con valores estocásticos (predicciones).

4.2. Modelo del problema de optimización delportafolio de crédito comercial

4.2.1. Datos

Los datos son un aspecto importante en el desarrollo de modelos de sim-ulación. Aunque se haya dedicado mucho esfuerzo al diseño del modelo y sucodificación, si los datos requeridos por éste son erróneos también lo seránlos resultados. En esta sección analizamos qué datos son requeridos por elmodelo y cómo podemos obtenerlos.

4.2.1.1. Datos requeridos

Podemos diferenciar entre tres tipos de datos requeridos [12]:

Datos preliminares: datos básicos para mejorar la comprensión delproblema, necesarios para el desarrollo conceptual.

37

Page 67: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.2. MODELO MATEMÁTICO CAPÍTULO 4. MODELO

Datos para la definición del modelo: necesarios para la codificación delmodelo, son datos que deben formar parte de la implementación delmodelo conceptual.

Datos para la validación del modelo: datos extraídos del mundo realpara comparar los resultados del modelo con el sistema real.

De los tres tipos de datos mencionados, esta sección se centra en los datosrequeridos para la definición del modelo, que son los necesarios para ejecutary testear nuestro modelo. Los datos preliminares no tienen incidencia a lahora de la implementación de experimentos, mientras que los datos parala validación del modelo serán analizados con más detalle en la subsección4.2.1.2.

Datos para la definición del modelo Los datos requeridos para la defini-ción del modelo son:

Exposición en impago: cantidad de crédito comercial demandado porcada cliente.

Probabilidad de impago: métrica que estima la incertidumbre sobre larealización del pago del crédito comercial.

Volatilidad de la probabilidad de impago: medida de variabilidad de laprobabilidad de impago.

Beneficio neto: porción del valor del pedido que resulta en beneficioneto para la empresa.

Pérdida dado el impago: cantidad del pedido que se espera perder si elcliente incurre en impago.

Pertenencia a sector: métrica que indica a qué sector o sectores pertenececada cliente.

Los datos arriba expuestos hacen referencia a cada cliente, y deben de serintroducidos en el modelo para que éste funcione. ¿Cómo podemos obtenerdichos datos? En la siguiente subsección ahondamos en ese tema.

38

Page 68: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.2. MODELO MATEMÁTICO CAPÍTULO 4. MODELO

4.2.1.2. Obtención de datos

Una vez identificados los datos requeridos debemos preocuparnos por suobtención. En referencia a la dificultad de obtención los datos pueden clasi-ficarse en tres categorías:

Disponibles: se puede hacer uso de ellos inmediatamente porque se cono-cen a priori.

No disponibles pero obtenibles: se pueden obtener.

No disponibles y no obtenibles: datos que no es posible obtener, quizásporque el sistema no existe en la vida real.

Para la validación del modelo se necesita disponer de datos referentes al sis-tema real, sin embargo el sistema real no existe. Para solucionar este proble-ma en este trabajo estimaremos los datos. Esta estimación de datos se realizaobteniendo datos de sistemas similares. En este caso se toman los órdenes demagnitud y rangos de los datos existentes en otros problemas de gestión decrédito.

4.2.2. Definición del modelo

4.2.2.1. Objetivo

El modelo es usado para establecer las condiciones de crédito comercialque se debe conceder a cada cliente con el objetivo de minimizar riesgos omaximizar beneficios. Las condiciones de crédito comercial se refieren a lacantidad y el periodo del crédito.

4.2.2.2. Asunciones

El usuario que emplea la herramienta actúa como un inversor objetivo,esto es, intentando maximizar beneficios para un riesgo dado.

Todos los clientes desean pagar todo o el máximo importe de su pedidoen forma de crédito comercial.

39

Page 69: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.2. MODELO MATEMÁTICO CAPÍTULO 4. MODELO

Se conocen los clientes que van a hacer pedidos de forma determinanteen el periodo de tiempo considerado. Una extensión del trabajo seríaintroducir variabilidad en este aspecto.

Las estimaciones deterministas de las exposiciones en impago corre-sponden a los valores más probables de las estimaciones estocásticas.

La concesión del crédito comercial no se realiza en todo o nada, sinoque se puede conceder porciones del crédito comercial requerido por losclientes.

Los estados de impago de los clientes son todo o nada (default modeparadigm), dos estados: incurre en impago o no.

4.2.2.3. Simplificaciones

La pérdida dado el impago se considera total (LGDi = 1): esto es, dadauna exposición en impago, si el cliente incurre en impago perdemos todoel valor de nuestra inversión.

La volatilidad de la probabilidad de impago se considera como la mitadde la probabilidad de impago. Esto se debe a la dificultad de obtenerestos datos y se considera que excede los objetivos del trabajo. Sinembargo conocemos su orden de magnitud y los simulamos como lamitad de la probabilidad de impago.

Sin restricciones en la concesión de crédito comercial para cada clienteo el portafolio completo.

4.2.2.4. Identificación de datos de entrada y salida

4.2.3. Descripción formal de modelo

Retorno esperado:

ERP =n∑

i=1

xi · EADi ·NIi · (1− PDi)− xi · EADi · LGDi · PDi (4.2.1)

40

Page 70: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

4.2. MODELO MATEMÁTICO CAPÍTULO 4. MODELO

Pérdida esperada:

ELP =n∑

i=1

xi · EADi · LGDi · PDi (4.2.2)

Pérdida inesperada:

ULi = EADi ·√

LGD2i · PDi · (1− PDi) + PDi · LGDi · (1− LGDi)/4

(4.2.3)

ULP =n∑

i=1

n∑i=1

ULi · ULj · ρij (4.2.4)

Capital económico:

ECP = ULP − ELP (4.2.5)

RAROC:

RAROCP =ERP

ECP

(4.2.6)

4.2.4. Representación del modelo

Variable de de decisión: vector X = [x1...xn], representa la porción decrédito concedido respecto al requerido por cada cliente

Función objetivo: maximizar el RAROC.

Restricciones: xi ∈ [0, 1], para cada cliente se puede conceder el TCrequerido, parte de él, o nada.

41

Page 71: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 5

Algoritmo de resolución

Llamamos algoritmo de resolución al conjunto de instrucciones que per-miten hallar una solución a un problema.

En el capítulo anterior se han establecido los factores que determinanel problema de gestión del crédito comercial, y las relaciones que entre ellosexisten, generando un modelo. En este modelo se ha elegido como parámetro aoptimizar el RAROC, y como parámetro estocástico la exposición en impago.En este capítulo se exponen las operaciones sistemáticas para hallar unasolución a este problema, la optimización del RAROC de nuestro modelo entres situaciones:

Estimación determinista de la exposición en impago (TCPOP).

Estimación estocástica de la exposición en impago (STCPOP).

Resolución dinámica con estimación estocástica de la exposición enimpago (DSTCPOP).

En el primer caso se emplea una metaheurística: algoritmos genéticos, en elsegundo y tercer caso se emplea una simheurística basada en el algoritmogenético expuesto en primera instancia.

42

Page 72: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.1. METAHEURÍSTICA CAPÍTULO 5. ALGORITMO

5.1. Metaheurística GALa metaheurística nos permite encontrar soluciones pseudo-óptimas a

problemas de naturaleza no convexa. Existe una gran variedad de méto-dos metaheurísticos (ILS, búsqueda tabú, GRASP, etc.), cada uno ofreceun marco más adecuado según el tipo de problema o aplicación que se de-see tratar. Entre los métodos metaheurísticos se encuentran los algoritmosgenéticos, estos se caracterizan por su generalismo, sirven para multitud deaplicaciones. Esta es la mayor de las razones por las que se ha empleado estealgoritmo en la resolución de nuestro problema.

5.1.1. TCPOP

Como se ha comentado en la introducción de este capítulo el proble-ma a tratar se resuelve según tres circunstancias en cuanto a estimación dela exposición en impago de nuestros clientes. En la primera aproximacióntratamos la exposición en impago como una estimación determinista, estoes, consideramos que la exposición en impago de cada cliente será con mayorprobabilidad un valor determinado. En el algoritmo 5.1 se exponen los pasosque sigue nuestro algoritmo genético para resolver esta primera consideracióndel problema.

43

Page 73: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.1. METAHEURÍSTICA CAPÍTULO 5. ALGORITMO

Algoritmo 5.1 Esquema del algoritmo genético empleado en la resolucióndel TCPOP.Entrada: tamaño de la población, longitud del cromosoma, tasa de cruces,tasa de mutación, número en la élite.1: n := 02: Generación de la población inicial P0

3: Evaluación de la población P0

4: Bucle: (desde n = 0 hasta que se cumple la condición de terminación)5: Creación de la élite En en la población Pn

6: Selección de la población Sn = Pn − En

7: Recombinar población Sn (cruzamiento)8: Mutar la población recombinada Sn

9: Creación de la población Pn+1 = Sn + En

10: Incremento de generación n = n+ 111: Evaluación de la poblaciónPn

Salida: individuo mejor adaptado de la población Pn

El algoritmo 5.1 comienza con la inicialización de la población, esta esgenerada de forma aleatoria sabiendo la longitud del cromosoma y el tamañode la población.

Para la evaluación de cada genotipo de la población el algoritmo genéticoutiliza una función que mide su adaptación. Esta función de adaptación esespecífica para cada problema, diseñada acorde a los parámetros que quer-amos optimizar del modelo. En nuestro caso la función de adaptación mideel RAROC de cada individuo, a mayor RAROC mayor adaptación se lesupone. La función de adaptación asigna a cada individuo una calificaciónde su idoneidad, a mayor calificación más probabilidades de sobrevivir tieneel individuo.

El bucle del algoritmo 5.1 hace referencia al proceso de evolución de lapoblación. Generación tras generación la población se va adaptando a lascondiciones subyacentes en la función objetivo. El bucle se compone de lassiguientes acciones:

Creación de élite: los x (número previamente especificado) individuosmejor adaptados sobreviven y pasan a la siguiente generación.

Cruzamiento: los individuos que no están en la élite se recombinan

44

Page 74: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.2. SIMHEURÍSTICA CAPÍTULO 5. ALGORITMO

entre ellos. El cruzamiento se realiza con mayor probabilidad entre losindividuos de un similar nivel de adaptación.

Mutación: a los individuos resultantes del cruzamiento se les aplica lamutación.

5.2. Simheurística: SimGALa simheurística combina métodos de simulación con algoritmo meta-

heurísticos. En esta sección se exponen los dos algoritmos simheurísticos quehemos utilizado en la resolución del STCPOP y DSTCPOP. Estos dos al-goritmos hacen uso del algoritmo genético mostrado en la sección anterior.Dicho algoritmo genético se integra en un entorno de simulación que usa elmétodo de Monte-Carlo. A continuación se exponen los diferentes desarrollossegún la extensión del problema: STCPOP y DSTCPOP.

5.2.1. STCPOP

En este problema empleamos, como estimación de la exposición en im-pago, distribuciones de probabilidad. Las distribuciones de probabilidad sonusadas para generar una matriz de exposiciones en impago (ver algoritmo5.2) en la que cada vector columna corresponde a posibles exposiciones enimpago de un determinado cliente.

45

Page 75: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.2. SIMHEURÍSTICA CAPÍTULO 5. ALGORITMO

Algoritmo 5.2 Esquema de la simheurística empleada en la resolución delSTCPOP.Entrada: tamaño de la población, longitud del cromosoma, tasa de cruces,tasa de mutación, número en la élite, número de simulaciones.1: Generación de la matriz de exposiciones en impago2: Bucle: (desde i = 0 al número de simulaciones)3: n := 04: Generación de la población inicial P0

5: Evaluación de la población P0

6: Bucle: (desde n = 0 hasta condición de terminación)7: Creación de la élite En en la población Pn

8: Selección de la población Sn = Pn − En

9: Recombinar población Sn (cruzamiento)10: Mutar la población recombinada Sn

11: Creación de la población Pn+1 = Sn + En

12: Incremento de generación n = n+ 113: Evaluación de la poblaciónPn

14: Guardar mejor individuo de Pn en viSalida: media de los mejores individuos (en vi)

Como vemos en el algoritmo 5.2 el núcleo no sufre modificaciones respectoal algoritmo 5.1. Este núcleo, correspondiente al algoritmo genético, se repitetantas veces como número de simulaciones haya. En cada repetición se guardala mejor solución para formar una nueva matriz de soluciones. De esta matrizde vectores se extrae el vector medio que tomaremos como solución final.

5.2.2. DSTCPOP

El DSTCPOP es un problema de optimización dinámica, en el que secombinan datos reales y estimaciones que van variando en el tiempo. Paraconstruir el algoritmo de resolución del problema nos apoyamos en el algo-ritmo 5.2. Uno de los aspectos importantes del algoritmo 5.2 es la matrizde exposiciones en impago creada a partir de la simulación. En este nuevoalgoritmo utilizamos también una matriz de exposiciones en impago, esta vezla matriz se recalcula en cada paso y combina datos reales, restricciones yestimaciones estocásticas.

46

Page 76: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.2. SIMHEURÍSTICA CAPÍTULO 5. ALGORITMO

Algoritmo 5.3 Esquema de la simheurística empleada en la resolución delDSTCPOP.Entrada: tamaño de la población, longitud del cromosoma, tasa de cruces,tasa de mutación, número en la élite, número de simulaciones, exposicionesreales1: Inicializar matriz estática M2: Inicializar matriz dinámica D3: Inicializar matriz compuesta C4: Bucle: (desde j = 0 al número de clientes)5: Tomar exposición real del cliente j6: Recalcular matriz estática M7: Recalcular matriz dinámica D8: Recalcular matriz compuesta C9: Bucle: (desde i = 0 hasta número de simulaciones)10: n := 011: Generación de la población inicial P0

12: Evaluación de la población P0

13: Bucle: (desde n = 0 hasta condición de terminación)14: Creación de la élite En en la población Pn

15: Selección de la población Sn = Pn − En

16: Insertar restricciones al cromosoma17: Recombinar población Sn (cruzamiento)18: Mutar la población recombinada Sn

19: Insertar restricciones al cromosoma20: Creación de la población Pn+1 = Sn + En

21: Incremento de generación n = n+ 122: Evaluación de la poblaciónPn

23: Guardar mejor individuo de Pn en vi24: Salida: el primer cromosoma de la media de vectores (en vi)

En el algoritmo 5.3 se implementa una matriz compuesta, que contienelos valores estáticos (representan el pedido real del cliente) y dinámicos. Estamatriz compuesta se usa del mismo modo que en el algoritmo 5.2. Otroaspecto a destacar es la inserción de restricciones en el cromosoma, estoes, para los individuos mezclado y cruzados se fuerza al algoritmo genéticoa trabajar con una parte del cromosoma fijo. Por último podemos ver enalgoritmo 5.3 que los parámetros de salida están integrados en un bucle,es decir, tras introducir el TC requerido por el cliente i-ésimo se calcula la

47

Page 77: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

5.2. SIMHEURÍSTICA CAPÍTULO 5. ALGORITMO

porción concedida y así sucesivamente.

48

Page 78: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Parte III

Modelo Computacional

49

Page 79: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 6

Implementación del sistema

La implementación del sistema se realiza fundamentalmente mediante lacodificación del modelo de diseño, es decir, su conversión en un modelo com-putacional [15]. En términos generales existen tres opciones para desarrollarel modelo computacional: hojas de cálculo, software especializado y lenguajesde programación. Cada uno de estos entornos de desarrollo tiene sus ventajase inconvenientes:

Software especializado: facilidad de uso y de construcción del modelo,sin embargo suele ser costoso económicamente.

Hojas de cálculo: facilidad de uso en aplicaciones poco complejas.

Lenguajes de programación: máxima flexibilidad y rango de aplica-ciones, menor facilidad de uso y de implementación del modelo.

La elección del software empleado depende de la naturaleza de nuestra apli-cación y particularmente de su complejidad.

En nuestro caso la naturaleza del problema es de complejidad alta, yrequiere de diversos métodos de resolución. El software especializado no esuna opción debido a la particularidad del problema, además pretendemoscrear una herramienta de acceso libre. La opción más adecuada para nuestrofin es el uso de lenguajes de programación.

Entre la miríada de lenguajes de programación existentes nos hemos de-cantado por el uso de Python. El lenguaje Python fue creado por Guido van

50

Page 80: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Rossum a finales de la década de los ochenta [11]. Es un lenguaje de muyalto nivel y de uso general, diseñado para ser empleado sobre gran cantidadde aplicaciones. En cuanto al paradigma de programación empleado es im-perativo y orientado a objetos, pero también comparte características de unlenguaje funcional.

Python es un lenguaje semi-interpretado. Para la implementación máscomún (CPython, escrito en C) Python compila el código escrito obteniendoun pseudocódigo máquina (bytecode). Este bytecode se ejecuta sobre un in-térprete instrucción por instrucción. Existen versiones del intérprete Pythonpara la mayor parte de plataformas (Linux, Windows, Mac).

Podemos resumir las características de Python como sigue:

Simplicidad: la sintaxis es similar al lenguaje natural, facilita la legibil-idad del texto y la curva de aprendizaje del lenguaje.

Código abierto: se puede leer, modificar y distribuir su código fuente.Ésta es una de las razones por las que existe una gran comunidad activade desarrolladores que mejoran el lenguaje y sus librerías.

Librerías: la librería estándar de Python es enorme. Es de gran ayu-da para extender las capacidades de los programas y generar docu-mentación.

Orientado a objetos: Python permite la programación orientada a ob-jetos, lo cual facilita la reusabilidad del código.

Interpretado: necesita de un intérprete para ejecutar los programas,esto facilita su portabilidad.

Portable: debido a su naturaleza en código abierto está disponible enmultitud de plataformas.

Todas las características mencionas hacen de Python un lenguaje atractivoque ha sido y es empleado con éxito en multitud de aplicaciones [8].

En el Apéndice A se encuentra el código Python completo del DSS. Esimportante conocer la convención empleada a la hora de realizar los comen-tarios sobre el código del DSS:

51

Page 81: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

#%% : marca el inicio de un bloque, y se separa del inicio de otrosbloques con dos líneas en blanco.

# : marca el inicio de un subbloque, y se separa del inicio de otrossubbloques con una línea en blanco.

“”” : marca el inicio y final de comentarios. los comentarios pueden irdentro de bloques y dentro de subbloques.

Un ejemplo de uso de esta convención en los comentarios sería:

#%% Algoritmo genético"""Esto es un comentario sobre el algoritmo genético"""# Método de cruzamiento."""Esto es un comentario sobre el método de cruzamiento, que

esta a su vez dentro del bloque del algoritmo genético↪→

"""

# Método de mutación.

#%% Importación de módulos

En el código del Apéndice A podemos ver, siguiendo la convención ex-puesta, que existen siete bloques fundamentales:

1. #%% Importar paquetes, módulos y librerías.

2. #%% Cargar datos.

3. #%% Métricas del portafolio.

4. #%% Individuo.

52

Page 82: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

5. #%% Población.

6. #%% Algoritmo genético.

7. #%% Funciones generales.

8. #%% Método principal.

Estos bloques se corresponde con el marco general del DSS. La Figura 6.0.1expone el diagrama de flujo que sigue el sistema:

Figura 6.0.1: Diagrama de flujo del DSS.Fuente: Elaboración propia

53

Page 83: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.1. LIBRERÍAS CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

A continuación se explica la implementación de las piezas de softwareque componen la herramienta de apoyo a las decisiones. Para su elaboraciónse ha empleado ostensiblemente el paradigma de programación orientada aobjetos.

6.1. Importación de módulos, librerías y pa-quetes

Una de las características del lenguaje Python es el gran conjunto demódulos, paquetes y librerías que podemos importar. Se trata de piezas decódigo bien definidas que podemos reutilizar en nuestro proyecto para exten-der las capacidades del código.

Podemos diferenciar entre importación de sistema e importación de ter-ceras partes; la primera hace referencia a los elementos contenidos en lalibrería estándar de Python, la segunda se refiere a código desarrollado porterceras partes que debe ser instalado de forma externa.

Aunque la librería estándar de Python contiene multitud de herramientasútiles, es en las librerías externas donde encontramos gran parte de utilidadescientíficas.

Nuestro sistema emplea cuatro librerías internas y dos externas:

#%% Importar paquetes, módulos y librerías.# 1-Librerías internas:import time, os, optparse, sys# 2-Librerías externas:import pandas as pd, numpy as np

A continuación explicamos de forma esquemática la utilidad de cada li-brería:

Librerías internas:

• sys: otorga acceso a algunas variables y funciones que interactúancon el interpretador.

54

Page 84: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.2. MODELO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

• time: uso de funciones relacionadas con la medición del tiempo.

• optparse: habilita el análisis del texto en el terminal.

• os: uso de funcionalidades que dependen del sistema operativo.

Librerías externas:

• pandas: librería para el tratamiento de datos.

• numpy: paquete fundamental para la computación científica enPython.

6.2. Codificación del modeloEn la codificación del modelo debemos tratar la recepción de los datos

que lo integran y las fórmulas matemáticas que los relacionan. La primeraparte hace referencia a la subsección 6.2.1, la segunda a la subsección 6.2.2

6.2.1. Cargar datos

El primer paso en la construcción del modelo es la importación de datos.El paquete pandas es usado para crear una estructura de datos donde alma-cenar la información referente a nuestros clientes.

Los datos son importados de un archivo CSV que contiene:

Clientes.

Exposiciones al impago.

Probabilidad de impago.

Volatilidad de la probabilidad de impago.

Vector de pertenencia a sectores.

Pérdida dado el impago.

Beneficio neto.

55

Page 85: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.2. MODELO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Siguiendo el paradigma de programación orientada a objetos se crea la claseData, elemento que usaremos para guardar y manipular los datos. Esta claseData tiene como herencia la clase object por defecto:

class Data(object):

Tras definir la clase y su herencia se define su inicialización y atributos.Una parte importante es la creación de la estructura de datos mydata usandoel paquete pandas, que recibe directamente el archivo CSV.

mydata = pd.read_csv(data_file)

En las líneas 96-279 del Anexo A se puede encontrar el código completo.

6.2.2. Generación del portafolio

El portafolio queda determinado por la relación que existe entre los datoscargados, estas relaciones son las métricas del portafolio.

El portafolio se crea como un objeto herencia de la clase Data:

class Portfolio(Data):

Esto implica que la clase Portafolio hereda los atributos de la clase Da-ta. Además se crean una serie de métodos que aplicados sobre un objetoPortafolio para obtener sus métricas:

Retorno esperado:

def expectedReturn(self, individual):return sum([x*e*(1+n)*(1-p) for x,e,n,p in \

zip(individual.getChromosome(), \self.EAD, self.NI, self.PD)])-self.ex ⌋

pectedLoss(individual)↪→

56

Page 86: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.2. MODELO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Pérdida esperada:

def expectedLoss(self, individual):return sum([x*e*l*p for x,e,l,p in

zip(individual.getChromosome(), \↪→

self.EAD, self.LGD, self.PD)])

Pérdida inesperada:

def unexpectedLoss(self, individual):individual_UL =

[x*self.EAD[i]*self.LGD[i]*self.DV[i] forx,i in \

↪→

↪→

zip(individual.getChromosome(),range(self.numberClients))]↪→

UL_p = 0for i in range(self.numberClients):

for j in range(self.numberClients):UL_p += individual_UL[i]*individual_UL[j]\*self.correlations[i][j]

return np.sqrt(UL_p)

Capital económico:

def economicCapital(self, individual):return self.unexpectedLoss(individual)-self.exp ⌋

ectedLoss(individual):↪→

RAROC:

def RAROC(self, individual):return self.expectedReturn(individual)/self.eco ⌋

nomicCapital(individual)↪→

57

Page 87: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

6.3. Codificación del algoritmoEn esta sección se integran las partes del código referentes al algoritmo

de resolución. Estas partes se corresponden con los bloques de código.

6.3.1. Individuo

Un individuo es una posible solución al problema, decimos que un indi-viduo queda representado por su cromosoma. Cada gen del cromosoma es laporción del TC concedido respecto a la demanda del cliente.

El cromosoma viene en forma de vector (e.g. [0,24, 0,43, 0, 0,03, 0,30])donde cada número de la lista corresponde a un cliente. La única restricciónexistente en esta expresión del individuo es:

Cada gen esta comprendido entre los valores 0 y 1.

Esta restricción nos dicen que no podemos conceder más TC del que demandael cliente.

Un individuo se representa en el código como un objeto de la clase Indi-vidual:

class Individual(object):

La inicialización admite un parámetro de entrada, que puede venir definidopor el cromosoma concreto o por su longitud. En caso de especificar su lon-gitud se crea un cromosoma aleatorio de dicha longitud. Su inicialización esla siguiente:

"""Ejemplos-------->>> individual_1 = Individual(3)

>>> individual_2 = Individual([0.43, 0, 0.84])"""

58

Page 88: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

def __init__(self, chromosome):self.chromosome = chromosomeself.fitness = -1if type(self.chromosome) is int:

self.chromosome = range(self.chromosome)for gene in self.chromosome:

self.setGene(gene ,round(np.random.random(),2))↪→

La otra parte que compone la clase Indivudual son sus métodos, que secorresponden con setters y getters. Estos métodos sirven para modificar elcromosoma del individuo y para asignarle la métrica de adaptación. Podemosdiferenciar setters y getters a tres niveles:

A nivel gen:

def setGene(self, offset, gene):self.chromosome[offset] = gene

def getGene(self, offset):return self.chromosome[offset]

A nivel cromosoma:

def getChromosomeLength(self):return len(self.chromosome)

def getChromosome(self):return self.chromosom

Parámetro de adaptación:

def setFitness(self, fitness):self.fitness = fitness

59

Page 89: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

def getFitness(self):return self.fitness

6.3.2. Población

La población es un conjunto de individuos. En un algoritmo genéticola población es remplazada dinámicamente conforme evoluciona, generacióntras generación. La clase que define al individuo se se emplea únicamentepara la creación de la clase que define la población.

Una población quedará definida como un objeto de la clase Population:

class Population(object):

Se inicializa a a partir del tamaño de la población y la longitud de loscromosomas del individuo:

def __init__(self, populationSize, chromosomeLength):"""Ejemplo-------->>> population = Population(1000, 5)"""self.population = range(populationSize)for ind in range(populationSize):

individual = Individual(chromosomeLength)self.population[ind] = individual

Entre los métodos de esta clase podemos diferenciar aquellos que hacenreferencia a los individuos y los que se ocupan de la población en general:

Nivel individuo:

• Extraer el individuo más apto:

60

Page 90: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

def getFittest(self, offset):self.population.sort(key=lambda x:

x.getFitness(), reverse=True)↪→

return self.population[offset]

• Extraer los individuos de la población:

def getIndividuals(self):return self.population

• Modificar individuo

def setIndividual(self, offset, individual):self.population[offset] = individual

• Obtener individuo

def getIndividual(self, offset):return self.population[offset]

Nivel población:

• Tamaño:

def size(self):return len(self.population)

• Modificar parámetro de adaptación de la población:

def setPopulationFitness(self, fitness):self.populationFitness = fitness

• Obtener parámetro de adaptación de la población:

def getPopulationFitness(self):return self.populationFitness

61

Page 91: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

6.3.3. Algoritmo genético

En este sistema se usa un algoritmo genético para explorar el espacio desoluciones del problema. La clase GeneticAlgorithm se define para manejarlas relaciones entre individuos y la dinámica de cambio de la población.

En este bloque del código se define al principio los parámetros que con-figuran el algoritmo genético:

populationSize = 1000mutationRate = 0.01crossoverRate = 0.90elitismCount = 100

La clase GeneticAlgorithm define el algoritmo genético a partir de la lon-gitud de los cromosomas del individuo:

class GeneticAlgorithm(object):

Para su inicialización se crean los siguientes atributos:

def __init__(self, chromosomeLength):"""Ejemplo-------->>> ga = GeneticAlgorithm(5)"""self.populationSize = populationSizeself.chromosomeLength = chromosomeLengthself.mutationRate = mutationRateself.crossoverRate = crossoverRateself.elitismCount = elitismCount

Los métodos implementados en esta clase se corresponde con las diversasfases del algoritmo genético:

62

Page 92: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Inicialización de la población:

• Crea la población 0.

def initializePopulation(self):population = Population(self.populationSize,

self.chromosomeLength)↪→

return population

Cálculo del parámetro de adaptación:

• Calcula el nivel de adaptación de cada individuo. Se correspondecon la función objetivo, el cálculo del RAROC.

def calculateFitness(self, individual, portfolio):fitness = portfolio.RAROC(individual)individual.setFitness(fitness)return fitness

Evaluación de la población:

• Este método recurre al método calculateFitness sobre cada indi-viduo para asignarle un nivel de adaptación. A continuación secalcula la adaptación de la población como conjunto en base a laadaptación de cada individuo.

def evaluatePopulation(self, population, portfolio):populationFitness = 0for individual in population.getIndividuals():

populationFitness +=self.calculateFitness(individual,portfolio)

↪→

↪→

population.setPopulationFitness(populationFitness)

63

Page 93: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Cruzamiento de la población:

• Crea una nueva población resultado de cruzar los individuos.

def crossoverPopulation(self, population):newPopulation = Population(population.size(),se ⌋

lf.chromosomeLength)↪→

for populationIndex in range(population.size()):parent1 =

population.getFittest(populationIndex)↪→

if self.crossoverRate > np.random.random()and populationIndex >= \↪→

self.elitismCount:offspring = Individual(parent1.getChromo ⌋

someLength())↪→

parent2 = self.selectParent(population)for geneIndex in range(parent1.getChromo ⌋

someLength()):↪→

if 0.5 > np.random.random():offspring.setGene(geneIndex,

parent1.\↪→

getGene(geneIndex))else:

offspring.setGene(geneIndex,parent2.\↪→

getGene(geneIndex))newPopulation.setIndividual(populationIndex,

offspring)↪→

else:newPopulation.setIndividual(populationIndex,

parent1)↪→

return newPopulation

64

Page 94: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Mutación de la población:

• Dado la tasa de mutación cada individuo de la nueva poblaciónpuede sufrir algún cambio aleatorio en su cromosoma.

def mutatePopulation(self, population):newPopulation = Population(self.populationSize, ⌋

self.chromosomeLength)↪→

for populationIndex in range(population.size()):individual =

population.getFittest(populationIndex)↪→

for geneIndex inrange(individual.getChromosomeLength()):↪→

if populationIndex > self.elitismCount:if self.mutationRate >

np.random.random():↪→

newGene =round(np.random.random(), 2)↪→

individual.setGene(geneIndex,newGene)↪→

newPopulation.setIndividual(populationIndex,individual)↪→

return newPopulation

Selección de padres:

• Este método es utilizado por la función crossoverPopulation paraseleccionar los individuos que se cruzan.

def selectParent(self, population):individuals = population.getIndividuals()populationFitness =

population.getPopulationFitness()↪→

65

Page 95: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

rouletteWheelPosition =np.random.random()*populationFitness↪→

spinWheel = 0for individual in individuals:

spinWheel += individual.getFitness()if spinWheel >= rouletteWheelPosition:

return individualreturn individuals[population.size()-1]

Condición de terminación:

• La condición de terminación marca el fin del bucle durante elque la población evoluciona. Podemos diferenciar dos formas determinación: por tiempo o por no haber una mejora sustancial delas soluciones.

"""- No hay una mejora sustancial en las solucionestras generación↪→

"""def terminationConditionFitness(self,

fitnessIncrement):↪→

if fitnessIncrement > -0.015:return True

return False

"""- Se espera a la solución un determinado periodo"""def terminationConditionTime(self, startTime,

executionTime):↪→

elapsed = time.time()-startTimeif elapsed >= executionTime*60:

66

Page 96: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

return Truereturn False

6.3.4. Funciones generales

En este trabajo se han desarrollada varias funciones generales, las quetiene mayor interés son las que hacen referencia a la implementación delalgoritmo para resolver le TCPOP, STCPOP y DSTCPOP.

6.3.4.1. TCPOP

La función runTCPOP ejecuta el algoritmo genético sobre los datos delproblema TCPOP. La función se define como sigue:

def runTCPOP(portfolio, excTime):

El primer paso que sigue la función es la de crear un objeto GeneticAl-gorithm dados los datos del portafolio. A este objeto se le asigna el nombrega:

ga = GeneticAlgorithm(portfolio.numberClients)

A continuación se inicializa la población mediante los métodos contenidosen el objeto ga:

generation = 1population = ga.initializePopulation()

La evaluación de la población se realiza del siguiente modo:

ga.evaluatePopulation(population, portfolio)

67

Page 97: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

La última parte de este algoritmo se corresponde con el bucle que com-prueba si se cumple la condición de terminación. En este método se hanimplementado des métodos de terminación, uno por tiempo y otro por noencontrar soluciones sustancialmente mejores a las obtenidas:

if excTime is not None:startTime = time.time()while ga.terminationConditionTime(startTime, excTime)

is not True:↪→

""" Recombinación de la población: """population = ga.crossoverPopulation(population)""" Mutación de la población: """population = ga.mutatePopulation(population)""" Evaluación de la población: """ga.evaluatePopulation(population, portfolio)""" Siguiente generación: """generation += 1

else:fitnessIncrement = None

while ga.terminationConditionFitness(fitnessIncrement)is not True:↪→

fitness_0 = population.getPopulationFitness()""" Recombinación de la población: """population = ga.crossoverPopulation(population)""" Mutación de la población: """population = ga.mutatePopulation(population)""" Evaluación de la población: """ga.evaluatePopulation(population, portfolio)fitnessIncrement = (population.getPopulationFitn ⌋

ess()-fitness_0)/fitness_0↪→

""" Siguiente generación: """generation += 1

return population.getFittest(0).getChromosome()

68

Page 98: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

En el código arriba expuesto también se puede ver las llamadas a losmétodos del algoritmo genético que hacen referencia a la recombinación,mutación y evaluación de la población. Por último, la función devuelve elindividuo mejor adaptado.

6.3.4.2. STCPOP

En este apartado exponemos el código de la función runSTCPOP queejecuta un algoritmo simheurístico sobre el problema STCPOP. La funciónse define como sigue:

def runSTCPOP(portfolio):

Esta función extrae, en primer lugar, las distribuciones de probabilidadque sirven como estimación de la exposición en impago:

disMatrix = portfolio.extractDistributions()

Tras esto se crea una matriz de valores de exposición en impago, que secorresponden con la estimación determinista tomada en cada simulación:

eadMatrix = portfolio.generateEAD(disMatrix)

Se inicializa una matriz donde se guardarán las soluciones para cada sim-ulación:

l = [(portfolio.numberClients)*[0] for i inrange(len(eadMatrix))]↪→

A continuación se crea el algoritmo genético:

ga = GeneticAlgorithm(portfolio.numberClients)

69

Page 99: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.3. ALGORITMO CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

Entramos en el bucle de simulación, donde cada iteración fija el conjuntode exposiciones en impago para los clientes:

for k in range(len(eadMatrix)):portfolio.EAD = eadMatrix[k]

La siguiente parte de código hace referencia al algoritmo genético tratadoen el apartado anterior:

""" Inicialización de la población y generación: """generation = 1population = ga.initializePopulation()"""" Evaluación de la población: """ga.evaluatePopulation(population, portfolio)fitnessIncrement = None

while ga.terminationConditionFitness(fitnessIncrement)is not True:↪→

fitness_0 = population.getPopulationFitness()""" Cruce de la población: """population = ga.crossoverPopulation(population)""" Mutación de la población: """population = ga.mutatePopulation(population)""" Evaluación de la población: """ga.evaluatePopulation(population, portfolio)fitnessIncrement =

(population.getPopulationFitness()\↪→

-fitness_0)/fitness_0

Cuando cumple la condición de terminación se guarda la solución delmejor adaptado en una matriz, donde estará la mejor solución de cada sim-ulación:

l[k] = population.getFittest(0).getChromosome()

70

Page 100: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.4. MAIN CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

El último paso consiste en retornar el vector medio del conjunto de solu-ciones:

""" Obtener los valores medios: """x = zip(*l[:])y = [sum(s) for s in x]z = [n/k for n in y]""" Retornar el vector medio: """return z

6.3.4.3. DSTCPOP

Para la resolución del problema DSTCPOP usamos la función runD-STCPOP:

def runDSTCPOP(portfolio, boolean):

El código de esta función es bastante extenso y se puede revisar en elAnexo A.

6.4. Método principalLa función principal evita que el código sea ejecutado en caso de ser im-

portado como módulo. En esta sección podemos diferenciar dos subbloques:uso de la librería optparse y ejecución de las funciones generales.

Librería optparse:

• Permite al usuario especificar la vertiente del problema que quiereejecutar, si desea establecer un límite de tiempo máximo de eje-cución o si desea realizar un test.

parser = optparse.OptionParser('usage %prog '+\'-e <execution time (minutes)> {-t, -s, -d,

--test} \↪→

71

Page 101: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.4. MAIN CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

{<deterministic datafile>\, <stochastic datafile>, <stochastic datafile>,

<test path directory>}')↪→

parser.add_option('-e', dest = 'excTime', type ='string',\↪→

help = 'specify execution time of the algorithm')parser.add_option('-t', dest = 'detFile', type =

'string',\↪→

help = 'TCPOP, specify deterministic clients datafile')↪→

parser.add_option('-s', dest = 'stoFile', type ='string',\↪→

help = 'STCPOP, specify stochastic clients datafile')↪→

parser.add_option('-d', dest = 'dynFile', type ='string',\↪→

help = 'DSTCPOP, specify stochastic clients datafile')↪→

parser.add_option('--test', dest = 'test', type ='string',\↪→

help = 'specify test directory')(options, args) = parser.parse_args()options_list = [options.detFile, options.dynFile,

options.stoFile, \↪→

options.test]if options_list.count(None) is not 3:

print parser.usageexit(0)n):

Ejecución de funciones:

• Cuando la opción test es llamada el programa ejecuta la funciónrunTest, los resultados, en este caso, serán impresos en un informe

72

Page 102: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.5. EJECUCIÓN DEL DSSCAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

de nombre report.html . Las otras opciones que se pueden llamarhacen referencia a la ejecución de las funciones runTCPOP, run-STCPOP y runDSTCPOP.

ind = options_list2.index(not None)if ind == 3:

""" Test mode: """runTest(options.test)

else:""" Portfolio creation: """portfolio = Portfolio(options_list[ind])if ind == 0:

""" TCPOP problem: """sol = runTCPOP(portfolio, options.excTime)

elif ind == 2:""" STCPOP problem: """sol = runSTCPOP(portfolio)

else:""" DSTCPOP problem: """sol = runDSTCPOP(portfolio, True)

""" Printing results on the terminal: """reportResults(portfolio, sol)

6.5. Ejecución del DSS

6.6. Ejecución del DSSEn el comando de ejecución del DSS se debe especificar para qué tipo

de problema es (TCPOP, STCPOP, DSTCPOP). La sintaxis del argumentopara llamar el programa con el comando python es de la siguiente forma:

73

Page 103: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

6.6. EJECUCIÓN CAPÍTULO 6. IMPLEMENTACIÓN DEL DSS

pythonDSS.py − {t, s, d} < {TCPOP, STCPOP,DSTCPOP} >

Así pues, un ejemplo de llamada para la resolución de la variante estocás-tica sería:

Figura 6.6.1: Ejemplo de ejecución del DSS sobre la variante estocástica.Fuente: Elaboración propia

La salida ofrecería los datos sobre las condiciones del crédito comercialde la siguiente forma:

Figura 6.6.2: Ejemplo de la salida al ejecutar el DSS para 5 clientes.Fuente: Elaboración propia

74

Page 104: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Parte IV

Experimentos y Análisis

75

Page 105: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 7

Diseño e implementación deexperimentos

7.1. Diseño de experimentosCon el modelo computacional desarrollado es hora de comprobar su fun-

cionamiento y realizar la experimentación práctica.Hemos visto que para la resolución del problema de gestión del crédito

comercial se han desarrollado tres algoritmos, tres diseños alternativos:

TCPOP: estimación determinista de la exposición en impago.

STCPOP: estimación estocástica de la exposición en impago.

DSTCPOP: resolución dinámica con estimación estocástica de la ex-posición en impago.

Siendo el DSTCPOP una extensión del STCPOP y éste a su vez una exten-sión del TCPOP. Los tres están basados, por tanto, en una aproximación porportafolio, que propugna la consideración de las inversiones como un todo,aprovechando las correlaciones que entre ellas existen para maximizar ben-eficio o minimizar riesgo. En contra de la aproximación mediante portafolioestaría la evaluación de cada inversión de forma individual, es decir, se tomandecisiones sobre una inversión considerando únicamente aspectos que atañena la misma.

76

Page 106: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.1. DISEÑO CAPÍTULO 7. EXPERIMENTOS

En este capítulo estas dos formas de abordar el problema: nivel individualy nivel portafolio, serán comparadas. Para la aproximación a nivel individualse han elegido dos métodos, uno aleatorio y otro cuantitativo:

Solución aleatoria: selecciona las condiciones del crédito comercial deforma aleatoria. Este método es el más sencillo de implementar y muchomás básico que una aproximación seat-of-the-pants1. Las soluciones deeste método nos servirán de punto de referencia.

Límite de la probabilidad de impago: define las condiciones delcrédito comercial en base a un límite de probabilidad de impago. Aprox-imación todo o nada, se concede todo el crédito si cumple con los límitesestablecidos o no se concede nada en caso contrario.

Esta comparación de métodos alternativos se realizará a su vez en dos es-cenarios: uno de alta volatilidad y otro de baja volatilidad. Esta volatilidadhace referencia al único parámetro estocástico que consideramos, a saber, laexposición en impago.

Por tanto, resumiendo los conceptos arriba expuestos, en este capítuloexperimentaremos, comprobaremos, si el aumento en la complejidad del al-goritmo (al introducir primero estocasticidad y luego dinamismo) resulta enun impacto positivo en nuestras soluciones. A su vez se comparará las difer-entes formas de aproximación al problema: individual y portafolio (ver Figura7.1.1).

1seat-of-the-pants: decisión basada en la intuición o experiencia.

77

Page 107: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.1. DISEÑO CAPÍTULO 7. EXPERIMENTOS

Figura 7.1.1: La experimentación se realiza en dos escenarios: baja y al-ta volatilidad. Existe una comparación a dos niveles: entre aproximaciones(individual y portafolio) y entre los algoritmos pertenecientes a cada aprox-imación.

Fuente: Elaboración propia

Podemos clasificar los diferentes modos de resolución al problema segúnsu nivel de complejidad:

Solucion aleatoria < Lımite de PD < TCPOP < STCPOP < DSTCPOP

Con los experimentos expuestos queremos resolver las siguientes pregun-tas:

¿Es la aproximación por portafolio más adecuada que la aproximacióna nivel individual?

¿Hay mejora de resultados cuando realizamos un tratamiento más re-alista del problema?

¿Cómo se comportan los algoritmos según el grado de volatilidad delescenario?

78

Page 108: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

¿En qué condiciones de volatilidad es más beneficioso el uso de portafo-lio con exposiciones en impago estocásticas?

7.2. Implementación de experimentosPara llevar a cabo los experimentos se realizan tres acciones:

Generación del conjunto de datos.

Procesamiento del conjunto generado de datos.

Generación de informe de resultados.

Figura 7.2.1: Diagrama de flujo del test.Fuente: Elaboración propia

En las siguientes subsecciones se explica con detalle la implementación decada una de estas fases.

7.2.1. Generación del conjunto de datos

La generación del conjunto de datos se realiza mediante un archivo dePython externo: DataTest.py ; cuyo código se expone en el Anexo B. La fun-ción de este fichero es crear un directorio de archivos *.csv donde se guardandatos simulados de clientes. Las partes más relevantes del código son las quehacen referencia al cálculo de estos datos:

79

Page 109: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

Probabilidad en impago y su volatilidad.

Las diferentes estimaciones de exposición en impago.

Pertenencia a sectores.

Pérdida dado el impago.

Beneficio neto.

Evento de impago.

7.2.1.1. Probabilidad de impago y su volatilidad

La probabilidad de impago no suele tomar valores altos, en nuestro datossimulados hemos tomado un rango de entre un 1% y un 41% de probabilidadde impago para cada cliente. Esta convención, aunque un poco alta, nos ayudaa tener más variedad de perfiles. La selección de la PD en el rango mencionadose realiza siguiendo una distribución uniforme. En código Python podemosrealizarlo de forma sencilla creando un vector PD de la siguiente forma:

PD = [round(np.random.choice(range(1,41))/100.,2) for x inrange(number_clients)]↪→

En el código arriba expuesto vemos el uso del paquete científico Numpy(np) para llamar a una función que selecciona un número en un cierto rangosiguiendo una distribución uniforme de probabilidades.

En cuanto a la volatilidad de la probabilidad de impago, hemos dicho encapítulo 4 que tomábamos como convención que era la mitad de la proba-bilidad de impago. Creamos un vector de volatilidad de impago DV con elsiguiente código:

DV = [x/2 for x in PD]

80

Page 110: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

7.2.1.2. Exposición en impago

La exposición en impago de cada archivo del test viene dada por tres ele-mentos: un valor como estimación determinista, una función de distribuciónde probabilidades y un valor que refleja la cantidad real de TC pedida porel cliente. Un ejemplo de exposición en impago contenida en los archivos deltest sería de la forma:

(72656, Uniform(36328, 108984), 69305)

Cada uno de estos valores servirá en el planteamiento de las diferentesextensiones del problema: el primer valor se empleará en el test del TCPOP,el segundo elemento en el STCPOP y el tercer valor en el DSTCPOP. Acontinuación exponemos cómo se han simulado los diferentes elementos.

Determinista En primer lugar se calcula un vector de exposiciones enimpago deterministas, cada elemento del vector hace referencia a un cliente.

Para el cálculo de cada elemento del vector se ha tomado en consideraciónla correlación existente entre la probabilidad de impago de los clientes y laexposición en impago. De este modo suponemos que, un cliente, al pedircrédito comercial está en mejor disposición de devolver el crédito cuantomenor sea su valor, esto es, tendrá menor probabilidad de impago si el valorde del crédito es menor.

Al mismo tiempo, se ha tomado por convención que los requerimientos decrédito comercial de los clientes estarán en el rango de entre 1 000 y 70 000euros.

En el siguiente fragmento de código podemos comprobar como se codificaeste vector EAD1 en lenguaje Python:

EAD1 = [int(abs(np.random.normal(1000+69000./0.39*x,13000)))for x in PD]↪→

Como vemos en el código arriba expuesto la correlación sigue la función:

81

Page 111: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

1000 +69000

0,39· x

Donde x es el valor de la probabilidad en impago. Además se introduceuna desviación de esta correlación utilizando una función de distribuciónnormal, de este modo evitamos la causalidad no presente en un entorno realy creamos números aleatorios correlacionados. La forma de la función es:

Normal(1000 +69000

0,39· x, 13000)

En la siguiente imagen vemos como los valores creado de la probabilidaden impago están correlacionados con la exposición en impago:

Figura 7.2.2: Ilustración de la correlación entre la exposición en impago (ejex) y la probabilidad de impago (eje y).

Fuente: Elaboración propia

Estocástica Para la estimación estocástica se han elegido dos distribu-ciones de probabilidad: distribución uniforme y normal (ver Figura ), queson bastante comunes para representar el comportamiento de sistemas.

82

Page 112: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

Figura 7.2.3: Histogramas correspondientes a datos que siguen una distribu-ción normal (arriba) y distribución uniforme (abajo).

Fuente: Elaboración propia

En este punto cabe mencionar que el modelo admite una extensión de lasdistribuciones de probabilidad que podría seguir la exposición en impago, yque podrían estar determinadas por distribuciones construidas a partir de losdatos históricos de los clientes.

La asignación, a los clientes, de estos dos tipos de distribución se realizade forma aleatoria. En el siguiente código Python se define la lista de dis-tribuciones que modelan el comportamiento de los cliente, en este caso lasdistribuciones normal y uniforme:

distributions = ['Normal', 'Uniform']'''Se define un vector de distribuciones elegidas de forma

aleatoria.↪→

'''

83

Page 113: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

EAD2 = [np.random.choice(distributions) for x in EAD1]

Una vez asignada un tipo de distribución a cada cliente, contenidas en elvector EAD2, se debe definir las especificaciones según la distribución sea:

Uniforme: rango.

Normal: media y varianza.

Estas medida de rango, media y varianza dependen del valor de EAD1 pre-viamente definido y de las condiciones de volatilidad elegidas:

EAD21 = []for c in range(len(EAD2)):

if EAD2[c] == 'Normal':if y == 'LV':

EAD2[c] += '('+str(EAD1[c])+','+str(int(np.rando ⌋

m.uniform(EAD1[c]/6.)))+')'↪→

else:EAD2[c] += '('+str(EAD1[c])+','+str(int(np.rando ⌋

m.uniform(EAD1[c]/2.)))+')'↪→

elif EAD2[c] == 'Uniform':if y == 'LV':

EAD2[c] += '('+str(EAD1[c]-int(EAD1[c]/6.))+','+ ⌋

str(EAD1[c]+int(EAD1[c]/6.))+')'↪→

else:EAD2[c] += '('+str(EAD1[c]-int(EAD1[c]/2.))+','+ ⌋

str(EAD1[c]+int(EAD1[c]/2.))+')'↪→

EAD21.append(EAD2[c])

El código arriba expuesto se crea un nuevo vector donde se almacenanlas distribuciones de probabilidad definidas. Para la distribución normal seutiliza como parámetro central el calculado en EAD1, mientras que la var-ianza depende del entorno de volatilidad. Para la distribución uniforme se

84

Page 114: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

emplea el valor calculado en EAD1 como el valor central de la distribuciónuniforme, respecto a este se generan los rangos atendiendo a la volatilidaddel escenario (mayor rango en mayor volatilidad).

En los archivos que conforman el test queda definida cada función deprobabilidad que será llamada más tarde durante el procesamiento de losdatos.

Real El conjunto de exposiciones en impago que se utilizarán en el test co-mo reales surgen de la aplicación de las distribuciones previamente definidaspara el STCPOP.

EAD3 = [0 for x in EAD1] # Inicialización del vector deexposiciones reales.↪→

'''El objeto disMatrix hace referencia a una matriz donde se

guardan las distribuciones de probabilidad.↪→

'''for i in range(len(disMatrix)):

if disMatrix[i][0] == 'Uniform':EAD3[i] = int(np.random.uniform(disMatrix[i][1],disM ⌋

atrix[i][2]))↪→

elif disMatrix[i][0] == 'Normal':EAD3[i] = int(np.random.normal(disMatrix[i][1],disMa ⌋

trix[i][2]))↪→

En el código Python se lee la información generada del apartado anteriory se llaman a las funciones pertinentes para seleccionar un valor que serátomado como la cantidad de crédito comercial que realmente pide el cliente.

7.2.1.3. Pertenencia a sectores

Para definir la pertenencia a sectores de cada cliente se construye unamatriz donde un vector fila representa el grado de pertenencia de un clienteal número de sectores previamente definido. La suma de cada vector fila debe

85

Page 115: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

ser igual a 1. Para la creación de cada vector fila usamos la siguiente funciónen Python:

def randomWeights(n):"""Ejemplo de uso-------->>> sector_weights = randomWeights(4)"""k = np.random.rand(n)a = k / sum(k)return [round(x, 2) for x in a]

La función arriba expuesto toma una función del paquete Numpy paracrear un vector aleatorio de tamaño n y luego se fuerza que los elementos delvector sumen 1.

Para crear la matriz llamamos la función randomWeights tantas vecescomo número de clientes haya:

sectorWeights = [randomWeights(number_sectors) for i inrange(number_clients)]↪→

7.2.1.4. Pérdida dado el impago

Una de las simplificaciones tomadas durante la elaboración del modeloconceptual es la consideración de que la pérdida dado el impago será total,esto es, se perderá toda la cantidad de crédito concedido en caso de impago.No obstante, se ha incorporado en el modelo este factor en pos otorgar alusuario mayor personalización del modelo a sus necesidades. Para la gen-eración de los datos simulados se introduce el valor 1 en todos los casos, paratodos los clientes.

86

Page 116: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

7.2.1.5. Beneficio neto

Para simular el beneficio neto que obtiene cada cliente se ha seleccionadoun rango de posibles márgenes de beneficio. Este margen es de entre un 10y 40 por cien de la cantidad de TC concedido. Ademas, se establece unacorrelación entre la cantidad de TC requerido y el margen de beneficio neto.Esta correlación marca la tendencia de menores márgenes de beneficio cuandose realizan pedidos mayores. Esta práctica es extendida para fomentar lacompra de grandes pedidos.

En el siguiente código Python se generan los números aleatorios correla-cionados:

NI = [round(abs(np.random.normal(0.4-0.1/69000.*x,0.02)),2)for x in EAD1]↪→

7.2.1.6. Evento de impago

Simular el evento de impago es, quizás, la parte más importante de lageneración de datos, pues no debemos olvidar que en él debe subyacer lasdiferentes correlaciones entre empresas. Así pues no basta con emplear laprobabilidad de impago para simular si la empresa incurre o no en impago,sino que debemos tener en cuenta que empresas han incurrido en impagopreviamente. Para ello utilizamos una función que nos recalcula las proba-bilidades de impago según el evento de impago de una primera empresa:

def adjustPD(matrixValue, PD, client1_seed):"""Ejemplo de uso-------->>> new_PD = adjustPD(-0.5, 0.4, 1)"""if client1_seed == 1:

if matrixValue >= 0:return PD+(1-PD)*matrixValue

87

Page 117: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

else:return PD*(1+matrixValue)

else:if matrixValue >= 0:

return PD*(1-matrixValue)else:

return PD-(1-PD)*matrixValue

Este código recalcula la probabilidad impago a partir del posible eventode impago del primer cliente. En caso de incurrir en impago aumenta laprobabilidad de impago de los clientes que tiene correlación positiva coneste, y al contrario, decrecen si existe una correlación negativa.

Empleando la función arriba descrita generamos un vector que contieneunos y ceros según según se incurra en impago o no:

client_1 = np.random.random()<PD[0]new_PD = [adjustPD(p,b,client_1) for p,b in

zip(correlationMatrix[0,1:], PD[1:])]↪→

DE_0 = [np.random.random()<x for x in new_PD]DE = [client_1]+DE_0

El código empieza asignando el valor del evento de impago al primercliente. Este valor, junto con la matriz de correlaciones nos permite recalcularlas probabilidades de impago.

Ejecución del generador de datos

Para ejecutar el programa se debe especificar el número de clientes, elnúmero de sectores y el número de archivos simulados para cada escenariode volatilidad. La sintaxis del argumento para llamar el programa con elcomando python es de la siguiente forma:

DataTest.py − c < nº clientes > −s < nº sectores > −n < nº archivos >

88

Page 118: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

Un ejemplo de su uso:

Figura 7.2.4: Ejecución del programa DataTest.py desde la terminal.Fuente: Elaboración propia

El código mostrado en la Figura 7.2.4 genera ocho archivos, cuatro en altavolatilidad y cuatro en baja volatilidad. Cada fichero tiene cinco clientes, cuyacorrelación queda definida por su grado de pertenencia a tres sectores. Porúltimo se asigna el nombre Test a el directorio de los archivos.

En particular, el archivo genera un directorio (en el caso de ejemplo Test,ver Figura 7.2.5) donde se contiene un número de instancias simuladas paralos escenarios de alta y baja volatilidad.

Figura 7.2.5: Directorio Test donde están contenidos los archivos .csv paraejecutar las pruebas.

Fuente: Elaboración propia

Cada archivo contiene los posibles eventos de impago además de tres tiposde exposiciones en impago:

1. Determinista

2. Estocástica

3. Real

Con los datos simulados generados pasamos a su procesamiento.

89

Page 119: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

7.2.2. Procesamiento del conjunto de datos

Se ha implementada un modo test, en el programa, que recibe los datossimulados y realiza las pruebas en la anterior sección descritas. Si la opcióntest está activa al llamar al programa con el comando python, se ejecuta lafunción runTest:

""" Modo test: """runTest(options.test)

Esta función toma como parámetro de entrada el directorio Test dondeestán contenidos todos los archivos de datos simulados. En el Anexo A, línea846, podemos ver el código que define la función. Esta función se componede cinco partes:

1. Creación de dos entornos de datos: alta volatilidad y baja volatilidad.

2. Extracción de los diferentes tipos de exposiciones en impago .

3. Llamada a las funciones principales referentes al tipo de problema:TCPOP, STCPOP, DSTCPOP.

4. Generación de resultados para aproximaciones individuales: modo aleato-rio y límite PD.

5. Creación de un documento html como informe de los resultados obtenidos.

La llamada del programa en modo test se realiza con la siguiente sintaxis:

python DSS.py −−test < directorio de archivos simulados >

Un ejemplo de llamada al programa sería el de la Figura 7.2.6.

Figura 7.2.6: Comando python que ejecuta el test programado sobre el direc-torio Test.

Fuente: Elaboración propia

90

Page 120: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

Cuando finalice el comando de la Figura 7.2.6 se habrá completado eltest y se creara un archivo *.html junto con dos gráficos que se utilizan en elinforme.

7.2.3. Generación de informe de resultados

Con el procesamiento de los datos simulados se genera un informe enforma de documento *.html. En este documento se muestran los siguientesparámetros:

Parámetros de entrada:

• Portafolio:

◦ Número de clientes◦ Número de sectores

• Algoritmo genético:

◦ Tamaño de la población◦ Tasa de mutaciones◦ Tasa de cruces◦ Tamaño de la élite

• Simulación Monte-Carlo:

◦ Número de simulaciones

• Generales del test:

◦ Escenarios testados◦ Archivos simulados para cada escenario

Parámetros de salida:

• Escenario de baja volatilidad:

◦ Informe numérico:⋄ Método aleatorio⋄ Límite PD

91

Page 121: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

7.2. IMPLEMENTACIÓN CAPÍTULO 7. EXPERIMENTOS

⋄ TCPOP⋄ STCPOP⋄ DSTCPOP

◦ Informe gráfico:⋄ Diagrama Box-Whisker

• Escenario de alta volatilidad:

◦ Informe numérico◦ Informe gráfico

Los archivos que se generan tras la ejecución del programa en modo testaparecen en la Figura 7.2.7 .

Figura 7.2.7: Informe report.html y diagramas generados tras la ejecución deltest.

Fuente: Elaboración propia

92

Page 122: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 8

Análisis de resultados

8.1. Entorno y condiciones de ejecución

8.1.1. Los datos de entrada de simulación

Los datos de entrada de simulación se pueden distribuir en 4 tipos:

Portafolio:

• Número de clientes: 5

• Número de sectores: 3

Algoritmo genético:

• Tamaño de la población: 1000

• Tasa de mutación: 0.01

• Tasa de cruces: 0.9

• Población en la élite: 100

Simulación de Monte-Carlo:

• Número de simulaciones: 10

Test:

• Escenarios probados: 2

93

Page 123: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

8.2. INFORMES CAPÍTULO 8. RESULTADOS

• Número de instancias por cada escenario: 5

8.1.2. Plataforma de ejecución

Para el procesamiento de las pruebas se ha recurrido a los servicios decomputación en la nube usando un servidor Ubuntu 16.04 LTS (HVM), convolumen SSD.

8.2. Informe de resultados y análisis

8.2.1. Informe numéricos

Escenario de baja volatilidad:

Cuadro 8.1: Medidas del beneficio obtenido en un escenario de baja volatili-dad.

Algoritmo Media Desviación estándarAleatorio -9244.13 22247.54Límite PD -1678.05 15362.98TCPOP -640.56 15131.64STCPOP -739.29 15221.36DSTCPOP -2518.7 16182.33

Fuente: Elaboración propia

Escenario de alta volatilidad:

Cuadro 8.2: Medidas del beneficio obtenido en un escenario de alta volatili-dad.

Algoritmo Media Desviación estándarAleatorio 7547.79 40688.93Límite PD 18278.61 7967.77TCPOP 11654.8 12258.74STCPOP 12716.12 9355.16DSTCPOP 9426.2 7189.33

Fuente: Elaboración propia

94

Page 124: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

8.2. INFORMES CAPÍTULO 8. RESULTADOS

Escenario de baja volatilidad:

Figura 8.2.1: Diagrama Box-Whisker en el escenario de baja volatilidad.Fuente: Elaboración propia

95

Page 125: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

8.2. INFORMES CAPÍTULO 8. RESULTADOS

Escenario de alta volatilidad:

Figura 8.2.2: Diagrama Box-Whisker en el escenario de alta volatilidad.Fuente: Elaboración propia

8.2.2. Análisis

Del informe de resultados se desprenden diferentes apreciaciones según elescenario en el que se realiza el test:

Escenario de baja volatilidad: vemos en la Figura 8.2.1 la mejora de re-sultados de los algoritmos que optimizan un modelo basado en portafo-lio. Esto es debido principalmente a la diversificación, tomando en con-sideración la relación que entre los clientes existe. Sin embargo no haydiferencias significativas entres los tres algoritmos basados en portafo-lio, esto puede ser debido a la forma de las distribuciones que modelanla exposición al impago. Al haber utilizado sólo las distribuciones nor-mal y uniforme, estas quedan muy bien definidos por su media, porende el algoritmo determinista ofrece tan buenos resultados como el es-tocástico. El dinámico, al estar basado en el estocástico tampoco sufre

96

Page 126: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

8.2. INFORMES CAPÍTULO 8. RESULTADOS

mejoras. Un trabajo ulterior propone la inserción de funciones de dis-tribución de cola larga para identificar si mejoran las soluciones delSTCPOP y DSTCPOP.

Escenario de alta volatilidad: en un escenario de tanta incertidumbreno vemos diferencias significativas en los resultados de los diferentesalgoritmos (ver Figura 8.2.2). La principal causa es debida a la ineficaciade estimar los futuros valores de exposición en impago.

97

Page 127: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Capítulo 9

Conclusiones y trabajo futuro

9.1. Conclusiones técnicasLos objetivos propuesto en el inicio del trabajo se han cumplido satisfac-

toriamente:

Estudio teórico: se han explicado los tres conceptos centrales (créditocomercial, teoría del portafolio, algoritmos simheurísticos) que config-uran el trabajo y su contexto en la gestión del crédito comercial.

Desarrollo del modelo: se ha completando dando igual importancia a lacomprensión del problema como su proceso de abstracción en fórmulasmatemáticas.

Diseño del algoritmo: se han desarrollado tres algoritmos que resuelvenel problema del crédito comercial para diferentes niveles de complejidady realismo.

Implementación del sistema: se ha creado el DSS en código abierto quenos planteábamos en los objetivos usando el lenguaje de programaciónPython.

El diseño de experimentos: se han diseñado e implementado las pruebasconvenientemente. En ellas se comparan cinco algoritmo según su nivelde complejidad y realismo.

98

Page 128: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 9. CONCLUSIONES Y TRABAJO FUTURO

El uso de métodos cuantitativos en el proceso de toma de decisiones se vaextendiendo a la par que se desarrollan los mismos. Métodos basados en in-teligencia artificial o Big Data son de gran utilidad para extraer conocimientodel entorno y emplearlo en ofrecer soluciones más óptimas y adaptadas a laspersonas, no sólo en el ámbito empresarial sino en el uso eficiente de losrecursos y la conservación del medio ambiente.

Las simheurísticas, que combinan simulación y metaheurísticas se mues-tran como una gran herramienta para modelar y optimizar sistemas comple-jos. No obstante, siempre debemos recordar las limitaciones de cualquier tipode modelo y emplearlos con precaución.

9.2. Conclusiones personalesComo si de un organismo vivo se tratase, el trabajo ha ido evolucionando,

no solo en su forma sino también respecto a su planteamiento inicial. Durantesu desarrollo se han ido sucediendo problemas y dudas que he debido resolverintentando no comprometer aquello que me parecía de mayor interés.

El trabajo me ha servido para afianzar los conocimientos adquiridos du-rante el máster, sobre todo los referentes a modelización, simulación y opti-mización de sistemas. He podido comprobar la relación existente entre estastres áreas y su importancia para comprender la complejidad que subyacetras los sistemas de operaciones. Al mismo tiempo he desarrollado mis ca-pacidades analíticas y de atención al detalle.

La área de aplicación, de ámbito empresarial, sobre la que he empleadolos métodos de optimización no la había tratado con anterioridad. Esto meha exigido un esfuerzo extra a la hora de comprender y elaborar el modelode diseño del problema, que se ha mostrado muy complejo.

9.3. Trabajo futuroNumerosas son las líneas de trabajo futuro que admite el problema que

aquí hemos tratado. A continuación se sugieren algunas propuestas, siguiendo

99

Page 129: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 9. CONCLUSIONES Y TRABAJO FUTURO

la distribución por partes que componen el trabajo:

Parte I:

• Estudio de la literatura: la gestión del cŕedito comercial es un temapoco tratado en la literatura científica, por tanto los eventualesnuevos estudios adquieren una mayor relevancia.

• Estudio de cómo elegir el periodo que contenga los clientes delportafolio: en el trabajo se han tomado, como componentes delportafolio, los clientes que vendrán a la PYME en un determi-nado periodo. La elección de ese periodo podría estar basada enlos periodos de crédito comercial concedidos habitualmente a losclientes. También hay que tomar en cuenta en qué medida empeo-ran nuestras predicciones de crédito comercial frente al tiempo. Siel periodo es tomado demasiado largo las funciones de probabili-dad que determinan la exposición en impago de nuestros clientespodrían provocar que el modelo no funcione correctamente.

• Estudio de la creación de un portafolio dinámico en dos vertientes:en lo referente a las condiciones de TC de cada cliente del portafo-lio y a los clientes que configura dicho portafolio. De este modo seusaría un único portafolio en lugar un portafolio para cada peri-odo. Esto es así ya que los clientes del portafolio se modificaríansegún se van cumpliendo los periodos de TC concedidos. Por unaparte se eliminarían del portafolio los clientes que han cumplidosus obligaciones, por otra parte se añadirían futuros clientes segúnnuevas predicciones que se suceden en el tiempo.

Parte II:

• Modelo:

◦ Existen discrepancias en la literatura de la gestión de crédi-to sobre si utilizar el RAROC como paŕametro a optimizar.Se propone estudiar la optimización de otros parámetros eincluso un planteamiento multiobjetivo del problema.

100

Page 130: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 9. CONCLUSIONES Y TRABAJO FUTURO

◦ Integrar el periodo del TC en el modelo: en el trabajo seha considerado que mantiene una relación discreta y linealcon la cantidad de crédito comercial. No obstante la insercióndel periodo de TC supone un gran reto y no está clara si suaportación será relevante. La integración de periodos de de-scuento también aumentaría el realismo del modelo pero lacomplejidad aumentaría exponencialmente.

◦ Extensión del modelo: integrar otros parámetros estocásticoscomo el número de clientes que harán pedidos o el beneficioneto por cada pedido.

◦ Elaboración de modelos alternativos: el cálculo de las pérdidasinesperadas es complejo y se podría realizar mediante otrastécnicas como la simulación.

◦ Eliminar simplificaciones del modelo: integrar la restricciónde cantidad máxima de TC que se puede ofrecer a un clientey cantidad máxima de TC que se puede conceder en todo elportafolio. Esto a su vez exigiría una modificación del algorit-mo de resolución.

◦ En el modelo se ha empleado el paradigma Default Mode (elprestatario incurre en impago o no), también existe la posi-bilidad de usar el paradigma Mark-to-Market donde tambińese considera que el crédito del prestatario se puede deteriorar.

• Algoritmo:

◦ Análisis del orden de complejidad del algoritmo: para deter-minar la eficiencia y recursos necesarios del algoritmo.

◦ Modificación del algoritmo simheurístico: la combinación desimulación y metaheurística se podría realizar de forma dis-tinta.

◦ Uso de otras metaheurísticas: se han usado en este trabajolos algoritmos genéticos, que suelen ser buenos para resolvertodo tipo de problemas. Se podría estudiar el uso de otrasmetaheurísticas que estuvieran más adaptadas a este tipo de

101

Page 131: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

CAPÍTULO 9. CONCLUSIONES Y TRABAJO FUTURO

problemas.

Parte III:

• Optimización del código: el algoritmo simheurístico desarrolladoes altamente paralelizable. Tanto la parte de simulación como lametaheurística son idóneos para emplear computación paralela.Con esto se conseguiría reducir significativamente el coste com-putacional del DSS.

• Creación de una GUI: con el lenguaje de programación empleadose puede elaborar una GUI o interfaz de usuario que incrementela facilidad de uso del programa.

Parte IV:

• Implementar pruebas para determinar qué valores deben tomar losparámetros de entrada del test para resolver eficazmente el proble-ma: tanto los referentes al algoritmo genético (tasa de mutaciones,tasa de cruces, tamaño de la población, número en la élite) comolos referentes a la simulación (número de simulaciones).

• Identificar, para el algoritmo simple de límite de probabilidad deimpago, cual es el límite que más rendimiento ofrece.

• Comparar los resultados del test con otros algoritmos simples:que combinen indicadores como la probabilidad de impago y laexposición al impago, y que permitan el ofrecimiento de porcionesdel crédito comercial demandado.

102

Page 132: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Bibliografía

[1] S Christian Albright, Christopher James Zappe, and Wayne L Winston.Data Analysis, Optimization, and Simulation Modeling. South-Western,2011.

[2] J. Baggott. Origins: The Scientific Story of Creation. OUP Oxford,2015.

[3] Peter Checkland. Systems thinking, systems practice. 1981.

[4] Ian Iscoe, Alexander Kreinin, Helmut Mausser, and Oleksandr Ro-manko. Portfolio credit-risk optimization. Journal of Banking & Fi-nance, 36(6):1604–1615, 2012.

[5] Lee Jacobson and Burak Kanber. Genetic Algorithms in Java Basics.Springer, 2015.

[6] Angel A. Juan, Javier Faulin, Scott E. Grasman, Markus Rabe, andGonçalo Figueira. A review of simheuristics: Extending metaheuristicsto deal with stochastic combinatorial optimization problems. OperationsResearch Perspectives, 2:62 – 72, 2015.

[7] Sean Luke. 1 essentials of metaheuristicsl. 1.

[8] M. Lutz. Programming Python. O’Reilly Media, 2006.

[9] Harry Markowitz. Portfolio selection. The Journal of Finance, 7(1):77–91, 1952.

103

Page 133: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

BIBLIOGRAFÍA

[10] Anna Nagurney. Network economics. Handbook of ComputationalEconometrics, pages 429–486, 2009.

[11] F. Nelli. Python Data Analytics: Data Analysis and Science using pan-das, matplotlib and the Python Programming Language. Apress, 2015.

[12] M. Pidd. Tools for Thinking: Modelling in Management Science. Wiley,2009.

[13] Michael Pidd. Just modeling through: A rough guide to modeling. In-terfaces, 29(2):118–132, 1999.

[14] C.T. Reviews. e-Study Guide for: Fundamentals of Corporate Financeand Standard and Poors Educational Version of Market Insight byBreasley, ISBN 9780077263348. Cram101, 2012.

[15] Stewart Robinson. Simulation: the practice of model development anduse. Palgrave Macmillan, 2014.

[16] C. Smithson. Credit Portfolio Management. Wiley Finance. Wiley, 2003.

[17] John D Sterman. Business dynamics: systems thinking and modeling fora complex world, volume 19. Irwin/McGraw-Hill Boston, 2000.

[18] El-Ghazali Talbi. Metaheuristics: from design to implementation, vol-ume 74. John Wiley & Sons, 2009.

[19] Manuel Terrádez Gurrea. Análisis del riesgo de crédito comercial enpymes mediante técnicas de minería de datos. 2014.

[20] Gregory Turnbull-Schwartz. The limits to diversification. Credit, 2010.

[21] Víctor García Vaquero and Francisco Alonso. El crédito comercial enespaña: importancia relativa y evolución reciente. Boletín económico-Banco de España, (2):67–77, 2011.

[22] Rosemary H Wild, Kenneth A Griggs, and Tanya Downing. A frame-work for e-learning as a tool for knowledge management. IndustrialManagement & Data Systems, 102(7):371–380, 2002.

104

Page 134: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

BIBLIOGRAFÍA

[23] Benjamin S Wilner. The exploitation of relationships in financial dis-tress: The case of trade credit. The Journal of Finance, 55(1):153–178,2000.

105

Page 135: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

Apéndices

A. Código del DSS (DSS.py)1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3

4

5 """6 - Title: Trade Credit Portfolio Optimization Problem7

8 - Summary: The Trade Credit Portfolio Optimization Problem(TCPOP) consists in↪→

9 finding efficient solutions for optimize therisk-return profile↪→

10 of a trade credit portfolio. This solutions can bedefined as a↪→

11 vector of tuples where each tuple consists of thetrade credit↪→

12 amount and the trade credit period for any givencustomer.↪→

13 In this script is implemented a framework to solvethe TCPOP using↪→

14 a method based on simheuristics. The framework canbe summarised↪→

15 as follows:

106

Page 136: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

16

17 1. Data acquisition and processing.18 2. Create a population of possible solutions.19 3. Calculate the portfolio performance metrics.20 4. Solve the TCPOP usign simheuristics.21 5. Create a report.22

23 The algorithm proposed herein combines Monte-CarloSimulaton with↪→

24 Genetic Algorithms. While the Monte-CarloSimulation deals with the↪→

25 stochasticity of the problem, the GeneticAlgorithm metaheuristic↪→

26 deals with the non-linearity, non-convexity natureof the problem.↪→

27 The Genetic Algorithm is a method for exploring thespace of↪→

28 solutions efficiently without getting stuck in alocal optimum.↪→

29

30 - Example: python DSS.py -d TCPOP_data.csv -t 231 python DSS.py -d TCPOP_data.csv32 python DSS.py -s STCPOP_data.csv33 python DSS.py --ds STCPOP_data.csv34 python DSS.py --test /home/user/Documents/Test35 python DSS.py --test Test36

37 - Author: Juan Felici <[email protected]>38

39 - Date: May 17, 201740

41 - Tested on Fedora 2542 """

107

Page 137: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

43

44

45 #%% Import modules, packages and libraries.46 """47 One of the features of Python language is the huge set of

modules, packages and↪→

48 libraries we can import. These are well formated Python codewe can reuse in↪→

49 our proyect to extend its capabilities. We can differentiatebetween system↪→

50 imports (wich are contained in the Python Standard Library)and third party↪→

51 imports (that we must install externally). More informationabout Python↪→

52 modules cand be find in<https://docs.python.org/2/install/index.html>↪→

53

54 In this proyect are used the following packages:55 1. System imports:56 - sys: This module provides access to some variables

used or maintained↪→

57 by the interpreter and to functions thatinteract strongly with↪→

58 the interpreter.59 (link:

https://docs.python.org/2/library/sys.html)↪→

60 - time: This module provides various time-relatedfunctions.↪→

61 (link:https://docs.python.org/2/library/time.html)↪→

62 - optparse: Enable command-line option parsing.63 (link:

https://docs.python.org/2/library/optparse.html)↪→

108

Page 138: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

64 - os: This module provides a portable way of usingoperating system↪→

65 dependent functionaly.66 (link: https://docs.python.org/2/library/os.html)67 2. Third-pary imports:68 - pandas: Python Data Analisys Library.69 (link: http://pandas.pydata.org/)70 - numpy: Fundamental package for scientific computing

with Python.↪→

71 (link: http://www.numpy.org/)72 """73

74 # 1-System imports:75 import time, os, optparse, sys76 # 2-Third-party imports:77 import pandas as pd, numpy as np78

79

80 #%% Load data.81 """82 The first step in the framework is to load the data. The

pandas package is used↪→

83 to create a data frame, then a set of attributes are createdand stored in a↪→

84 Data object.85 The data is load from a CSV file where are stored the client

specific↪→

86 parameters:87 - Clients.88 - Exposure At Default.89 - Probability of Default.90 - Default Volatility91 - Sector_{n}

109

Page 139: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

92 - Loss Given Default.93 - Net Income.94 """95

96 class Data(object):97 """98 Data class allows to extrat sensitive data of the file.99 """

100

101 def __init__(self, data_file):102 """103 Initialize Data module.104

105 Parameters106 ----------107 data_file : str (CSV file)108 Contains the required information of the

clients.↪→

109

110 Returns111 -------112 Data object113

114 Notes115 -----116 Abbreviations used:117 - Exposure At Default: EAD118 - Probability of Default: PD119 - Default Volatility: DV120 - Loss Given Default: LGD121 - Net Income: NI122 - Default Event: DE123

110

Page 140: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

124 Examples125 --------126 >>> data = Data('clients.csv')127

128 >>> data = Data('~/Documetns/clients.csv')129 """130

131 # Create a data frame using pandas package:132 mydata = pd.read_csv(data_file)133

134 # Data class attributes:135 """136 Client specific parameters:137 """138 self.EAD = mydata['Exposure At Default']139 self.PD = mydata['Probability of Default']140 self.DV = mydata['Default Volatility']141 self.LGD = mydata['Loss Given Default']142 self.NI = mydata['Net Income']143 try:144 self.DE = mydata['Default Event']145 except KeyError:146 pass147 """148 General parameters:149 """150 self.clientNames = mydata['Clients']151 self.numberSectors =

int(str(mydata.keys()).count('Sector'))↪→

152 self.numberClients = len(self.clientNames)153 self.matrixSectors = [self.numberSectors*[0] \154 for i in range(self.numberClients)]155 self.correlations = [self.numberClients*[0] \

111

Page 141: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

156 for i in range(self.numberClients)]157 """158 Sector specific parameters:159 """160 self.variationCoefficient = range(self.numberSectors)161 self.meanDefaultRate = range(self.numberSectors)162 self.defaultRateVolatility = range(self.numberSectors)163

164 # Number of simulations:165 """166 Specifying the number of simulations we want to run in

the MCS.↪→

167 """168 self.numberSimulations = 100169

170 # Recalculating Data class attributes initializedbefore:↪→

171 """172 Recalculating self.matrixSectors:173 """174 for i in range(self.numberSectors):175 for j in range(self.numberClients):176 self.matrixSectors[j][i]=mydata['Sector_'+str(i ⌋

+1)][j]↪→

177 """178 Recalculating self.meanDefaultRate:179 """180 for sector in range(self.numberSectors):181 self.meanDefaultRate[sector] =

sum([self.matrixSectors[i][sector] \↪→

182 *self.PD[i] for i in range(self.numberClients)])183 """184 Recalculating self.defaultRateVolatility:

112

Page 142: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

185 """186 for sector in range(self.numberSectors):187 self.defaultRateVolatility[sector] = \188 sum([self.matrixSectors[i][sector]*self.DV[i] \189 for i in range(self.numberClients)])190 self.defaultRateVolatility[0]=0191 """192 Recalculating self.variationCoefficient:193 """194 for sector in range(self.numberSectors):195 if self.meanDefaultRate[sector] == 0:196 self.variationCoefficient[sector] = 0197 else:198 self.variationCoefficient[sector] = \199 self.defaultRateVolatility[sector]/self.meanDef ⌋

aultRate[sector]↪→

200 """201 Recalculating self.correlations:202 """203 for i in range(self.numberClients):204 for j in range(self.numberClients):205 self.correlations[i][j]=np.sqrt(self.PD[i]*self ⌋

.PD[j])*\↪→

206 sum([self.matrixSectors[i][k]*self.matrixSector ⌋

s[j][k]\↪→

207 *self.variationCoefficient[k]**2 for k in \208 range(self.numberSectors)])209 """210 Another way to calculate correlations using numpy

library:↪→

211 """212 self.correlations = np.corrcoef(self.matrixSectors)213

113

Page 143: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

214 # Functions for data processing in stochastic portfolios:215 """216 The method extractDistributions extracts the distribution217 information of the data file. It returns a well formated

matrix of↪→

218 distributions.219 """220 def extractDistributions(self):221 for i in range(len(self.EAD)):222 self.EAD[i] =

[self.EAD[i][0:self.EAD[i].index('(')],\↪→

223 self.EAD[i][self.EAD[i].index('(')+1:self.EAD[i].i ⌋

ndex(',')],\↪→

224 self.EAD[i][self.EAD[i].index(',')+1:self.EAD[i].i ⌋

ndex(')')]]↪→

225 self.EAD[i][1] = int(self.EAD[i][1])226 self.EAD[i][2] = int(self.EAD[i][2])227 disMatrix = self.EAD[:]228 return disMatrix229 """230 Once we have the distribution matrix we can pass it to the

generateEAD↪→

231 method in order to create a matrix with feasible Exposureat Default↪→

232 values. This method takes the distribution matrix andcreates a set of EADs↪→

233 for the number of simulations selected.234 """235 def generateEAD(self, disMatrix):236 eadMatrix = [len(disMatrix)*[0] for i in

range(self.numberSimulations)]↪→

237 for k in range(self.numberSimulations):238 for i in range(len(disMatrix)):

114

Page 144: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

239 if disMatrix[i][0] == 'Uniform':240 eadMatrix[k][i] =

np.random.uniform(disMatrix[i][1],\↪→

241 disMatrix[i][2])242 elif disMatrix[i][0] == 'Normal':243 eadMatrix[k][i] =

np.random.normal(disMatrix[i][1],\↪→

244 disMatrix[i][2])245 return eadMatrix246

247 # Functions for data processing in test mode:248 """249 The files generated for testing pupusoses contain three

EADs:↪→

250 - EAD deterministic.251 - EAD stochastic.252 - EAD real.253 In order to manipulate this three types a specific funtion

is created.↪→

254 """255 def extractEADs(self):256 l = []257 for i in range(len(self.EAD)):258 EAD_deterministic =

int(self.EAD[i][1:self.EAD[i].index(',')])↪→

259 EAD_actual =int(self.EAD[i][-self.EAD[i].index(','):-1])↪→

260 EAD_stochastic =self.EAD[i][self.EAD[i].index(',')+3:-self.\↪→

261 EAD[i].index(',')-3]262 l.append([EAD_deterministic, EAD_stochastic,

EAD_actual])↪→

263 return l

115

Page 145: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

264

265 # Functions for data processing in dynamic portfolio:266 """267 A static matrix of EADs are created in order to represent

the credit↪→

268 amount already delivered.269 """270 def staticEAD(self, matrixEAD, EAD):271 return [matrixEAD[k]+[EAD] for k in

range(self.numberSimulations)]↪→

272 """273 This function determine the final matrix as the

conjunction of a static↪→

274 matrix and a dynamic matrix.275 """276 def determineEAD(self, static, dynamic):277 return [static[k]+dynamic[k] for k in

range(self.numberSimulations)]↪→

278

279

280 #%% Portfolio performance metrics.281 """282 The performance metrics that characterize the porfolio are:283 1. Expected Return.284 2. Expected Loss.285 3. Unexpected Loss.286 4. Economic Capital.287 5. Risk-Adjusted Return on Capital (RAROC).288 """289

290 class Portfolio(Data):291 """

116

Page 146: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

292 Portfolio class allows to create a Portfolio object andcalculate its↪→

293 performance metrics. The Portfolio class inherit theattributes of the↪→

294 Data class.295 """296

297 # Methods for calculating portfolio performance metrics:298 """299 The expeted return is the amount of money we expect to

profit beforehand.↪→

300 """301 def expectedReturn(self, individual):302 return sum([x*e*(1+n)*(1-p) for x,e,n,p in \303 zip(individual.getChromosome(), \304 self.EAD, self.NI,

self.PD)])-self.expectedLoss(individual)↪→

305 """306 The expected loss is the amount of money we expect to loss

beforehand.↪→

307 """308 def expectedLoss(self, individual):309 return sum([x*e*l*p for x,e,l,p in

zip(individual.getChromosome(), \↪→

310 self.EAD, self.LGD, self.PD)])311 """312 The unexpected loss is related to the variation of the

expected loss.↪→

313 """314 def unexpectedLoss(self, individual):315 individual_UL = [x*self.EAD[i]*self.LGD[i]*self.DV[i]

for x,i in \↪→

117

Page 147: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

316 zip(individual.getChromosome(),range(self.numberClients))]↪→

317 UL_p = 0318 for i in range(self.numberClients):319 for j in range(self.numberClients):320 UL_p += individual_UL[i]*individual_UL[j]\321 *self.correlations[i][j]322 return np.sqrt(UL_p)323 """324 The economic capital is usually the amount of money needed

to ensure that↪→

325 the company stays solvent.326 """327 def economicCapital(self, individual):328 return self.unexpectedLoss(individual)-self.expectedLo ⌋

ss(individual)↪→

329 """330 The Risk-Adjusted Return on Capital (RAROC) combines the

expected return↪→

331 and the economic capital, it is used as the objectivefunction.↪→

332 """333 def RAROC(self, individual):334 return self.expectedReturn(individual)/self.economicCa ⌋

pital(individual)↪→

335 """336 The clacBenefit method is used for testing purposes as a

mesure of per-↪→

337 formance. The calcBenefit method returns the net amount ofmoney earned↪→

338 given the default event, the actual EAD and the portfolioweights.↪→

339 """

118

Page 148: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

340 def calcBenefit(self, actualEAD, individual):341 return sum([x*e*(n*(1-p)-p) for x,e,n,p in

zip(actualEAD, individual,\↪→

342 self.NI, self.DE)])343

344

345 #%% Individual.346 """347 An individual is a possible solution of the problem. An

individual↪→

348 is represented by its chromosome. Each gene of the chromosomeis↪→

349 the portion of TC the clients requests.350 The chromosome is in the form [0.23, 0.43, 0, ...], where the

nth↪→

351 location of the list correspond to the client number n.352 """353

354 class Individual(object):355

356 def __init__(self, chromosome):357 """358 Initialize Individual module.359

360 Parameters361 ----------362 chromosome : int, list363 Contains the chromosome (list) or its length

(int).↪→

364

365 Returns366 -------367 nothing

119

Page 149: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

368

369 Notes370 -----371 This class is written using setters and getters for

the sake↪→

372 of redability. Since the Python language does notsupport↪→

373 encapsulation in the way Java does.374

375 Two attributes are created:376 1. Chromosome : weights in the portfolio.377 2. Fitness : metric of the objective function.378

379 Examples380 --------381 >>> individual_1 = Individual(3)382

383 >>> individual_2 = Individual([0.43, 0, 0.84])384 """385

386 self.chromosome = chromosome387 self.fitness = -1388 if type(self.chromosome) is int:389 self.chromosome = range(self.chromosome)390 for gene in self.chromosome:391 self.setGene(gene , round(np.random.random(),2))392

393 # Setters and getters for Individual class:394 """395 Gene level:396 """397 def setGene(self, offset, gene):398 self.chromosome[offset] = gene

120

Page 150: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

399

400 def getGene(self, offset):401 return self.chromosome[offset]402 """403 Chromosome level:404 """405 def getChromosomeLength(self):406 return len(self.chromosome)407

408 def getChromosome(self):409 return self.chromosome410 """411 Fitness parameter:412 """413 def setFitness(self, fitness):414 self.fitness = fitness415

416 def getFitness(self):417 return self.fitness418

419

420 #%% Population.421 """422 A population is a set of individuals. In a genetic algorithm

the populations↪→

423 are replaced dynamically as they are evolving, generation togeneration.↪→

424 """425

426 class Population(object):427

428 _populationFitness = -1429

121

Page 151: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

430 def __init__(self, populationSize, chromosomeLength):431 """432 Initialize Population module.433

434 Parameters435 ----------436 populationSize : int437 Contains the number of individuals in the

population.↪→

438 chromosomeLength : int439 Contains the chromosome length of each

individual.↪→

440

441 Returns442 -------443 nothing444

445 Notes446 -----447 As in the Individual class the Population class makes

use of getters↪→

448 and setters in spite of this is unnecessary.449

450 Examples451 --------452 >>> population = Population(1000, 5)453 """454

455 self.population = range(populationSize)456 for ind in range(populationSize):457 individual = Individual(chromosomeLength)458 self.population[ind] = individual459

122

Page 152: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

460 # Individual level:461 """462 Some methods to manage the individuals in the population:463 """464 def getFittest(self, offset):465 self.population.sort(key=lambda x: x.getFitness(),

reverse=True)↪→

466 return self.population[offset]467

468 def getIndividuals(self):469 return self.population470

471 def setIndividual(self, offset, individual):472 self.population[offset] = individual473

474 def getIndividual(self, offset):475 return self.population[offset]476

477 # Population level;478 """479 Methods to calculate parameters associated with the

population:↪→

480 """481 def size(self):482 return len(self.population)483

484 def setPopulationFitness(self, fitness):485 self.populationFitness = fitness486

487 def getPopulationFitness(self):488 return self.populationFitness489

490

123

Page 153: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

491 #%% Genetic algorithm.492 """493 The genetic algorithm is the method used in this framework to

explore the↪→

494 space of solutions. The GeneticAlgorithm class is defined inorder to manage↪→

495 the individuals relations and the dynamic change of thepopulations.↪→

496 """497

498 populationSize = 1000499 mutationRate = 0.01500 crossoverRate = 0.90501 elitismCount = 100502

503 class GeneticAlgorithm(object):504

505 def __init__(self, chromosomeLength):506 """507 Initialize Population module.508

509 Parameters510 ----------511 populationSize : int512 Contains the number of individuals in the

population.↪→

513 chromosomeLength : int514 Contains the chromosome length of each

individual.↪→

515 mutationRate : float516 Contains the probability of mutation.517 crossoverRate : float

124

Page 154: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

518 Frequency of chromosomal crossover betweenindividuals.↪→

519 elitismCount : int520 Number of fittest individuals that survive

in a generation.↪→

521

522 Returns523 -------524 nothing525

526 Examples527 --------528 >>> ga = GeneticAlgorithm(1000, 5, 0.01, 0.90, 100)529 """530

531 self.populationSize = populationSize532 self.chromosomeLength = chromosomeLength533 self.mutationRate = mutationRate534 self.crossoverRate = crossoverRate535 self.elitismCount = elitismCount536

537 # Methods implemented in the GengeticAlgorithm class:538 """539 This method creates an initial population (zero

generation). It calls the↪→

540 Population class.541 """542 def initializePopulation(self):543 population = Population(self.populationSize,

self.chromosomeLength)↪→

544 return population545 """

125

Page 155: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

546 This method calculates the fitness of each individual. Thefitness function↪→

547 or objective function is the Portfolio.RAROC() method.548 """549 def calculateFitness(self, individual, portfolio):550 fitness = portfolio.RAROC(individual)551 individual.setFitness(fitness)552 return fitness553 """554 In order to evaluate a population this method calls the

calculateFitness↪→

555 method for each individual, setting each fitness. Then issetted the↪→

556 population fitness, that is a metric to evaluate how goodthe individuals↪→

557 are in each population.558 """559 def evaluatePopulation(self, population, portfolio):560 populationFitness = 0561 for individual in population.getIndividuals():562 populationFitness +=

self.calculateFitness(individual, portfolio)↪→

563 population.setPopulationFitness(populationFitness)564 """565 This method creates a new population resulted from the

crossover of its↪→

566 individuals.567 Some crossover procedures:568 - Single point.569 - Two points.570 - Arithmetic.571 """572 def crossoverPopulation(self, population):

126

Page 156: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

573 newPopulation =Population(population.size(),self.chromosomeLength)↪→

574 for populationIndex in range(population.size()):575 parent1 = population.getFittest(populationIndex)576 if self.crossoverRate > np.random.random() and

populationIndex >= \↪→

577 self.elitismCount:578 offspring =

Individual(parent1.getChromosomeLength())↪→

579 parent2 = self.selectParent(population)580 for geneIndex in

range(parent1.getChromosomeLength()):↪→

581 if 0.5 > np.random.random():582 offspring.setGene(geneIndex, parent1.\583 getGene(geneIndex))584 else:585 offspring.setGene(geneIndex, parent2.\586 getGene(geneIndex))587 newPopulation.setIndividual(populationIndex,

offspring)↪→

588 else:589 newPopulation.setIndividual(populationIndex,

parent1)↪→

590 return newPopulation591 """592 This method, called in crossoverPopulation(population),

selects an↪→

593 individual randomly.594 """595 def selectParent(self, population):596 individuals = population.getIndividuals()597 populationFitness = population.getPopulationFitness()

127

Page 157: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

598 rouletteWheelPosition =np.random.random()*populationFitness↪→

599 spinWheel = 0600 for individual in individuals:601 spinWheel += individual.getFitness()602 if spinWheel >= rouletteWheelPosition:603 return individual604 return individuals[population.size()-1]605 """606 Given the mutation rate some genes are modified for an

individual.↪→

607 """608 def mutatePopulation(self, population):609 newPopulation = Population(self.populationSize,self.ch ⌋

romosomeLength)↪→

610 for populationIndex in range(population.size()):611 individual = population.getFittest(populationIndex)612 for geneIndex in

range(individual.getChromosomeLength()):↪→

613 if populationIndex > self.elitismCount:614 if self.mutationRate > np.random.random():615 newGene = round(np.random.random(), 2)616 individual.setGene(geneIndex, newGene)617 newPopulation.setIndividual(populationIndex,

individual)↪→

618 return newPopulation619 """620 The termination condition could be based on:621 - Time.622 - Improvement of solutions.623 - Some objective.624 In this case is implemented a condition based on time.625 """

128

Page 158: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

626

627 """628 - There is no improvement of solutions.629 """630 def terminationConditionFitness(self, fitnessIncrement):631

632 if fitnessIncrement > -0.015:633 return True634 return False635

636 """637 - Time condition.638 """639 def terminationConditionTime(self, startTime,

executionTime):↪→

640 elapsed = time.time()-startTime641 if elapsed >= executionTime*60:642 return True643 return False644

645

646 #%% General Functions.647 """648 This functions are called in the main() function:649 - runDeterministic(portfolio, excTime)650 - runStochastic(portfolio)651 - runDynamic(portfolio)652 - runTest(test)653 - reportResults(portfolio, sol)654 - calcPerios(number)655 """656

657 # TCPOP - Deterministic estimation of Exposures At Default:

129

Page 159: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

658 """659 Executes a genetic algorithm to solve the TCPOP.660 """661 def runTCPOP(portfolio, excTime):662 """ Genetic algorithm creation: """663 ga = GeneticAlgorithm(portfolio.numberClients)664 """ Initialize popultion and generation: """665 generation = 1666 population = ga.initializePopulation()667 """ Evaluate population: """668 ga.evaluatePopulation(population, portfolio)669 """670 Termination condition:671 - Termination condition given time (minutes).672 - Termination condition given the population fitness

improvement.↪→

673 """674 if excTime is not None:675 startTime = time.time()676 while ga.terminationConditionTime(startTime, excTime)

is not True:↪→

677 """ Crossover population: """678 population = ga.crossoverPopulation(population)679 """ Mutate population: """680 population = ga.mutatePopulation(population)681 """ Evaluate population: """682 ga.evaluatePopulation(population, portfolio)683 """ Next generation: """684 generation += 1685 else:686 fitnessIncrement = None687 while ga.terminationConditionFitness(fitnessIncrement)

is not True:↪→

130

Page 160: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

688 fitness_0 = population.getPopulationFitness()689 """ Crossover population: """690 population = ga.crossoverPopulation(population)691 """ Mutate population: """692 population = ga.mutatePopulation(population)693 """ Evaluate population: """694 ga.evaluatePopulation(population, portfolio)695 fitnessIncrement = (population.getPopulationFitnes ⌋

s()-fitness_0)/fitness_0↪→

696 """ Next generation: """697 generation += 1698 return population.getFittest(0).getChromosome()699

700 # STCPOP - Stochastic estimation of Exposures At Default:701 """702 Executes a simheuristic algorithm composed of a genetic

algorith and a Monte-↪→

703 Carlo simulation in order to solve the STCPOP. The Monte-Carlosimulation is a↪→

704 method to model risk in an stochastic enviroment.It considersa set of↪→

705 distributions as an input in order to determine the outcome.706 """707 def runSTCPOP(portfolio):708 """ disMatrix contains the statistical distribution of EAD

in a well↪→

709 formate matrix. """710 disMatrix = portfolio.extractDistributions()711 """ eadMatrix defines the values of EAD for each

simulation. """↪→

712 eadMatrix = portfolio.generateEAD(disMatrix)713 """ Initialize a list of lists where the solutions for

each simulation are↪→

131

Page 161: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

714 saved. """715 l = [(portfolio.numberClients)*[0] for i in

range(len(eadMatrix))]↪→

716 """ Genetic algorithm creation: """717 ga = GeneticAlgorithm(portfolio.numberClients)718 """ Monte-Carlo Simulation loop:"""719 for k in range(len(eadMatrix)):720 """ Set the EAD for each simulation. """721 portfolio.EAD = eadMatrix[k]722 """ Initialize popultion and generation: """723 generation = 1724 population = ga.initializePopulation()725 """" Evaluate population: """726 ga.evaluatePopulation(population, portfolio)727 fitnessIncrement = None728 while ga.terminationConditionFitness(fitnessIncrement)

is not True:↪→

729 fitness_0 = population.getPopulationFitness()730 """ Crossover population: """731 population = ga.crossoverPopulation(population)732 """ Mutate population: """733 population = ga.mutatePopulation(population)734 """ Evaluate population: """735 ga.evaluatePopulation(population, portfolio)736 fitnessIncrement =

(population.getPopulationFitness()\↪→

737 -fitness_0)/fitness_0738 """ Next generation: """739 generation += 1740 """ Save the solution for the k simulation: """741 l[k] = population.getFittest(0).getChromosome()742 """ Obtain the mean values: """743 x = zip(*l[:])

132

Page 162: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

744 y = [sum(s) for s in x]745 z = [n/k for n in y]746 """ Return the mean values: """747 return z748

749 # DSTCPOP - Dynamic Exposures At Default:750 """751 Executes the simheuristic algorithm in a dynamic fashion. This

algorithm↪→

752 is executed for each client given his real EAD. Compatiblewith test mode.↪→

753 """754 def runDSTCPOP(portfolio, boolean):755 """ This boolean value adjust the format of EAD so this

method can be↪→

756 used in the runTest() function. """757 if boolean is not True:758 actualEADlist = [portfolio.EAD[x][1] for x in \759 range(len(portfolio.EAD))]760 portfolio.EAD = [portfolio.EAD[x][0] for x in \761 range(len(portfolio.EAD))]762 """ Extract de statistical distributions of the data file:

"""↪→

763 disMatrix = portfolio.extractDistributions()764 """ Initialize a static matrix to save the static EADs: """765 static_matrix = [[] for x in

range(portfolio.numberSimulations)]↪→

766 """ The sol variable will contain the actual weight foreach client: """↪→

767 sol = []768 """ Initialize a list to contain actual EADs: """769 if boolean is True:770 actualEAD_list = []

133

Page 163: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

771 """772 For each client we have to recalculate the EAD matrix as

the conjunction of↪→

773 a static matrix and a dynamic matrix.774 """775 for i in range(portfolio.numberClients):776 if boolean is True:777 """ Rearange the dismatrix: """778 disMatrix = disMatrix.drop(0)779 disMatrix.index = range(len(disMatrix))780 """ Introduce dynamically the EAD: """781 actualEAD = input('\n[+] Deterministic EAD for

Client_'\↪→

782 +str(i+1)+' : ')783 actualEAD_list.append(actualEAD)784 else:785 disMatrix = disMatrix[1:]786 actualEAD = actualEADlist[i]787 static_matrix = portfolio.staticEAD(static_matrix,

actualEAD)↪→

788 if i == portfolio.numberClients:789 final_matrix = static_matrix790 else:791 eadMatrix = portfolio.generateEAD(disMatrix)792 final_matrix = portfolio.determineEAD(static_matrix,

eadMatrix)↪→

793 l = [(portfolio.numberClients)*[0] for w inrange(len(final_matrix))]↪→

794 """ Monte-Carlo simulation loop: """795 for k in range(len(final_matrix)):796 portfolio.EAD = final_matrix[k]797 """ Genetic algorithm creation: """798 ga = GeneticAlgorithm(portfolio.numberClients)

134

Page 164: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

799 """ Initialize generation: """800 generation = 1801 """ Initialize population: """802 population = ga.initializePopulation()803 for individual in population.getIndividuals():804 individual.chromosome = sol +

individual.getChromosome()↪→

805 ga.evaluatePopulation(population, portfolio)806 fitnessIncrement = None807 while ga.terminationConditionFitness(fitnessIncrement)

is not True:↪→

808 fitness_0 = population.getPopulationFitness()809 for individual in population.getIndividuals():810 individual.chromosome =

individual.chromosome[len(sol):]↪→

811 population = ga.crossoverPopulation(population)812 population = ga.mutatePopulation(population)813 for individual in population.getIndividuals():814 individual.chromosome = sol +

individual.chromosome↪→

815 ga.evaluatePopulation(population, portfolio)816 fitnessIncrement =

(population.getPopulationFitness()\↪→

817 -fitness_0)/fitness_0818 generation += 1819 l[k] = population.getFittest(0).getChromosome()820 x = zip(*l[:])821 y = [sum(s) for s in x]822 solution = [n/k for n in y]823 """ Print the result in a formatted way: """824 if boolean is True:825 print '\n · '+portfolio.clientNames[i]+':\n\n\t- TC

Amount: '\↪→

135

Page 165: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

826 +str(int(solution[i]*actualEAD))827 print '\t- TC Period:

'+str(calcPeriod(solution[i]*actualEAD))+\↪→

828 ' days'829 sol.append(solution[i])830 """ Modify the EAD attribute of the portfolio in order to

simplify the↪→

831 generation of reports. """832 if boolean is True:833 portfolio.EAD = actualEAD_list834 else:835 portfolio.EAD = actualEADlist836 return sol837

838 # TC Period.839 """840 This method is a simple way to calculate the trade credit

period. The trade↪→

841 credit period will depend on the trade credit amount. Afurther approach could↪→

842 incorporate the TC period in the portfolio model.843 """844 def calcPeriod(number):845 """ Possible TC periods: """846 l = [0, 15, 30, 60, 90, 120]847 if number == 0:848 return l[0]849 elif number < 1000:850 return l[1]851 elif number < 10000 :852 return l[2]853 elif number < 50000:854 return l[3]

136

Page 166: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

855 elif number < 700000:856 return l[4]857 else:858 return l[5]859

860 # Test.861 """862 This special function takes a directory of test files to

extract conclusions.↪→

863 """864 def runTest(test_path):865 os.chdir(test_path)866 number_files = len([name for name in os.listdir('.') if \867 os.path.isfile(name)])/2868 HV_matrix = []869 HV_means = []870 HV_stds = []871 LV_matrix = []872 LV_means = []873 LV_stds = []874 columns = ['Aleatory', 'PD limit','Deterministic',

'Stochatic', 'Dynamic']↪→

875 for j in ['HV', 'LV']:876 for i in range(number_files):877 portfolio = Portfolio(j+'_dataTest_'+str(i)+'.csv')878 l = portfolio.extractEADs()879 portfolio.EAD = [l[x][0] for x in range(len(l))]880 sol_deterministic = runTCPOP(portfolio, None)881 portfolio.EAD = [l[x][1] for x in range(len(l))]882 sol_stochastic = runSTCPOP(portfolio)883 portfolio.EAD = [l[x][1:] for x in range(len(l))]884 sol_dynamic = runDSTCPOP(portfolio, False)885 actualEAD = [l[x][2] for x in range(len(l))]

137

Page 167: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

886 sol_aleatory = [np.random.random() for x inactualEAD]↪→

887 sol_pdlimit = [1*(x<0.20) for x in portfolio.PD]888 benefits = [portfolio.calcBenefit(actualEAD, x) for

x in \↪→

889 [sol_aleatory, sol_pdlimit, sol_deterministic, \890 sol_stochastic, sol_dynamic]]891 if j == 'HV':892 HV_matrix.append(benefits)893 else:894 LV_matrix.append(benefits)895 HV_data_frame = pd.DataFrame(HV_matrix, columns = columns)896 LV_data_frame = pd.DataFrame(LV_matrix, columns = columns)897 for w in columns:898 HV_means.append(round(np.mean(HV_data_frame[w]),2))899 LV_means.append(round(np.mean(LV_data_frame[w]),2))900 HV_stds.append(round(np.std(HV_data_frame[w]),2))901 LV_stds.append(round(np.std(LV_data_frame[w]),2))902 plot1 = HV_data_frame.plot.box(grid = True, sym='r+')903 fig1 = plot1.get_figure()904 plot2 = LV_data_frame.plot.box(grid = True, sym='r+')905 fig2 = plot2.get_figure()906 os.chdir('..')907 fig1.savefig('HV_image.png')908 fig2.savefig('LV_image.png')909 html_string = '''910 <html>911

912 <head>913 <link rel="stylesheet" href="https://maxcdn.bootst ⌋

rapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">↪→

914 <title>Reporting Simulation Results</title>

138

Page 168: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

915 <style>body{margin:0100;background:whitesmoke;},p{text-indent:2.0em;},table{font-family: arial,sans-serif;border-collapse: collapse;},td, th {border: 4pxsolid #dddddd;text-align: left;padding:10px;}tr:nth-child(even) {background-color:#dddddd;}</style>

↪→

↪→

↪→

↪→

↪→

↪→

916 </head>917

918 <body>919 <h1><P ALIGN=Center>Report on the simulation

results</P ALIGN=\↪→

920 Center></h1>921 <UL>922 <hr>923 <h2><LI>Simulation inputs</h2>924 <OL>925 <h5><LI>Portfolio parameters:</h5>926 <UL>927 <h6><LI>Number of clients: %d</h6>928 <h6><LI>Number of sectors: %d</h6>929 </UL>930 <h5><LI>Genetic algorithm parameters:</h5>931 <UL>932 <h6><LI>Population size: %d</h6>933 <h6><LI>Mutation rate: %s</h6>934 <h6><LI>Crossover rate: %s</h6>935 <h6><LI>Elitism count: %d</h6>936 </UL>937 <h5><LI>Monte-Carlo simulation

parameters:</h5>↪→

938 <UL>939 <h6><LI>Number of simulations: %d</h6>

139

Page 169: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

940 </UL>941 <h5><LI>Test simulation parameters:</h5>942 <UL>943 <h6><LI>Scenarios tested: %d</h6>944 <h6><LI>Data files tested for each

scenario: %d</h6>↪→

945 </UL>946 </OL>947 <hr>948 <h2><LI>Simulation outputs</h2>949 </UL>950 <UL>951 <h3><LI>Low volatility scenario:</h3>952 <UL>953 <h4><LI>Numerical reports:</h4>954 <table width=400>955 <tr>956 <th>Algorithm</th>957 <th>Means</th>958 <th>Standard deviation</th>959 </tr>960 <tr>961 <td>Aleatory</td>962 <td>%s</td>963 <td>%s</td>964 </tr>965 <tr>966 <td>PD limit</td>967 <td>%s</td>968 <td>%s</td>969 </tr>970 <tr>971 <td>TCPOP</td>

140

Page 170: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

972 <td>%s</td>973 <td>%s</td>974 </tr>975 <tr>976 <td>STCPOP</td>977 <td>%s</td>978 <td>%s</td>979 </tr>980 <tr>981 <td>DSTCOP</td>982 <td>%s</td>983 <td>%s</td>984 </tr>985 </table>986 <h4><LI>Graphical reports:</h4>987 <img src="LV_image.png">988 </UL>989 <h3><LI>High volatility scenario:</h3>990 <UL>991 <h4><LI>Numerical reports:</h4>992 <table width=400>993 <tr>994 <th>Algorithm</th>995 <th>Means</th>996 <th>Standard deviation</th>997 </tr>998 <tr>999 <td>Aleatory</td>

1000 <td>%s</td>1001 <td>%s</td>1002 </tr>1003 <tr>1004 <td>PD limit</td>

141

Page 171: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

1005 <td>%s</td>1006 <td>%s</td>1007 </tr>1008 <tr>1009 <td>TCPOP</td>1010 <td>%s</td>1011 <td>%s</td>1012 </tr>1013 <tr>1014 <td>STCPOP</td>1015 <td>%s</td>1016 <td>%s</td>1017 </tr>1018 <tr>1019 <td>DSTCOP</td>1020 <td>%s</td>1021 <td>%s</td>1022 </tr>1023 </table>1024 <h4><LI>Graphical reports:</h4>1025 <img src="HV_image.png">1026 </UL>1027 </UL>1028 <hr>1029 </body>1030 </html>''' % (portfolio.numberClients,

portfolio.numberSectors, \↪→

1031 populationSize, mutationRate, crossoverRate, elitismCount, \1032 portfolio.numberSimulations, 2, number_files, LV_means[0],

LV_stds[0], \↪→

1033 LV_means[1], LV_stds[1], LV_means[2], LV_stds[2],LV_means[3], LV_stds[3],\↪→

142

Page 172: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

1034 LV_means[4], LV_stds[4], HV_means[0], HV_stds[0],HV_means[1], HV_stds[1],\↪→

1035 HV_means[2], HV_stds[2], HV_means[3], HV_stds[3],HV_means[4], HV_stds[4])↪→

1036 f = open('report.html','w')1037 f.write(html_string)1038 f.close()1039

1040 #return LV_data_frame1041

1042 # Report of result.1043 """1044 Given a portafolio and its distributions, the reportResults

function prints in↪→

1045 the terminal:1046 - Portfolio distribution:1047 - TC amount.1048 - TC period.1049 - Portoflio figures:1050 - Expected Return.1051 - Expected Loss.1052 - Unexpected Loss.1053 - Economic Capital.1054 - RAROC1055 """1056 def reportResults(portfolio, sol):1057 """ Create an individual using the sol: """1058 individual = Individual(sol)1059 """ sol2 calcule TC amount for each client: """1060 sol2 = [int(x*y) for x,y in zip(sol,portfolio.EAD)]1061 """ tc_peridod contains the TC periods for each client: """1062 tc_period = [calcPeriod(s) for s in sol2]1063 """

143

Page 173: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

1064 Print and format data:1065 """1066 print '\033[1m' + '\n [·] Portfolio distribution:\n\t' +

'\033[0m'↪→

1067 print '\t\t\t'+'TC Amount\tTC Period'1068 for i in range(portfolio.numberClients):1069 print '\t-

'+portfolio.clientNames[i]+'\t'+str(sol2[i])+\↪→

1070 ' \t'+str(tc_period[i])+' days'1071 print '\033[1m' + '\n [·] Portfolio figures:\n\n'+ \1072 '\033[0m'+'\t- Expected Return: \t' \1073 +str(int(portfolio.expectedReturn(individual))) + \1074 '\n\t- Expected Loss: \t'\1075 +str(int(portfolio.expectedLoss(individual))) + \1076 '\n\t- Unexpected Loss: \t'\1077 +str(int(portfolio.unexpectedLoss(individual))) + \1078 '\n\t- Economic Capital: \t'\1079 +str(int(portfolio.economicCapital(individual))) + '\n\t-

RAROC: \t\t'\↪→

1080 +str(round(portfolio.RAROC(individual),2)) + '\n'1081

1082

1083 #%% Main.1084 """1085 The main function prevents the code to be executed if the code

is imported as a↪→

1086 module.1087 """1088

1089 def main():1090

1091 # Using optparse library:1092 """

144

Page 174: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

1093 This allows the user to specify the execution time, thetype of algorithm↪→

1094 to be used and its corresponding data file. A specialoption is the test↪→

1095 mode (--test) for testing purposes.1096 """1097 parser = optparse.OptionParser('usage %prog '+\1098 '-t <execution time (minutes)> {-d, -s, --ds, --test} \1099 {<deterministic datafile>\1100 , <stochastic datafile>, <stochastic datafile>, <test

path directory>}')↪→

1101 parser.add_option('-t', dest = 'excTime', type = 'string',\1102 help = 'specify execution time of the algorithm')1103 parser.add_option('-d', dest = 'detFile', type = 'string',\1104 help = 'specify deterministic clients data file')1105 parser.add_option('-s', dest = 'stoFile', type = 'string',\1106 help = 'specify stochastic clients data file')1107 parser.add_option('--ds', dest = 'dynFile', type =

'string',\↪→

1108 help = 'specify stochastic clients data file')1109 parser.add_option('--test', dest = 'test', type = 'string',\1110 help = 'specify test directory')1111 (options, args) = parser.parse_args()1112 options_list = [options.detFile, options.dynFile,

options.stoFile, \↪→

1113 options.test]1114 if options_list.count(None) is not 3:1115 print parser.usage1116 exit(0)1117

1118 # Executing the colled mode:1119 """

145

Page 175: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

A. CÓDIGO DEL DSS

1120 When the option --test is enabled a test is carried out,the results are↪→

1121 pirnted in the report.html file. Other options create aportfolio and↪→

1122 calls de running process for the different extensions ofthe TCPOP problem.↪→

1123 """1124 options_list2 = [bool(x) for x in options_list]1125 ind = options_list2.index(not None)1126 if ind == 3:1127 """ Test mode: """1128 runTest(options.test)1129 else:1130 """ Portfolio creation: """1131 portfolio = Portfolio(options_list[ind])1132 if ind == 0:1133 """ TCPOP problem: """1134 sol = runTCPOP(portfolio, options.excTime)1135 elif ind == 2:1136 """ STCPOP problem: """1137 sol = runSTCPOP(portfolio)1138 else:1139 """ DSTCPOP problem: """1140 sol = runDSTCPOP(portfolio, True)1141 """ Printing results on the terminal: """1142 reportResults(portfolio, sol)1143

1144

1145 if __name__ == '__main__':1146 main()

146

Page 176: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS (DATAGEN.PY)

B. Código generador de datos (DataGen.py)1 #!/usr/bin/python2 # -*- coding: utf-8 -*-3

4

5 """6 - Title: Data generator for testing purpuoses.7

8 - Summary: This script generates a directory where arecontained files of↪→

9 simulated instances for testing the algorithms ofTCPOP, STCPOP↪→

10 and DSTCPOP. There are two sets of N files, onewith simulations↪→

11 for a high volatility scenario (HV), the othersimulates a low↪→

12 volatility scenario (LV).13 Each file contains three types of Exposure at

Default:↪→

14

15 1 - Deterministic forecast for testing theTCPOP.↪→

16 2 - Stochastic forecast for testing the STCPOP.17 3 - Actual data for testing the DSTCPOP.18

19 Furthermore each file contains the default event,calculated↪→

20 taking into acount the correlations between clients.21

22 - Example: python DataGen.py -c 30 -s 6 -ttest_path_directory -n 10000↪→

23

147

Page 177: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

24 - Output: A directory taht contains 2*N data files:25 [*] Test Directory:26 [+] LV_dataTest_{0..N}.csv27 [+] HV_dataTest_{0..N}.csv28 """29

30

31 #%% Import packages, modules and libraries.32 """33 In this script are used the following packages:34 1. System imports:35 - csv: This module provides methods to read and write

tabular data in↪→

36 CSV format.37 (link:

https://docs.python.org/2/library/csv.html)↪→

38 - optparse: Enable command-line option parsing.39 (link:

https://docs.python.org/2/library/optparse.html)↪→

40 - os: A portable way of using operating systemdependent functionality.↪→

41 (link: https://docs.python.org/2/library/os.html)42 2. Third-pary imports:43 - numpy: Fundamental package for scientific computing

with Python.↪→

44 (link: http://www.numpy.org/)45

46 """47

48 # 1-System imports:49 import csv, optparse, os50

51 # 2-Third-party imports:

148

Page 178: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

52 import numpy as np53

54

55 #%% Functions.56 """57 We create some functions that will be called later.58 """59

60 def randomWeights(n):61 """62 Produces a list of n random weights that sum to 1.63

64 Parameters65 ----------66 n : int67 The length of the list.68

69 Returns70 -------71 A list object.72

73 Examples74 --------75 >>> sector_weights = randomWeights(4)76 """77 k = np.random.rand(n)78 a = k / sum(k)79 return [round(x, 2) for x in a]80

81 def writeCSV(namefile, header, matrix):82 """83 Writes a matrix and a header in CSV format.84

149

Page 179: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

85 Parameters86 ----------87 namefile : str88 The name of the CSV file.89 header : list90 The header of the CSV file.91 matrix : list92 The body of the CSV file.93

94 Returns95 -------96 A CSV file97

98 Examples99 --------

100 >>> writeCSV('mydata', ['x','y'], [[1,2],[3,4]])101 """102 with open(namefile+'.csv', 'w') as fp:103 a = csv.writer(fp, delimiter=',')104 a.writerow(header)105 a.writerows(matrix)106

107 def adjustPD(matrixValue, PD, client1_seed):108 """109 Adjust probability of defautl given correlations.110

111 Parameters112 ----------113 matrixValue : float114 The correlation matrix value.115 PD: foat116 The initial PD value.117 client1_seed: int

150

Page 180: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

118 1 or 0119

120 Returns121 -------122 A float number representing the new PD.123

124 Examples125 --------126 >>> new_PD = adjustPD(-0.5, 0.4, 1)127 """128 if client1_seed == 1:129 if matrixValue >= 0:130 return PD+(1-PD)*matrixValue131 else:132 return PD*(1+matrixValue)133 else:134 if matrixValue >= 0:135 return PD*(1-matrixValue)136 else:137 return PD-(1-PD)*matrixValue138

139

140 #%% Simulation parameters.141 """142 Options to introduce the number of clients and the number of

sectors we want to↪→

143 simulate. We use the optparse library.144 """145

146 #Using optparse library:147 """148 This allows the user to specify the number of clients, the

number of↪→

151

Page 181: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

149 sectors and the number of times we are simulating. Alsa isdefined the↪→

150 name of the directory we want to contain the test files.151 """152 parser = optparse.OptionParser('usage %prog '+'-c <number of

clients (int)>\↪→

153 -s <number of sectors (int)>')154 parser.add_option('-c', dest = 'numberClients', type = 'int',\155 help = 'specify number of clients')156 parser.add_option('-s', dest = 'numberSectors', type = 'int',\157 help = 'specify number of sectors')158 parser.add_option('-t', dest = 'testOption', type = 'str', \159 help = 'specify test directory name')160 parser.add_option('-n', dest = 'numberFiles', type = 'int',\161 help = 'specify the number of files we want to \162 generate for each scenario')163 (options, args) = parser.parse_args()164 if options.numberClients == None or options.numberSectors ==

None:↪→

165 print parser.usage166 exit(0)167 number_clients = options.numberClients168 number_sectors = options.numberSectors169 number_files = options.numberFiles170 if options.testOption != None:171 test_directory = options.testOption172 os.mkdir(test_directory)173 os.chdir(test_directory)174

175

176 #%% Initialize datfile format.177 """178 The header of the CSV file and matrix size are static.

152

Page 182: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

179 """180

181 """182 In order to create the headline of the CSV files we create a

string where are↪→

183 added the parameters. The number of sectors will be a variableintroduced when↪→

184 the program is called. Then we decompose the string in orderto create a list↪→

185 of parmeters.186 """187 str_sector = ''188 for i in range(number_sectors):189 str_sector = str_sector+'Sector_'+str(i+1)+','190 data = 'Clients,Exposure At Default,Probability of

Default,Default \↪→

191 Volatility,' + str_sector + 'Loss Given Default,NetIncome,Default Event'↪→

192 data_list = data.split(',')193

194 """195 Initializacing the matrix.196 """197 TCPOP_matrix = [len(data_list)*[0] for i in

range(number_clients)]↪→

198

199 """200 Creating a list of distributions.201 """202 distributions = ['Normal', 'Uniform']203

204

205 #%% Initialize client data.

153

Page 183: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

206 for y in ['LV', 'HV']:207 for k in range(number_files):208

209 """210 In this section are introduced the characteristic

parameters of the↪→

211 clients, that are considered to be obtained throughsome↪→

212 quantitative methods:213

214 - Exposure At Default.215 - Probability of Default.216 - Default Volatility217 - Net Income.218 """219

220 """221 Some notes of each parameter:222 - PD: Probability of Default. It is simulated in

range 1% to 40%.↪→

223 - DV: Default Volatility. Considered as the half ofPD.↪→

224 - EAD: Exposure At Default. Positive correlatedwith PD.↪→

225 - NI: Net Income. Negative correlated with EAD.226 """227 PD = [round(np.random.choice(range(1,41))/100.,2) for x

in \↪→

228 range(number_clients)]229 DV = [x/2 for x in PD]230 EAD1 = [int(abs(np.random.normal(1000+69000./0.39*x,13 ⌋

000)))\

↪→

↪→

154

Page 184: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

231 for x in PD]232 EAD2 = [np.random.choice(distributions) for x in EAD1]233 EAD3 = [0 for x in EAD1]234

235 """236 Recalculating EAD2237 """238 EAD21 = []239 for c in range(len(EAD2)):240 if EAD2[c] == 'Normal':241 if y == 'LV':242 EAD2[c] += '('+str(EAD1[c])+','\243 +str(int(np.random.uniform(EAD1[c]/6.)))+')'244 else:245 EAD2[c] += '('+str(EAD1[c])+','\246 +str(int(np.random.uniform(EAD1[c]/2.)))+')'247 elif EAD2[c] == 'Uniform':248 if y == 'LV':249 EAD2[c] += '('+str(EAD1[c]-int(EAD1[c]/6.))\250 +','+str(EAD1[c]+int(EAD1[c]/6.))+')'251 else:252 EAD2[c] += '('+str(EAD1[c]-int(EAD1[c]/2.))\253 +','+str(EAD1[c]+int(EAD1[c]/2.))+')'254 EAD21.append(EAD2[c])255

256 """257 Extracting the matrix of distributions258 """259 for i in range(len(EAD2)):260 EAD2[i] = [EAD2[i][0:EAD2[i].index('(')], \261 EAD2[i][EAD2[i].index('(')+1:EAD2[i].index \262 (',')],EAD2[i][EAD2[i].index(',')+1:EAD2[i].

index(')')]]↪→

155

Page 185: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

263 EAD2[i][1] = int(EAD2[i][1])264 EAD2[i][2] = int(EAD2[i][2])265 disMatrix = EAD2[:]266

267 """268 Recalculating EAD3269 """270 for i in range(len(disMatrix)):271 if disMatrix[i][0] == 'Uniform':272 EAD3[i] = int(np.random.uniform(disMatrix[i][1],\273 disMatrix[i][2]))274 elif disMatrix[i][0] == 'Normal':275 EAD3[i] = int(np.random.normal(disMatrix[i][1],\276 disMatrix[i][2]))277

278 EAD = [(x,w,z) for x,w,z in zip(EAD1,EAD21,EAD3)]279 NI = [round(abs(np.random.normal(0.4-0.1/69000.*x,0.02 ⌋

)),2)\

↪→

↪→

280 for x in EAD1]281

282 """283 Calculating matrix of sector weights:284 """285 sectorWeights = [randomWeights(number_sectors) for i in

\↪→

286 range(number_clients)]287

288 """289 Calculating the correlation matrix:290 """291 correlationMatrix = np.corrcoef(sectorWeights)292

156

Page 186: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

293 """294 The Default Event is a list containing True or False

if the client will↪→

295 default or not given the Probability of Default. Itwill be used↪→

296 to measure the performance of the portfolios.297 """298 client_1 = np.random.random()<PD[0]299 new_PD = [adjustPD(p,b,client_1) for p,b in \300 zip(correlationMatrix[0,1:], PD[1:])]301 DE_0 = [np.random.random()<x for x in new_PD]302 DE = [client_1]+DE_0303

304

305 #%% Generating the files.306 """307 Steps for generating the files:308

309 1 - Introduce specific parameters in the matrix.310 2 - Write the matrix in a CSV file.311 """312

313 """314 1 - Introducing client parameters in the matrix.315 """316 for i in range(number_clients):317 TCPOP_matrix[i][data_list.index('Clients')] =

'Client_'+str(i+1)↪→

318 TCPOP_matrix[i][data_list.index('Loss GivenDefault')] = 1↪→

319 TCPOP_matrix[i][data_list.index('Exposure AtDefault')] = EAD[i]↪→

157

Page 187: Algoritmos Simheurísticos para la Optimización del Crédito ...openaccess.uoc.edu/.../10609/66245/7/jfeliciTFM0617memoria.pdf · Trabajo Final de Máster Autor: ... IV Experimentos

B. CÓDIGO GENERADOR DE DATOS

320 TCPOP_matrix[i][data_list.index('Probability ofDefault')] = PD[i]↪→

321 TCPOP_matrix[i][data_list.index('DefaultVolatility')] = DV[i]↪→

322 TCPOP_matrix[i][data_list.index('Net Income')] =NI[i]↪→

323 TCPOP_matrix[i][data_list.index('Default Event')] =DE[i]↪→

324 TCPOP_matrix[i][data_list.index('Sector_1'):data_l ⌋

ist.index(\↪→

325 'Sector_'+str(number_sectors))+1] = sectorWeights[i]326

327 """328 2 - Writting the matrix in CSV format.329 """330 if y == 'LV':331 writeCSV(y+'_dataTest_'+str(k), data_list,

TCPOP_matrix)↪→

332 else:333 writeCSV(y+'_dataTest_'+str(k), data_list,

TCPOP_matrix)↪→

158