scieee AI-readable full text Open interactive document viewer

Desarrollo de una aplicación web para el backtesting de estrategias de trading

Figueros Sentana, Salvador

Abstract

El trabajo aquí presentado consiste en la especificación, diseño e implementación de una aplicación web que permita la ejecución del “backtesting” de estrategias de trading. El usuario va a poder ejecutar, a través de esta aplicación, el “backtesting” de una estrategia basada en la compra o en la venta de un activo financiero en el máximo o en el mínimo de su precio para un período temporal dado. Los datos de los precios de los activos financieros son extraídos de Yahoo! Finance y se ha seguido un diseño guiado por eventos para la implementación del simulador. La aplicación también proporciona la infraestructura necesaria para llevar a cabo la gestión de carteras. En concreto, permite la creación de carteras financieras y la optimización de estas en base al método del análisis de la varianza media. Además, también se han desarrollado otra serie de servicios con una gran aplicación práctica en la operativa del trader. Finalmente, la aplicación permite la compartición de información entre los usuarios registrados, favoreciendo el intercambio de ideas y la creación de una comunidad de gente interesada en las finanzas cuantitativas.

Full text

DESARROLLO DE UNA APLICACIÓN WEB PARA EL BACKTESTING DE ESTRATEGIAS DE TRADING DEVELOPMENT OF A WEB APPLICATION FOR THE BACKTESTING OF TRADING STRATEGIES TRABAJO DE FIN DE GRADO CURSO 2021-2022 AUTOR SALVADOR FIGUEROS SENTANA DIRECTOR ANTONIO SARASA CABEZUELO DOBLE GRADO ADE – INGENIERÍA INFORMÁTICA FACULTAD DE INFORMÁTICA UNIVERSIDAD COMPLUTENSE DE MADRID DESARROLLO DE UNA APLICACIÓN WEB PARA EL BACKTESTING DE ESTRATEGIAS DE TRADING DEVELOPMENT OF A WEB APPLICATION FOR THE BACKTESTING OF TRADING STRATEGIES TRABAJO DE FIN DE GRADO EN INGENIERÍA INFORMÁTICA AUTOR SALVADOR FIGUEROS SENTANA DIRECTOR ANTONIO SARASA CABEZUELO CONVOCATORIA: JUNIO 2022 DOBLE GRADO ADE – INGENIERÍA INFORMÁTICA FACULTAD DE INFORMÁTICA UNIVERSIDAD COMPLUTENSE DE MADRID II RESUMEN El trabajo aquí presentado consiste en la especificación, diseño e implementación de una aplicación web que permita la ejecución del “backtesting” de estrategias de trading. El usuario va a poder ejecutar, a través de esta aplicación, el “backtesting” de una estrategia basada en la compra o en la venta de un activo financiero en el máximo o en el mínimo de su precio para un período temporal dado. Los datos de los precios de los activos financieros son extraídos de Yahoo! Finance y se ha seguido un diseño guiado por eventos para la implementación del simulador. La aplicación también proporciona la infraestructura necesaria para llevar a cabo la gestión de carteras. En concreto, permite la creación de carteras financieras y la optimización de estas en base al método del análisis de la varianza media. Además, también se han desarrollado otra serie de servicios con una gran aplicación práctica en la operativa del trader. Finalmente, la aplicación permite la compartición de información entre los usuarios registrados, favoreciendo el intercambio de ideas y la creación de una comunidad de gente interesada en las finanzas cuantitativas. Palabras clave backtesting, estrategia, trading, trader, carteras, Python, finanzas cuantitativas III ABSTRACT The work here presented consists in the specification, design and implementation of a web application that allows the execution of the backtesting of trading strategies. The user of this web application is going to be able to execute the “backtesting” of a strategy based on buying or selling an asset at its highs or lows of a given time frame. The price data for the assets is pulled out from Yahoo! Finance and the backtester has been built by programming an Event-Driven system. The application also provides the necessary infrastructure for portfolio management. Specifically, it allows the creation of a portfolio and its optimization based on the mean-variance analysis. Moreover, several other trading services have also been developed which could prove to be of great use for the trader. Finally, the application allows the users to share information with each other and thus presents an opportunity for the creation of a community of people interested in quantitative finance. Keywords backtesting, strategy, trading, trader, portfolios, Python, quantitative finance IV ÍNDICE DE CONTENIDOS Resumen .................................................................................................................................... II Abstract .................................................................................................................................... III Índice de contenidos ............................................................................................................. IV Índice de ilustraciones .......................................................................................................... VII Índice de tablas ...................................................................................................................... XII Capítulo 1 - Introducción .......................................................................................................14 1.1 Motivación ....................................................................................................................14 1.2 Objetivos ........................................................................................................................14 1.3 Plan de trabajo .............................................................................................................15 1.4 Estructura de la memoria .............................................................................................18 Chapter - Introduction ...........................................................................................................20 Capítulo 2 - Estrategia de Trading ........................................................................................26 2.1 Idea general .................................................................................................................26 2.2 Entradas .........................................................................................................................26 2.3 Salidas ............................................................................................................................26 2.4 Activos financieros ........................................................................................................27 Capítulo 3 - Estado del arte ...................................................................................................28 Capítulo 4 - Tecnología empleada ......................................................................................31 4.1 Herramientas Frontend .................................................................................................31 4.1.1 Bootstrap 5 ..............................................................................................................31 4.1.2 Jinja2 .......................................................................................................................31 4.1.3 jQuery ......................................................................................................................31 4.2 Herramientas Backend .................................................................................................32 V 4.2.1 Python .....................................................................................................................32 4.2.2 Flask .........................................................................................................................32 4.2.3 MySQL .....................................................................................................................32 4.3 Otras herramientas .......................................................................................................33 4.3.1 Visual Studio Code .................................................................................................33 4.3.2 XAMPP .....................................................................................................................33 4.3.3 Git ............................................................................................................................33 Capítulo 5 - Casos de uso ......................................................................................................34 5.1 Actores ...........................................................................................................................34 5.2 Especificación de requisitos .........................................................................................34 5.2.1 Cuentas de usuario ................................................................................................35 5.2.2 Backtesting estrategia de trading ........................................................................39 5.2.3 Carteras de activos financieros de los usuarios ..................................................49 5.2.4 Otros servicios de trading ......................................................................................53 5.2.5 Administrar datos ...................................................................................................55 Capítulo 6 - Arquitectura .......................................................................................................58 6.1 Arquitectura del sistema ..............................................................................................58 6.2 Patrones arquitectónicos .............................................................................................59 6.2.1 MVC (Modelo-Vista-Controlador) ........................................................................59 6.2.2 DAO .........................................................................................................................60 6.3 Patrones de diseño .......................................................................................................61 6.3.1 Patrón Factoría .......................................................................................................61 6.3.2 Patrón Singleton .....................................................................................................62 Capítulo 7 - Modelo de datos ...............................................................................................63 7.1 Modelo Entidad-Relación ............................................................................................63 VI 7.2 Implementación de la base de datos ........................................................................66 7.2.1 Tablas sobre las cuentas de usuario .....................................................................67 7.2.2 Tablas sobre “Backtesting” ....................................................................................67 7.2.3 Tablas sobre gestión de carteras ..........................................................................68 7.2.4 Tablas sobre otros servicios de trading .................................................................70 7.2.5 Tablas sobre administrar datos .............................................................................71 Capítulo 8 - Diseño .................................................................................................................73 8.1 Diseño de la interfaz visual ...........................................................................................73 8.2 Funcionalidad de la aplicación ..................................................................................74 8.2.1 Dashboard ..............................................................................................................74 8.2.2 Funcionalidad del “Backtesting” ..........................................................................76 8.2.3 Funcionalidad de la gestión de carteras .............................................................86 8.2.4 Funcionalidad de otros servicios de trading ........................................................94 8.2.5 Funcionalidad de la administración de los datos históricos ..............................97 Capítulo 9 - Conclusiones y trabajo futuro ...........................................................................98 9.1 Conclusiones .................................................................................................................98 9.2 Trabajo futuro ................................................................................................................98 Chapter - Conclusions and future work .............................................................................. 100 Bibliografía............................................................................................................................. 102 Apéndices ............................................................................................................................. 106 VII ÍNDICE DE ILUSTRACIONES Ilustración 1. Diagrama de Gantt Etapa 1 ...........................................................................16 Ilustración 2. Diagrama de Gantt Etapa 2 ...........................................................................16 Ilustración 3. Diagrama de Gantt Etapa 3 ...........................................................................17 Ilustración 4. Diagrama de Gantt Etapa 4.1 ........................................................................17 Ilustración 5. Diagrama de Gantt Etapa 4.2 ........................................................................17 Ilustración 6. Diagrama de Gantt Etapa 5 ...........................................................................18 Ilustración 7. Diagrama de Gantt Etapa 6 ...........................................................................18 Ilustración 8. Gantt Chart Phase 1.........................................................................................21 Ilustración 9. Gantt Chart Phase 2.........................................................................................22 Ilustración 10. Gantt Chart Phase 3 .......................................................................................22 Ilustración 11. Gantt Chart Phase 4.1 ....................................................................................23 Ilustración 12. Gantt Chart Phase 4.2 ....................................................................................23 Ilustración 13. Gantt Chart Phase 5 .......................................................................................23 Ilustración 14. Gantt Chart Phase 6 .......................................................................................24 Ilustración 15. Arquitectura del sistema ................................................................................58 Ilustración 16. Ejemplo de la implementación MVC en Flask .............................................59 Ilustración 17. Diagrama de clases del patrón DAO ...........................................................60 Ilustración 18. Diagrama de clase del patrón Factoría.......................................................61 Ilustración 19. Diagrama de clases del patrón Singleton ....................................................62 Ilustración 20. Diagrama Entidad-Relación ..........................................................................65 Ilustración 21. Implementación de la base de datos ..........................................................66 Ilustración 22. Plantilla "Portal" ...............................................................................................73 Ilustración 23. Vista Dashboard .............................................................................................75 VIII Ilustración 24. Vista Backtesting configurado ......................................................................76 Ilustración 25. Clase SignalEvent ...........................................................................................77 Ilustración 26. Clase OrderEvent............................................................................................78 Ilustración 27. Clase FillEvent..................................................................................................78 Ilustración 28. Clase HistoricDBDatahandler ........................................................................79 Ilustración 29. Método _get_new_bar() ................................................................................80 Ilustración 30. Método update_bars() ..................................................................................80 Ilustración 31. Clase BuyMaxStrategy ...................................................................................81 Ilustración 32. Método calculate_signals() ...........................................................................82 Ilustración 33. Clase PortfolioBacktesting .............................................................................83 Ilustración 34. Método generate_order() .............................................................................83 Ilustración 35. Clase SimulatedExecutionHandler ................................................................84 Ilustración 36. Algoritmo del backtesting .............................................................................84 Ilustración 37. Gráfico con las señales de trading ...............................................................85 Ilustración 38. Vista gestión de carteras ...............................................................................86 Ilustración 39. Clase Transaction ...........................................................................................87 Ilustración 40. Código para crear una transacción ............................................................88 Ilustración 41. Código para abrir una posición ....................................................................88 Ilustración 42. Código para crear una posición ..................................................................89 Ilustración 43. Código para ejecutar una transacción .......................................................89 Ilustración 44. Código para crear una cartera ....................................................................89 Ilustración 45. Clase PositionHandler .....................................................................................90 Ilustración 46. Código para modificar una posición ...........................................................90 Ilustración 47. Código para obtener el valor de mercado de la cartera .........................91 15 Este objetivo se puede dividir en los siguientes objetivos específicos: • Desarrollar una aplicación web que permita al usuario configurar la cartera, elegir los activos financieros y parametrizar la estrategia de trading sobre los que correr el “backtesting”. • Implementar una funcionalidad que permita al usuario gestionar carteras financieras. • Implementar una funcionalidad que permita al usuario subir al sistema los datos históricos de los precios de los activos financieros que este quiera. • Desarrollar una aplicación web que permita la gestión, colaboración y compartición de información (“backtestings” ejecutados y carteras financieras) entre los usuarios suscritos. o Implementar una funcionalidad que permita la gestión de cuentas de usuario. o Implementar una funcionalidad que permita a un usuario registrado guardar y compartir los “backtesting” ejecutados. o Implementar una funcionalidad que permita a un usuario registrado compartir una cartera financiera. • Implementar otras funcionalidades que sirvan de ayuda a un trader. o Implementar una funcionalidad que permita al usuario llevar un diario de trading. o Implementar una funcionalidad que permita al usuario realizar un “backtesting” de forma manual. • Diseñar una API que sea intuitiva, minimalista y al mismo tiempo contenga una cantidad de información lo suficientemente exhaustiva. 1.3 Plan de trabajo Para el cumplimiento de los objetivos específicos enumerados en el anterior apartado, se han seguido una serie de etapas. A continuación, se explican cuáles han sido estas etapas y se muestra el Diagrama de Gantt correspondiente a cada una de ellas. 16 Etapa 1: Especificación de Requisitos Esta etapa inicial ha consistido en la discusión y especificación de los casos de uso que iba a tener la aplicación web a desarrollar. Ilustración 1. Diagrama de Gantt Etapa 1 Etapa 2: Creación de la Aplicación Web e Implementación de las Cuentas de Usuario En esta segunda etapa se ha desarrollado el código necesario para la creación de la aplicación web. Una vez hecho esto, se ha implementado la gestión de las cuentas de usuario y, después, la funcionalidad relacionada con la gestión de los datos históricos de los precios de los activos. Ilustración 2. Diagrama de Gantt Etapa 2 Etapa 3: Implementación de la Gestión de Carteras En esta etapa se ha realizado la implementación de la gestión de carteras. En concreto, se han desarrollado todas las funcionalidades necesarias para ello: crear, ver, modificar, publicar y eliminar una cartera. 17 Ilustración 3. Diagrama de Gantt Etapa 3 Etapa 4: Implementación del “Backtesting” En esta etapa se ha realizado la implementación de la funcionalidad principal de la aplicación: “Backtesting”. Para ello, en primer lugar, se ha realizado el desarrollo del código necesario para le ejecución del “backtesting” de la estrategia de trading aquí implementada. Una vez hecho esto, se ha desarrollado la infraestructura necesaria para su gestión. Aquí entra todo lo que tiene que ver con guardar, ver, publicar y eliminar un “backtesting” creado. Ilustración 4. Diagrama de Gantt Etapa 4.1 Ilustración 5. Diagrama de Gantt Etapa 4.2 18 Etapa 5: Implementación de Otros Servicios de Trading En primer lugar, en esta etapa se ha implementado el Diario de Trading. Después, se ha desarrollado la funcionalidad relacionada con el “Backtesting” Manual. Ilustración 6. Diagrama de Gantt Etapa 5 Etapa 6: Desarrollo de la Interfaz Visual Esta etapa ha consistido en el desarrollo de la API de la aplicación web. Ilustración 7. Diagrama de Gantt Etapa 6 1.4 Estructura de la memoria A continuación, se describe de forma breve los principales capítulos en los que se divide la memoria: • Capítulo 1: Este capítulo está dedicado a la motivación del trabajo, los objetivos, el plan de trabajo seguido y la estructura de la memoria. 19 • Capítulo 2: Este capítulo está dedicado a la explicación de la estrategia de trading implementada. • Capítulo 3: Este capítulo está dedicado a la descripción de aplicaciones que ofrecen funcionalidades similares a las implementadas en este proyecto. • Capítulo 4: Este capítulo está dedicado a presentar las tecnologías que se han utilizado en la realización del proyecto. • Capítulo 5: Este capítulo está dedicado a la descripción de los actores y la especificación de requisitos realizada. • Capítulo 6: En este capítulo se hace una descripción de la arquitectura que se ha seguido para el desarrollo e implementación de la aplicación web. • Capítulo 7: En este capítulo se explica el modelo de datos que se ha definido para realizar la persistencia de la información gestionada por la aplicación web. • Capítulo 8: En este capítulo se va a realizar una descripción de las principales funcionalidades implementadas y el diseño que se ha seguido para cada una de ellas. • Capítulo 9: Este capítulo está dedicado a las conclusiones del trabajo y las líneas de trabajo planteadas de cara al futuro. • Bibliografía: Esta sección contiene un listado con todas las fuentes bibliográficas utilizadas en la realización del trabajo. • Apéndices: Manual de usuario 20 Chapter - Introduction Motivation A trading strategy is the action plan one follows with the intention of being profitable in trading the financial markets. Therefore, a trading strategy is a system made up of a group of rules previously defined which signal which assets to buy or sell, when to buy or sell those assets, which percentage of the capital to allocate to those buys or sells, and how to manage the risk associated with one trade and with the portfolio overall. Before applying a trading strategy in a live environment, it is necessary to assess the profitability of the strategy. That is where the backtesting comes into play. Backtesting a trading strategy is the method by which it is possible to evaluate how a trading strategy would have behaved over a set of historical data. Therefore, running the backtesting of a trading strategy is like running a simulation using past data. Now, there are a lot of investors who do not know how to program a backtesting. Although executing a backtesting by hand over a short period of time is something anybody can do, this task becomes difficult, if not impossible, when the length of the period is increased. To address this problem, this project focuses on the development of a web application that provides necessary features to run a backtesting. To that end, the application is going to use a trading strategy based on buying or selling at its highs or lows of a given time frame. Objectives The main objective of this project is the development of a web application that allows a user to run the backtesting of a trading strategy over a set of historical data. This objective can be divided among the following specific objectives: • Develop a web application that allows a user to design the portfolio, choose the assets, and change the parameters of the strategy on which the backtesting is going to be executed. • Develop a functionality for portfolio management. • Develop a functionality for uploading historical data to the system. • Develop a web application where users can collaborate and share information (backtesting information and portfolios) with each other. o Develop a functionality for managing user accounts. 21 o Develop a functionality for saving and sharing backtesting information. o Develop a functionality for sharing portfolios. • Develop other functionalities for helping a user to trade the financial markets. o Create a trading journal. o Develop a functionality for backtesting by hand. • Design an intuitive, minimalist, and at the same time thorough visual interface. Work plan In order to satisfy all the specific objectives laid out in the previous section, the work plan has been divided into a series of phases. Next is a description of all these phases with their corresponding Gantt Chart. Phase 1: Specification of Requirements This initial phase has consisted in the discussion and specification of the use cases which have been implemented during the development of the web application. Ilustración 8. Gantt Chart Phase 1 Phase 2: Creation of the Web App and Implementation of User Accounts This second phase has been devoted to the development of the necessary code for the creation of the web application. The next steps have been the implementation of the user accounts management and then, the functionality related to the handling of the historical price data. 22 Ilustración 9. Gantt Chart Phase 2 Phase 3: Implementation of Portfolio Management This phase has been devoted to the implementation of portfolio management. In particular, the following functionalities have been developed: create, view, modify, share and delete a portfolio. Ilustración 10. Gantt Chart Phase 3 Phase 4: Implementation of Backtesting This phase has been focused on the implementation of the main functionality of the application: the backtesting. For that, the first thing that has been done has been the development of the code necessary for the execution of the backtesting of the trading strategy here implemented. The next step has been the development of the infrastructure necessary for the management of the backtestings. This has included saving, sharing, and deleting a previously created backtesting. 23 Ilustración 11. Gantt Chart Phase 4.1 Ilustración 12. Gantt Chart Phase 4.2 Phase 5: Implementation of Other Trading Services First, this phase has been devoted to the implementation of the Trading Journal. Once this was finished, the next step has been the implementation of the backtesting by hand functionality. Ilustración 13. Gantt Chart Phase 5 24 Phase 6: Development of the Visual Interface This phase has consisted in the development of the API for the web application. Ilustración 14. Gantt Chart Phase 6 Structure of the memory Th structure of the memory is briefly described below: • Chapter 1: This chapter is devoted to the motivation behind this work, the objectives, the work plan, and the structure of the memory. • Chapter 2: This chapter is devoted to the explanation of the trading strategy here implemented. • Chapter 3: This chapter describes the applications that offer similar functionalities to the ones here implemented. • Chapter 4: This chapter describes the technology that has been used throughout the development of the project. • Chapter 5: This chapter describes the actors of the system and their use cases. • Chapter 6: This chapter is devoted to describing the architecture which has been followed to build the web application. • Chapter 7: This chapter explains the data model which has been defined to store the data handled by the web application. • Chapter 8: This chapter describes the main functionalities which have been implemented and the design which has been followed to do so. 31 Capítulo 4 - Tecnología empleada Este capítulo está dedicado a presentar las tecnologías que se han utilizado para la implementación de la aplicación del proyecto. 4.1 Herramientas Frontend 4.1.1 Bootstrap 5 Bootstrap 5 [8] es un framework totalmente gratuito que se usa para el desarrollo de aplicaciones web. Incluye HTML, CSS y Javascript y hoy en día es el framework de front-end más popular a nivel mundial. Permite la creación de aplicaciones web de forma flexible y reactiva sin muchas complicaciones ni esfuerzos. En este proyecto, Bootstrap 5 se ha utilizado para el desarrollo de la interfaz visual de la aplicación web, haciendo uso de los componentes ofrecidos por este framework tales como formularios, botones, flashcards, barras de navegación o acordeones. 4.1.2 Jinja2 Jinja2 [9] es un motor de templates para Python incorporado en el framework Flask. Un template es un archivo de texto que contiene una serie de variables y expresiones que JInja2 reemplaza por las variables pasadas a través de los métodos incorporados en el framework Flask. En este proyecto, Jinja2 se ha utilizado para la separación de la lógica del sistema de la presentación de este. Las posibilidades que ofrece esta herramienta son muchas y ello ha permitido la implementación de una aplicación web de una forma más limpia y ordenada. 4.1.3 jQuery jQuery [10] es una librería de JavaScript que permite la manipulación de elementos de HTML, la gestión de eventos, la animación y el uso de Ajax de una forma muy sencilla. En este proyecto, el principal uso de jQuery ha sido el de poder utilizar JavaScript de una forma mucho más fácil. Además, se ha utilizado también para aquellos aspectos de la interfaz visual a los que el uso de Bootstrap 5 no alcanzaba. 32 4.2 Herramientas Backend 4.2.1 Python Python [11] es un lenguaje de programación interpretado y de alto nivel cuya principal filosofía radica en su fácil legibilidad. Es un lenguaje multiparadigma, dinámico y multiplataforma. Actualmente, cuenta con una comunidad muy grande y un número muy alto de librerías que hacen de su uso una elección muy deseable. En este proyecto, Python se ha utilizado como lenguaje de programación de la lógica del programa. En concreto, se elegido el uso de Python como lenguaje de programación para la lógica del sistema por la posibilidad que ofrece este de utilizar las librerías de análisis de datos Pandas y Numpy. 4.2.2 Flask Flask [12] es un microframework para Python que permite la creación de aplicaciones web de una forma bastante rápida. El concepto de microframework hace referencia a marcos de aplicaciones minimalistas que, a diferencia de los marcos de aplicación completos (“macroframework”), suelen enfocarse exclusivamente en el manejo de solicitudes HTTP y dejan de lado otros aspectos más complejos. En este proyecto, Flask se ha utilizado para el desarrollo de la aplicación web bajo el patrón Modelo-Vista-Controlador. 4.2.3 MySQL MySQL [13] es un sistema de gestión de bases de datos relacional de código abierto. A diferencia de otros proyectos con funciones parecidas, MySQL está desarrollada por una empresa privada, Oracle Corporation, la cual tiene los derechos de la mayor parte del código. Además, MySQL utiliza también el modelo cliente-servidor. Los datos residen en la parte del servidor y el cliente envía peticiones a este para aquellos datos que el cliente necesita. En este proyecto, MySQL se ha utilizado para la gestión de la base de datos de la aplicación web. Por ejemplo, los datos de los usuarios o los precios de los activos financieros han sido guardados en el servidor de este modelo para su posterior utilización y consulta durante la ejecución de la aplicación. 33 4.3 Otras herramientas 4.3.1 Visual Studio Code Visual Studio Code [14] es un editor de código desarrollado para Microsoft, Linux, macOS y Web. Incluye soporte para la depuración, ejecución de tareas, resaltado de sintaxis, finalización inteligente de código y control de versiones. El desarrollo de los archivos de texto que componen la aplicación web se ha hecho en su totalidad a través de esta herramienta. En concreto, este IDE se ha utilizado para el desarrollo de archivos con extensión “.py”, “.html”, “.css” y “.js”. 4.3.2 XAMPP XAMPP [15] es una distribución de Apache que consiste básicamente en el sistema de gestión de base de datos MySQL, el servidor Apache y los intérpretes para lenguajes de script PHP y Perl. Es gratuita y fácil de instalar. De hecho, una de sus principales virtudes reside en la facilidad de instalación y uso que brinda dicho paquete. Está disponible en Windows, Linux y macOS. En este proyecto, XAMPP se ha utilizado para la gestión de la base de base de datos a través de MySQL. Se ha hecho uso de esta herramienta para diseñar, configurar, crear y modificar las varias tablas y relaciones que componen la base de datos del sistema. 4.3.3 Git Git [16] es un software gratuito y de código abierto que sirve para el control de versiones en el desarrollo de proyectos tanto grandes como pequeños. Está pensado para el mantenimiento de versiones de una forma rápida y eficiente. Hoy en día, este software de control de versiones es el más utilizado del mundo. Por lo tanto, esta herramienta ha sido utilizada con la finalidad de llevar a cabo una coordinación y mantenimiento de las versiones de una forma confiable, eficiente y rápida a lo largo de todo el proyecto. 34 Capítulo 5 - Casos de uso Este capítulo está dedicado a la descripción de los actores y la especificación de requisitos realizada. 5.1 Actores A continuación, se enumeran cuáles son los principales actores del sistema y se realiza la descripción correspondiente de cada uno de ellos: • Usuario registrado: Aquellos usuarios que se registren en la aplicación podrán disponer de una serie de privilegios frente aquellos usuarios que no lo hagan. Podrán realizar todos los tipos de “backtesting” y simulaciones, disponer de carteras de activos financieros y disfrutar de otras funcionalidades como el diario de trading y el “backtesting” manual. Además, podrán compartir contenido (“backtesting” y carteras) con el resto de los usuarios y ver el contenido compartido por el resto de los usuarios igualmente. • Usuario no registrado: este tipo de usuario podrá navegar por la aplicación y utilizar alguna de sus funcionalidades, pero no podrá disfrutar de todo el repertorio ofrecido por la aplicación. En concreto, este tipo de usuario podrá realizar “backtesting” y búsquedas, pero no podrá compartir contenido, configurar carteras de activos financieros y disfrutar de otras funcionalidades como el diario de trading. • Administrador: este usuario se dedicará a la gestión de las cuentas de usuario (dar de baja cuentas de usuario y modificar las cuentas de usuario). Además, podrá administrar los datos almacenados en la aplicación (5.2.5 Administrar datos). 5.2 Especificación de requisitos En esta sección se van a explicar los casos de uso definidos para la aplicación. Para ello los casos de uso se han agrupado modularmente de la siguiente forma: 1. Cuentas de usuario 2. Backtesting 3. Gestión de carteras 4. Otros servicios de trading 5. Administración de datos históricos 35 5.2.1 Cuentas de usuario Requisito Registrar usuario Identificador 1.1 Prioridad Alta Precondición NA Descripción Los usuarios pueden crearse una cuenta en esta aplicación. Entrada Nombre, Apellidos, Nombre de Usuario, Contraseña, Correo Electrónico Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y hace click en “Registrarse”. 2 El sistema muestra una pantalla en la que se le pide al usuario toda la información necesaria para registrarse. 3 El usuario rellena todos los campos y hace click en “Crear Cuenta”. 4 El sistema valida la información. 5 El sistema muestra de nuevo la pantalla principal. Postcondición Se ha creado la cuenta de usuario. Excepciones Paso Acción 3 Se muestra el mensaje correspondiente si la contraseña no cumple con los requisitos. 3 Se muestra el mensaje correspondiente si el correo electrónico no es correcto. 3 Se muestra el mensaje correspondiente si el correo electrónico o el nombre de usuario ya existen. Comentarios NA Actores Usuario no registrado, Admin Tabla 1. Registrar usuario 36 Requisito Login Identificador 1.2 Prioridad Alta Precondición El usuario ha de estar registrado. Descripción Los usuarios registrados pueden iniciar sesión. Entrada Nombre de Usuario, Correo Electrónico, Contraseña Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y hace click en “Login”. 2 El sistema muestra una pantalla en la que se le pide al usuario toda la información necesaria para iniciar sesión. 3 El usuario rellena todos los campos y hace click en “Login”. 4 El sistema valida la información. 5 El sistema muestra de nuevo la pantalla principal. Postcondición El usuario ha iniciado sesión. Excepciones Paso Acción 4 No se ha podido realizar el inicio de sesión. Comentarios NA Actores Usuario no registrado, Admin Tabla 2. Login Requisito Logout Identificador 1.3 Prioridad Alta Precondición El usuario ha de haber iniciado sesión. Descripción Los usuarios pueden salir de la sesión iniciada para iniciar una nueva sesión o navegar sin estar registrados. Entrada Nombre de usuario, Id de usuario 37 Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y hace click en “Logout”. 2 El sistema cierra la sesión y vuelve a la pantalla principal. Postcondición Se ha cerrado la sesión. Excepciones Paso Acción 2 No se puede cerrar sesión. Comentarios NA Actores Usuario registrado, Admin Tabla 3. Logout Requisito Dar de baja usuario Identificador 1.4 Prioridad Media Precondición El admin tiene que haberse registrado y tener una sesión iniciada. Descripción El admin puede eliminar cuentas de usuario. Entrada ID usuario, Nombre de Usuario Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y hace click en “Eliminar Usuario”. 2 El sistema muestra una pantalla en la que se le pide al usuario que introduzca el nombre del usuario que quiere eliminar. 3 El usuario introduce el nombre del usuario. 4 El sistema muestra una lista con los nombres de usuario que contengan la palabra introducida antes. 5 El usuario selecciona el usuario que quiere eliminar y hace click en “Eliminar”. 6 El sistema muestra un mensaje preguntando por la confirmación. 7 El usuario hace click en “Continuar”. 38 8 El sistema muestra la pantalla principal. Postcondición Se ha eliminado la cuenta de usuario. Excepciones Paso Acción 4 No se ha encontrado ningún usuario. 7 El usuario hace click en “Cancelar”. Comentarios NA Actores Admin Tabla 4. Dar de baja usuario Requisito Modificar datos de usuario Identificador 1.5 Prioridad Media Precondición El admin tiene que haberse registrado y tener una sesión iniciada. Descripción El admin puede modificar los datos de otras cuentas de usuario. Entrada ID usuario, Nombre de Usuario, Nombre, Apellidos, Correo Electrónico Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y hace click en “Modificar Usuario”. 2 El sistema muestra una pantalla en la que se le pide al usuario que introduzca el nombre del usuario que quiere modificar. 3 El usuario introduce el nombre del usuario. 4 El sistema muestra una lista con los nombres de usuario que contengan la palabra introducida antes. 5 El usuario selecciona el usuario que quiere modificar y hace click en “Modificar”. 6 El sistema muestra todos los datos del usuario. 7 El usuario modifica los datos y hace click en “Modificar”. 8 El sistema muestra un mensaje preguntando por la confirmación. 9 El usuario hace click en “Continuar”. 39 10 El sistema muestra los datos del usuario que se ha modificado. Postcondición Se han modificado los datos del usuario. Excepciones Paso Acción 4 No se ha encontrado ningún usuario. 9 El usuario hace click en “Cancelar”. 10 No se han podido modificar los datos del usuario. Comentarios NA Actores Admin Tabla 5. Modificar datos de usuario 5.2.2 Backtesting estrategia de trading Requisito Hacer el backtesting de un activo financiero concreto Identificador 2.1 Prioridad Alta Precondición El sistema tiene que tener datos históricos del activo financiero sobre el que se quiere hacer el backtesting. Descripción Realizar el backtesting de la estrategia de posiciones largas y cortas de máximos y mínimos sobre el activo financiero seleccionado por el usuario. Entrada Nombre del activo financiero, Capital inicial, Marco temporal, Tipo de salida Salida Resultado del backtesting Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y selecciona la opción “Realizar Backtesting” 2 El sistema muestra una nueva pantalla con todas las opciones de configuración necesarias para llevar a cabo el backtesting. 3 El usuario selecciona las opciones de configuración con las que hacer el backtesting y hace click en el botón “Backtesting”. 4 El sistema muestra los resultados del backtesting llevado a cabo. Postcondición NA 40 Excepciones Paso Acción Comentarios Las opciones de configuración para llevar a cabo el backtesting que el usuario necesita seleccionar son las siguientes: • Seleccionar el activo financiero sobre el que hacer el backtesting y el capital inicial. • Seleccionar el marco temporal de referencia a utilizar para calcular los máximos y los mínimos. • Seleccionar el tipo de salida que quiere efectuar: salida temporal o salida con trailing stop. • En caso de elegir la salida con trailing stop, seleccionar el multiplicador a utilizar. Actores Usuario registrado, Usuario no registrado Tabla 6. Hacer el backtesting de un activo financiero concreto Requisito Hacer el backtesting de una cartera de activos financieros Identificador 2.2 Prioridad Alta Precondición El sistema debe tener datos históricos de los activos financieros que van a componer la cartera sobre la que se quiere hacer el backtesting. Descripción Realizar el backtesting de la estrategia de posiciones largas y cortas de máximos y mínimos sobre una cartera formada por una serie de activos financieros seleccionados por el usuario. Entrada Nombres de los activos financieros, Nº de acciones/contratos, Capital inicial, Marco temporal, Tipo de salida Salida Resultado del backtesting Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y selecciona la opción “Realizar Backtesting de una Cartera” 2 El sistema muestra una nueva pantalla con todas las opciones de configuración necesarias para llevar a cabo el backtesting de una cartera. 3 El usuario selecciona las opciones de configuración con las que hacer el backtesting y hace click en el botón “Backtesting”. 4 El sistema muestra los resultados del backtesting llevado a cabo. Postcondición NA Excepciones Paso Acción Comentarios Las opciones de configuración para llevar a cabo el backtesting que el usuario necesita seleccionar son las siguientes: 47 Requisito Guardar backtesting Identificador 2.9 Prioridad Alta Precondición El usuario tiene que estar registrado y haber iniciado sesión. El usuario tiene que encontrarse en la pantalla que contiene los datos del backtesting realizado anteriormente y que ahora quiere guardar. Descripción Guardar la información de un backtesting realizado anteriormente con la intención de poder verlo después. Entrada ID del backtesting, Id usuario Salida NA Secuencia normal Paso Acción 1 El usuario se encuentra en la pantalla que contiene los resultados del backtesting y hace click en “Guardar”. 2 El sistema muestra un mensaje preguntando al usuario si quiere seguir adelante. 3 El usuario hace click en “Sí”. Postcondición Los datos del backtesting se han guardado. Excepciones Paso Acción 3 El usuario hace click en “No”. Comentarios Actores Usuario registrado Tabla 14. Guardar Backtesting Requisito Ver información de un backtesting Identificador 2.10 Prioridad Alta Precondición El backtesting debe existir. Descripción El usuario podrá ver la información relativa a un backtesting publicado por otro usuario. Entrada ID del backtesting Salida Información del backtesting Paso Acción 48 Secuencia normal 1 El usuario accede a una lista de backtestings. 2 El usuario selecciona un backtesting. 3 El sistema muestra la información del backtesting. Postcondición NA Excepciones Paso Acción Comentarios NA Actores Usuario registrado, Usuario no registrado Tabla 15. Ver información de un backtesting Requisito Realizar Análisis Descriptivo del Backtesting Identificador 2.11 Prioridad Baja Precondición El usuario tiene que estar registrado y tiene que existir el backtesting sobre el que se quiere realizar el análisis descriptivo. Descripción Se puede mostrar más información de carácter estadístico acerca del backtesting realizado previamente por el usuario. Entrada ID backtesting Salida Datos de carácter estadístico Secuencia normal Paso Acción 1 El usuario accede a una lista de backtestings. 2 El usuario selecciona un backtesting. 3 El sistema muestra la información del backtesting. 4 El usuario selecciona la opción “Análisis Descriptivo”. 5 El sistema muestra los resultados del análisis descriptivo. Postcondición NA Excepciones Paso Acción Comentarios NA Actores Usuario registrado Tabla 16. Realizar Análisis Descriptivo del Backtesting 49 5.2.3 Carteras de activos financieros de los usuarios Requisito Crear cartera de activos financieros Identificador 3.1 Prioridad Media Precondición El usuario ha de estar registrado y con la sesión iniciada. Descripción Se puede configurar una cartera de activos financieros para observar cómo evoluciona el rendimiento producido por ella en el tiempo. Entrada Nombres de los activos financieros, Nº de acciones/contratos, ID usuario Salida Cartera de activos financieros y rendimiento Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y selecciona la opción “Crear cartera” 2 El sistema muestra una pantalla en la que se le pide al usuario introducir los activos financieros que van a componer la cartera. 3 El usuario introduce el nombre de los activos financieros y el número de acciones/contratos de cada uno de ellos. 4 El usuario hace click en el botón “Crear”. Postcondición NA Excepciones Paso Acción 4 Se muestra un mensaje de error en caso de que se haya introducido un nombre que no existe o un valor negativo. Comentarios NA Actores Usuario registrado Tabla 17. Crear cartera de activos financieros Requisito Modificar cartera de activos financieros Identificador 3.2 Prioridad Media Precondición El usuario ha de estar registrado y con la sesión iniciada. La cartera tiene que existir. 50 Descripción Un usuario puede modificar una cartera suya comprando o vendiendo activos financieros. Entrada ID cartera, Nombres de los activos financieros, Nº de acciones/contratos, ID usuario Salida Cartera de activos financieros y rendimiento Secuencia normal Paso Acción 1 El usuario accede a la lista de sus carteras. 2 El usuario selecciona una cartera. 3 El sistema muestra una pantalla en la que se observan los datos de la cartera. 4 El usuario hace click en el botón “Modificar” 5 El sistema muestra una pantalla que permite comprar y vender activos financieros. 6 El usuario compra o vende activos financieros y hace click en “Finalizar”. 7 El sistema muestra de nuevo una pantalla en la que se observan los datos de la cartera. Postcondición NA Excepciones Paso Acción 6 Se muestra un mensaje de error en caso de que se haya introducido el nombre de un activo financiero que no existe o un número negativo. Comentarios NA Actores Usuario registrado Tabla 18. Modificar cartera de activos financieros Requisito Finalizar cartera de activos financieros Identificador 3.3 Prioridad Media Precondición El usuario ha de estar registrado y con la sesión iniciada. La cartera tiene que existir. Descripción Un usuario puede eliminar una cartera suya. Entrada ID Cartera, ID usuario Salida NA Paso Acción 51 Secuencia normal 1 El usuario accede a la lista de sus carteras. 2 El usuario selecciona una cartera. 3 El sistema muestra una pantalla en la que se observan los datos de la cartera. 4 El usuario hace click en el botón “Eliminar” 5 El sistema muestra un mensaje de confirmación. 6 El usuario hace click en “Continuar”. 7 El sistema vuelve a la lista de las carteras. Postcondición La cartera eliminada ya no existe. Excepciones Paso Acción 6 El usuario hace click en “Cancelar”. Comentarios NA Actores Usuario registrado Tabla 19. Finalizar cartera de activos financieros Requisito Compartir cartera de activos financieros Identificador 3.4 Prioridad Media Precondición El usuario ha de estar registrado y con la sesión iniciada. La cartera tiene que existir. Descripción Un usuario puede compartir una cartera suya para que el resto de usuarios pueda verla. Entrada ID cartera, ID usuario Salida NA Secuencia normal Paso Acción 1 El usuario accede a la lista de sus carteras. 2 El usuario selecciona una cartera. 3 El sistema muestra una pantalla en la que se observan los datos de la cartera. 4 El usuario hace click en el botón “Compartir” 5 El sistema muestra un mensaje de confirmación. 52 6 El usuario hace click en “Continuar”. 7 El sistema vuelve a mostrar los datos de la cartera. Postcondición La cartera es visible por el resto de los usuarios. Excepciones Paso Acción 6 El usuario hace click en “Cancelar”. Comentarios NA Actores Usuario registrado Tabla 20. Compartir cartera de activos financieros Requisito Buscar cartera de activos financieros Identificador 3.5 Prioridad Media Precondición NA Descripción Los usuarios pueden buscar las carteras compartidas por otros usuarios por el nombre de alguno de los activos financieros que componen dicha cartera. Entrada Nombre del activo financiero Salida Lista de carteras Secuencia normal Paso Acción 1 El usuario se encuentra en la pantalla principal, hace click en la barra de búsqueda e introduce el nombre del activo financiero. 2 El sistema muestra los resultados de la búsqueda. Postcondición NA Excepciones Paso Acción Comentarios NA Actores Usuario registrado, Usuario no registrado Tabla 21. Buscar cartera de activos financieros 53 Requisito Ver información de cartera de activos financieros Identificador 3.6 Prioridad Media Precondición La cartera debe existir. Descripción Se podrán ver los detalles que componen una cartera, en concreto, los activos financieros que la componen y el resultado arrojado por esta. Entrada ID cartera Salida Nombres de los activos financieros, Nº de acciones/contratos, Capital, Rendimiento Secuencia normal Paso Acción 1 El usuario accede a una lista de carteras. 2 El usuario selecciona una cartera. 3 El sistema muestra la información de la cartera. Postcondición NA Excepciones Paso Acción Comentarios NA Actores Usuario registrado, Usuario no registrado Tabla 22. Ver información de una cartera de activos financieros 5.2.4 Otros servicios de trading Requisito Realizar backtesting de forma manual Identificador 4.1 Prioridad Baja Precondición NA Descripción El usuario puede introducir de forma manual las ganancias y las pérdidas que obtiene siguiendo una determinada estrategia y, así, observar el rendimiento obtenido con esa estrategia. Entrada Capital inicial, Ganancias, Pérdidas Salida Rendimiento obtenido 54 Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y selecciona la opción “Realizar backtesting de forma manual” 2 El sistema muestra una pantalla con las opciones necesarias para realizar el backtesting de forma manual. 3 El usuario introduce el capital inicial. 4 El usuario introduce la cantidad de cada ganancia y la cantidad de cada pérdida y hace click en el botón correspondiente para añadir una ganancia o una pérdida. Y así para cada ganancia y pérdida realizada. 5 El sistema muestra los resultados y una gráfica actualizada con el rendimiento realizado. Postcondición El rendimiento mostrado por pantalla es el correcto después de aplicar las ganancias y pérdidas realizadas por el usuario. Excepciones Paso Acción 3 Si el usuario introduce un valor negativo, se muestra un mensaje de error. 4 Si el usuario introduce un valor negativo tanto en la ganancia como en la pérdida, se muestra un mensaje de error. Comentarios Hay un botón verde para añadir una ganancia y un botón rojo para añadir una pérdida. Actores Usuario registrado, Usuario no registrado Tabla 23. Realizar backtesting de forma manual Requisito Escribir diario de trading Identificador 4.2 Prioridad Baja Precondición El usuario tiene que estar registrado y haber iniciado sesión. Descripción Los usuarios pueden escribir como si de un diario se tratara sus pensamientos y sus reflexiones acerca de sus operaciones en bolsa y, también, los backtesting realizados. Entrada ID usuario, Texto del diario Salida NA Secuencia normal Paso Acción 1 El usuario accede a la aplicación, se le muestra la pantalla principal y selecciona la opción “Diario de Trading” 55 2 El sistema muestra un calendario. 3 El usuario selecciona el día del calendario sobre el que quiere escribir. 4 El sistema permite al usuario introducir texto. 5 El usuario introduce texto y hace click en “Finalizar”. 6 El sistema vuelve al calendario. Postcondición El calendario contiene el texto introducido por el usuario en el día seleccionado por este. Excepciones Paso Acción Comentarios NA Actores Usuario registrado Tabla 24. Escribir diario de trading 5.2.5 Administrar datos Requisito Subir datos históricos Identificador 5.1 Prioridad Baja Precondición El admin tiene que haber iniciado sesión como tal. Descripción Se pueden subir datos sobre activos financieros a la base de datos del sistema. Entrada Datos que se quieren añadir. Salida Datos recién añadidos. Secuencia normal Paso Acción 1 El usuario se encuentra en la pantalla principal y selecciona la opción “Administrar Datos”. 2 El sistema muestra una pantalla en la que se observan dos opciones a elegir por el usuario: “Subir Datos” y “Eliminar Datos”. 3 El usuario hace click en “Eliminar Datos”. 56 4 El sistema muestra una pantalla que pide introducir los datos a añadir. 5 El usuario introduce los datos. 6 El usuario hace click en “Añadir”. 7 El sistema muestra un mensaje preguntando por la confirmación. 8 El usuario hace click en “Continuar”. 9 El sistema muestra por pantalla los datos recién añadidos. Postcondición Los datos han sido añadidos al sistema. Excepciones Paso Acción 8 El usuario hace click en “Cancelar”. 9 No se pueden añadir los datos. Comentarios Se irá detallando cuáles son los tipos de datos que se va a poder subir conforme se va diseñando la aplicación con mayor profundidad. Actores Admin Tabla 25. Subir datos históricos Requisito Eliminar datos históricos Identificador 5.2 Prioridad Baja Precondición Tienen que existir los datos que se quieren eliminar y el admin tiene que haber iniciado sesión como tal. Descripción Se pueden eliminar datos de activos financieros de la base de datos del sistema. Entrada ID de los datos que se quieren eliminar. Salida NA Secuencia normal Paso Acción 1 El usuario se encuentra en la pantalla principal y selecciona la opción “Administrar Datos”. 2 El sistema muestra una pantalla en la que se observan dos opciones a elegir por el usuario: “Subir Datos” y “Eliminar Datos”. 3 El usuario hace click en “Eliminar Datos”. 4 El sistema muestra una pantalla que pide introducir los datos a eliminar. 63 Capítulo 7 - Modelo de datos En este capítulo se explica el modelo de datos que se ha definido para realizar la persistencia de la información gestionada por la aplicación web. 7.1 Modelo Entidad-Relación Para el diseño de la base de datos del sistema, se ha descrito un modelo entidad-relación que refleje las entidades de información que necesitan ser gestionadas por la aplicación. Los datos que guarda el sistema pueden ser de dos tipos distintos: datos de los activos financieros y datos del usuario o generados por el usuario. Los datos de los activos financieros son también de dos tipos. En primer lugar, están los datos referentes a las especificaciones de los contratos de los activos financieros. Aquí estarían, por ejemplo, el nombre del activo, el mercado en el que cotiza el activo financiero en cuestión o la moneda en la que está denominado dicho contrato. Por otro lado, estarían los datos históricos de los precios diarios de los activos financieros. Estos datos incluyen la fecha, el precio de apertura, el precio de cierre, el máximo del día, el mínimo del día, el precio de cierre ajustado y el volumen. En cuanto a los datos del usuario o generados por el usuario, en primer lugar, estarían los que hacen referencia a las cuentas de usuario. Para configurar una cuenta de usuario, es necesario tener un nombre de usuario, un nombre completo, una contraseña y un rol (“Administrador” o “Usuario”). Los datos generados por el usuario pueden ser de cuatro tipos distintos (en función de la funcionalidad a la que estén asociados): “backtesting”, gestión de carteras, “backtesting” manual y diario de trading. Para la ejecución de un “backtesting”, es necesario almacenar el usuario que ejecuta dicho “backtesting”, el nombre que este usuario le pone, la información de la cartera que se ha configurado para la ejecución de este, las fechas de inicio y de fin, si el usuario lo ha guardado o no, si el usuario lo ha hecho público o no, la parametrización de la estrategia a testear y los activos financieros sobre los que correr el “backtesting”. El usuario, la parametrización de la estrategia y los activos financieros sobre los que correr el “backtesting” van a conformar entidades independientes y el resto de los atributos mencionados van a pertenecer a la entidad “Backtesting”. La gestión de carteras genera igualmente una serie de datos a tener en cuenta. En primer lugar, se generan los datos de la configuración de la cartera. Los atributos de la entidad 64 “Cartera” son la fecha de inicio y de fin, el capital, la moneda en la que está denominada la cartera y si el usuario la ha compartido o no. En segundo lugar, la gestión de carteras también incluye transacciones y posiciones. Por lo tanto, también tienen que existir dichas entidades. Para cada “backtesting” manual que un usuario crea y ejecuta, se necesita conocer el usuario que lo ha creado, el nombre que le ha puesto, la configuración de la cartera de este y si el usuario lo ha guardado o no para su posterior recuperación. Además, cada “backtesting” manual está compuesto por una serie de operaciones añadidas a través de la aplicación por el usuario. Estas últimas van a conformar igualmente una entidad. Finalmente, el sistema también guarda los datos generados por el usuario en la funcionalidad “Diario de trading”. Los atributos de la entidad “Diario de trading” van a ser el usuario, la fecha de creación del texto, la fecha a la que hace referencia el texto y el texto mismo. La Ilustración 20 contiene el diagrama Entidad-Relación referido al modelo que se acaba de describir. 65 Ilustración 20. Diagrama Entidad-Relación 66 7.2 Implementación de la base de datos La implementación del modelo E-R descrito en el anterior apartado se ha hecho a través de una base relacional de tipo MySQL. Ilustración 21. Implementación de la base de datos 67 A continuación, se describen cada una de las tablas de la base de datos. 7.2.1 Tablas sobre las cuentas de usuario • Tabla “users”: incluye la información necesaria que ha de tener toda cuenta de usuario creada en la aplicación web. Estos son sus campos de información: o “id”: identificador del usuario. o “user_name”: nombre de usuario. o “user_full_name”: nombre y apellidos del usuario. o “password”: contraseña de la cuenta. o “role”: rol que tiene el usuario. Puede ser “Admin” (Administrador) o “User” (Usuario registrado corriente). 7.2.2 Tablas sobre “Backtesting” • Tabla “backtesting”: incluye todos los datos que se necesitan para la ejecución de un “backtesting”. Estos son sus campos de información: o “id”: identificador del “backtesting”. o “user_id”: identificador del usuario al que pertenece el “backtesting”. o “name”: nombre que le ha puesto el usuario al “backtesting”. o “strategy_id”: identificador de la estrategia del “backtesting”. o “starting_cash”: capital inicial de la cartera sobre la que se ejecuta el “backtesting”. o “currency”: moneda en la que están denominados los datos del campo “starting_cash”. o “start_dt”: fecha de inicio del “backtesting”. o “end_dt”: fecha de fin del “backtesting”. o “shared”: si el usuario ha compartido el “backtesting” o no. o “saved”: si el usuario ha guardado el “backtesting” o no. • Tabla “strategy_type”: tabla que relaciona la estrategia del “backtesting” (tabla anterior) con el tipo de estrategia que es esta. Estos son sus campos de información: o “id”: identificador de la estrategia (“strategy_id” en tabla “backtesting”). 68 o “strategy_type”: tipo de la estrategia. • Tabla “strategy_buy_short_max_min”: incluye la parametrización de la estrategia implementada en esta aplicación web (recordar que la estrategia aquí implementada es una estrategia global que se puede dividir en cuatro tipos de sub-estrategias más concretas: comprar en máximos, vender en máximos, comprar en mínimos y vender en mínimos). Estos son sus campos de información: o “id”: identificador de la estrategia. o “strategy”: nombre de la sub-estrategia. Puede ser “buymax” (comprar en máximos), “shortmax” (vender en máximos), “buymin” (comprar en mínimos) y “shortmin” (vender en mínimos). o “time_frame”: número de días sobre los que calcular el máximo o el mínimo de la estrategia. o “exit_trade”: tipo de salida de la estrategia. Puede ser “exit_time” (salida por tiempo) o “trailing_stop” (salida cuando se ejecuta un stop). o “exit_configuration”: parámetro del tipo de salida. Su significado depende del valor de “exit_trade”. • Tabla “backtesting_assets”: tabla que guarda cuál es la lista de activos financieros sobre los que se ejecuta un “backtesting”. Estos son sus campos de información: o “id”: identificador de la fila. o “backtesting_id”: identificador del “backtesting”. o “asset_id”: identificador del activo financiero. o “asset_class”: clase del activo financiero. Puede ser “Stock” (el activo financiero es entonces una acción) o “Future” (el activo financiero es entonces un futuro). 7.2.3 Tablas sobre gestión de carteras • Tabla “portfolios”: incluye la información de configuración de cada cartera financiera creada por un usuario. Estos son sus campos de información: o “id”: identificador de la cartera financiera. o “name”: nombre puesto por el usuario propietario. o “user_id”: identificador del usuario propietario. 69 o “start_dt”: fecha de creación de la cartera. o “end_dt”: fecha de eliminación/fin de la cartera. o “starting_cash”: capital inicial de la cartera. o “current_cash”: capital actual de la cartera. o “currency”: moneda en la que está denominada la cartera. o “shared”: si el usuario ha compartido la cartera o no. • Tabla “positions”: contiene la información de cada posición existente. Estos son sus campos de información: o “id”: identificador de la posición. o “user_id”: identificador del usuario. o “asset”: ticker del activo financiero de la posición. o “current_price”: último precio del activo financiero. o “current_dt”: fecha del último precio del activo financiero. o “buy_quantity”: número de contratos comprados. o “sell_quantity”: número de contratos vendidos. o “avg_bought”: precio medio de compra de los contratos. o “avg_sold”: precio medio de venta de los contratos. o “buy_commission”: cantidad en comisiones pagadas en operaciones de compra. o “sell_commission”: cantidad en comisiones pagadas en operaciones de venta. • Tabla “position_portfolio”: tabla que relaciona cada posición de la tabla “positions” con su correspondiente cartera financiera de la tabla “portfolio”. Estos son sus campos de información: o “id”: identificador de la fila. o “portfolio_id”: identificador de la cartera financiera. o “position_id”: identificador de la posición. • Tabla “transactions”: incluye toda la información de todas las operaciones de compra y de venta efectuada durante la gestión de carteras. o “id”: identificador de la transacción. 70 o “user_id”: identificador del usuario que ha realizado dicha transacción. o “asset”: ticker del activo financiero sobre el que se ha realizado la transacción. o “quantity”: cantidad de contratos comprados o vendidos en la transacción. o “price”: precio del activo financiero al que se ha completado la transacción. o “dt”: fecha de la transacción. o “commission”: comisión de la transacción. o “position_id”: identificador de la posición al que está asociada la transacción. 7.2.4 Tablas sobre otros servicios de trading • Tabla “backtesting_manual”: incluye la información de los “backtesting” manuales creados y ejecutados por los usuarios. Estos son sus campos de información: o “id”: identificador del “backtesting” manual. o “name”: nombre puesto por el usuario propietario. o “user_id”: identificador del usuario propietario. o “starting_cash”: capital inicial de la cartera del “backtesting” manual. o “currency”: moneda en la que están denominados los datos del campo de información “starting_cash”. o “saved”: si el usuario lo ha guardado o no para su posterior recuperación. • Tabla “backtesting_manual_operations”: incluye las operaciones que ha añadido cada usuario durante la ejecución del “backtesting” manual. Estos son sus campos de información: o “id”: identificador de la operación. o “backtesting_manual_id”: identificador del “backtesting” manual. o “quantity”: beneficio o pérdida de la operación. o “date”: fecha de la operación. • Tabla “journal”: incluye toda la información del diario de trading de cada usuario. Estos son sus campos de información: o “id”: identificador del comentario. o “user_id”: identificador del usuario que ha realizado el comentario. 71 o “create_dt”: fecha en la que el usuario ha realizado el comentario. o “date”: fecha a la que hace referencia el comentario. o “text”: texto del comentario. 7.2.5 Tablas sobre administrar datos • Tabla “asset_class”: contiene todos los activos financieros del sistema sean de la clase que sean. Estos son sus campos de información: o “id”: identificador del activo financiero. o “asset_class”: clase del active financiero. Puede ser “Stock” (el activo financiero es entonces una acción) o “Future” (el activo financiero es entonces un futuro). • Tabla “stocks”: incluye los datos de las especificaciones de los contratos de las acciones. Estos son sus campos de información: o “id”: identificado del activo financiero. o “ticker”: ticker del activo financiero. o “company_name”: nombre de la compañía. o “market”: mercado en el que cotiza la acción. o “currency”: moneda en la que está denominada la acción. o “metric”: valor de la métrica que se utiliza en la funcionalidad “Backtesting” por grupos. • Tabla “stock_prices”: incluye los datos diarios de los precios de las acciones. Estos son sus campos de información: o “id”: identificador de la fila. o “stock_id”: identificador del activo financiero. o “date”: fecha del dato. o “open”: precio de apertura del día. o “high”: máximo precio del día. o “low”: mínimo precio del día. o “close”: precio de cierre del día. 72 o “adjusted_close”: precio de cierre del día ajustado. o “volumen”: volumen de operaciones realizadas en el día. • Tabla “futures”: incluye los datos de las especificaciones de los contratos de los futuros. Estos son sus campos de información: o “id”: identificador del activo financiero. o “ticker”: ticker del activo financiero. o “futures_name”: nombre del contrato. o “currency”: moneda en la que está denominado el futuro. • Tabla “futures_prices”: incluye los datos diarios de los precios de los futuros. Estos son sus campos de información: o “id”: identificador de la fila. o “futures_id”: identificador del activo financiero. o “date”: fecha del dato. o “open”: precio de apertura del día. o “high”: máximo precio del día. o “low”: mínimo precio del día. o “close”: precio de cierre del día. o “adjusted_close”: precio de cierre del día ajustado. o “volumen”: volumen de operaciones realizadas en el día. 79 Ilustración 28. Clase HistoricDBDatahandler El método siguiente, “update_bars” (de la clase “HistoricDataDBHandler”), es el encargado de generar los eventos de mercado y para ello, ejecuta el método “_get_new_bar” (de la clase “HistoricDataDBHandler”). Es a través de la ejecución e interacción de estos dos métodos como se consigue evitar el sesgo de anticipación. La Ilustración 29 incluye la definición del método “_get_new_bar()” y la Ilustración 30 del método “update_bar”. 80 Ilustración 29. Método _get_new_bar() Ilustración 30. Método update_bars() Estrategia [25]: Este componente contiene la lógica de la estrategia de trading a implementar y, por lo tanto, es el encargado de generar las señales de compra y de venta (“SignalEvent”). Como se ha comentado al inicio de la memoria, esta aplicación web ha tratado de implementar una estrategia de trading que se podía dividir conceptualmente en cuatro subestrategias. Por lo tanto, se ha creado una clase por cada una de las sub-estrategias a implementar. En la Ilustración 31 se observa el código del constructor de la clase “BuyMaxStrategy” (clase referente a la sub-estrategia basada en la compra en máximos): 81 Ilustración 31. Clase BuyMaxStrategy El siguiente método, “calculate_signals” (de la clase “BuyMaxStrategy”), en la Ilustración 32, se ejecuta cada vez que el algoritmo recibe un evento de mercado y su lógica consiste en tratar de determinar las señales de compra y de venta generadas por las reglas de la estrategia de trading. Esta estrategia consiste en la compra en los máximos del precio. Por lo tanto, esta estrategia genera una señal de compra cuando el máximo del día evaluado para un activo financiero supera al máximo de un período temporal dado por el usuario. Esta es la condición “if bars[0][3] > self.maximum[t]”. “bars[0][3]” contiene el valor del máximo del activo financiero en el día evaluado y “self.maximum[t]” contiene el máximo del activo financiero en el período temporal previo. En cuanto a las señales de salida, estas dependen del tipo de salida elegido por el usuario. Cuando se haya elegido una salida temporal, se evalúa si han transcurrido o no el número de días elegidos por el usuario. Esta es la condición “if self.days_strategy[t] == int(self.exit_configuration * 0.5 * self.time_frame)”. “self.days_strategy[t]” contiene el valor del número de días que han transcurrido desde que se compró dicho activo financiero y “self.exit_configuration * 0.5 * self.time_frame” es el número de días elegido por el usuario (self.exit_configuration puede ser “1”, “2” o “3”). Por otro lado, si el usuario ha elegido una salida basada en un trailing stop, entonces se evalúa si el mínimo del precio del activo financiero en el día evaluado es menor o igual al precio determinado por el trailing stop. Esta es la condición “if bars[0][4] <= self.trailing_stop[t]. “bars[0][4]” contiene el valor del mínimo del activo financiero en el día evaluado y “self.trailing_stop[t]” contiene el valor del trailing stop del activo en cuestión. 82 Ilustración 32. Método calculate_signals() Cartera [26]: Este componente es el encargado de recibir las señales de trading (“SignalEvent”) y generar órdenes en consecuencia (“OrderEvent”). Es en este componente donde cabría codificar la gestión del riesgo. Además, una vez generadas las órdenes de compra o de venta, este componente recibe eventos del tipo “FillEvent” y actualiza las posiciones mantenidas en la cartera de acuerdo. La implementación de este componente se ha realizado a través de la clase “PortfolioBacktesting”. Esta clase lleva un seguimiento de todas las posiciones y de la evolución de estas durante todo el “backtesting”. La Ilustración 33 contiene un extracto de código con la definición de esta clase. 83 Ilustración 33. Clase PortfolioBacktesting Para la generación de las órdenes una vez obtenida la señal de compra o venta, se asigna el capital de la cartera de forma equitativa entre todos los activos financieros tal como se puede observar en la Ilustración 34. Ilustración 34. Método generate_order() 84 Ejecutor de Órdenes [27]: Este componente recibe órdenes (“OrderEvent”) y simula una conexión a un bróker. Si se realizara la implementación de la ejecución de una estrategia en vivo y en real, entonces este componente sería el encargado de conectarse al bróker para realizar las transacciones. Ilustración 35. Clase SimulatedExecutionHandler Por último, todos estos componentes forman parte de la clase “Backtesting”. Esta clase contiene un método, “execute_backtesting”, que se encarga de ejecutar el algoritmo que recibe y gestiona los eventos en bucle [22]. En la Ilustración 36 se puede observar la lógica de dicho algoritmo. Ilustración 36. Algoritmo del backtesting 85 Una vez ejecutado el “backtesting”, el usuario ya puede ver los resultados arrojados por este. Además, el usuario también tiene la opción de ver, para cada uno de los activos financieros incluidos en el “backtesting”, las correspondientes señales de entrada y de venta generadas por la estrategia. La Ilustración 37 contiene un ejemplo de este tipo de gráfico. Para la generación de este, además, se ha hecho uso de la librería mpld3. Esta ha permitido la generación del código HTML necesario para la creación de gráficos interactivos. Esto resulta muy conveniente, pues en función del período temporal escogido, puede llegar a ser necesario hacer zoom en el gráfico para observar con mayor claridad los momentos exactos de compra y de venta del activo en cuestión. Ilustración 37. Gráfico con las señales de trading La funcionalidad del “backtesting” por grupos trata igualmente de ejecutar el “backtesting” de una estrategia de trading de la misma forma y siguiendo el mismo diseño que se acaba de comentar. La diferencia reside en que, previamente, se divide el conjunto de activos financieros en dos grupos en función de la métrica seleccionada por el usuario. Esta 86 métrica puede ser la capitalización del mercado o el volumen. De tal forma, que, si el usuario ha elegido la primera, se incluyen los activos financieros con baja capitalización de mercado en un conjunto y a los que tiene una capitalización de mercado grande se les incluye en el otro conjunto. Y se sigue la misma lógica en el caso de que el usuario hubiera elegido el volumen como métrica. Una vez separados los activos financieros en dos grupos, se crea y ejecuta un “backtesting” por cada uno de los dos conjuntos existentes. 8.2.3 Funcionalidad de la gestión de carteras La Ilustración 38 incluye la vista de la principal funcionalidad de la gestión de carteras. Ilustración 38. Vista gestión de carteras La principal funcionalidad de la gestión de carteras es la creación y mantenimiento en el tiempo de carteras financieras. La estructura que se ha seguido para la implementación de esta funcionalidad concreta está compuesta por los siguientes componentes: 87 • Transacción: Una transacción es una operación de compra o de venta de un activo financiero, a un precio determinado y en una fecha concreta. • Posición: Una posición hace referencia al número de contratos que mantiene un usuario sobre un activo financiero concreto. Cuando un usuario no ha comprado ni vendido un activo financiero, se dice que ese usuario no mantiene ninguna posición en dicho activo. Ahora, si ese mismo usuario realiza por primera vez una transacción sobre ese activo financiero, entonces se crea una posición en dicho activo financiero. De la misma forma, si el usuario ejecuta una nueva transacción que le hace volver a tener cero contratos de dicho activo, entonces se elimina dicha posición. • Cartera: Una cartera financiera está compuesta por un conjunto de posiciones en varios activos financieros. De tal forma, que los resultados de la cartera serán consecuencia de los resultados que arrojen todas sus posiciones a nivel individual. Una vez definida la estructura a nivel conceptual, y siguiendo las indicaciones encontradas en la serie de artículos de QuantStart dedicados a la gestión de carteras con Python [28], se definen las siguientes clases para su implementación: “Transaction”: Clase encargada de englobar la lógica en lo que respecta a las transacciones. La transacción se ejecuta al último precio del activo financiero en cuestión. Para ello, se ejecuta el método “get_last_quote”, que obtiene dicho precio a través de técnicas de web scraping y el uso de la librería “pandas_datareader”. La Ilustración 39 incluye un extracto del código para la definición de la clase “Transaction” y la Ilustración 40 indica cómo se ha hecho para crear una transacción. Ilustración 39. Clase Transaction 88 Ilustración 40. Código para crear una transacción “Position” [28]: Clase encargada de englobar la lógica en lo que respecta a una posición. La Ilustración 41, la Ilustración 42 y la Ilustración 43 contienen métodos muy importantes de esta clase. Ilustración 41. Código para abrir una posición 95 Ilustración 53. Vista Backtesting Manual El gráfico representa la evolución del capital de la cartera tras cada beneficio o pérdida añadidos y se ha hecho uso de la librería matplotlib para su creación. Además, conviene comentar que, una vez completada con éxito la petición Ajax, es necesario cambiar la url asociada al gráfico para que este se actualice en el momento. Para ello, ha habido que asociar un timestamp a dicha url, pues refrescar únicamente la url sin cambiar el timestamp asociado no permitía actualizar el gráfico en vivo. La Ilustración 54 contiene el código utilizado para la gestión de la petición Ajax. 96 Ilustración 54. Código para la ejecución de peticiones AJAX El otro servicio de trading implementado ha sido el diario de trading. Si el usuario no ha escrito ningún comentario en su diario, en el dashboard aparecerá como tal. De todas formas, siempre que este quiera puede crear un nuevo comentario accediendo al formulario correspondiente desde el panel central. En la Ilustración 55 se puede observar un ejemplo de esta funcionalidad. Ilustración 55. Vista Diario de Trading 97 8.2.5 Funcionalidad de la administración de los datos históricos El administrador del sistema puede subir datos históricos de los precios de los activos financieros a la base de datos. Para la obtención de estos datos, se han utilizado técnicas de web scraping. El administrador tan sólo tiene que completar un formulario indicando los datos que quiere subir al sistema. Una vez enviado, el sistema obtiene los datos de los precios de las acciones de Yahoo! Finance. Para ello, se hace uso del método “read_csv” de la librería pandas tal como se puede observar en la Ilustración 56. A este método hay que pasar como parámetro la url de Yahoo! Finance que permita la descarga de un archivo “csv”. Este archivo contiene los datos con los precios de las acciones que el administrador quiere subir al sistema. Finalmente, en caso de introducir una url incorrecta, ya sea por el envío de un formulario con datos erróneos por parte del administrador o por cualquier otro motivo, el sistema no permite la realización de la tarea e informa al usuario de la imposibilidad de completar esta con éxito. Ilustración 56. Código para la obtención de datos de Yahoo! Finance Además, el sistema detecta si los datos que el administrador quiere subir ya existen o no, y solo realiza la inserción en la base de datos de aquellos que no existan. 98 Capítulo 9 - Conclusiones y trabajo futuro 9.1 Conclusiones En este proyecto, se ha realizado el desarrollo de una aplicación web que permite la ejecución del “backtesting” de una estrategia basada en la compra o venta en máximos o mínimos del precio de un activo financiero. La implementación de esta funcionalidad se ha hecho siguiendo un diseño guiado por eventos. Ello hace que el usuario de la aplicación pueda correr su “backtesting” con las garantías suficientes y sin caer en el sesgo de anticipación. Además, su implementación permite una gran escalabilidad en términos del número de estrategias de trading que se pueden añadir al sistema. Tan sólo haría falta crear una nueva clase con el nombre de la estrategia que se quiere añadir e implementar el método encargado de generar las señales de esta. El objetivo principal de esta aplicación era el desarrollo del “backtesting”, sin embargo se han implementado otras funcionalidades que permiten al usuario realizar un seguimiento de su operativa como trader. Estas son la gestión de carteras, el “backtesting” manual, el diario de trading y la administración de los datos históricos. Por lo tanto, la aplicación web aquí desarrollada conforma un conjunto de herramientas muy útiles para invertir en los mercados financieros. 9.2 Trabajo futuro La aplicación puede ser mejorada de diversas formas. En este sentido, se plantean las siguientes líneas de trabajo futuro: • Añadir más estrategias: El diseño guiado por eventos permite fácilmente codificar nuevas estrategias y añadirlas para que el usuario pueda ejecutarlas. Añadiendo nuevas estrategias al sistema, se conseguiría incrementar la riqueza y el valor añadido aportados por la aplicación. • Trading en vivo: El diseño guiado por eventos permite reutilizar gran parte de su estructura para el trading en vivo. La dificultado adicional tan solo estaría en la obtención y gestión en vivo de los datos de los precios de los activos financieros. Por lo tanto, una funcionalidad tan interesante como esta podría implementarse con no mucha dificultad. • Eficiencia del backtesting: En función del periodo temporal escogido y el número de activos financieros sobre el que correr el “backtesting”, este puede llegar a tardar una 99 suma considerable de tiempo. La ejecución de esta tarea podría verse reducida en una cantidad no poco importante si se realizara una implementación multiproceso o multihilo de esta. • Optimización de carteras: Aparte del método de análisis de varianza media que se ha utilizado para implementar la optimización de carteras, también existen otros métodos de optimización distintos (HRP, mCVAR…). La utilidad de la aplicación incrementaría mucho si se pudieran implementar otros métodos de optimización y el usuario pudiera elegir cuál quiere utilizar para llevar a cabo la tarea. • Añadir más clases de activos financieros: Actualmente, esta aplicación cuenta sólo con la posibilidad de gestionar acciones y futuros. Nuevas clases de activos, como bonos, criptomonedas o monedas (fórex), podrían ser añadidas al sistema. Esto daría lugar a una aplicación más amplia y extensa. • Aplicación del Aprendizaje Automático: La aplicación de técnicas de Aprendizaje Automático al mundo financiero es cada vez mayor. Tanto para una gestión adecuada del riesgo como para la configuración eficiente de una estrategia de trading, estas técnicas podrían aportar una ventaja competitiva muy importante frente al resto de herramientas similares. 100 Chapter - Conclusions and future work Conclusions This project has developed a web application that allows the users to run the backtesting of a trading strategy based on the buying or selling at the highs or lows of an asset’s price. The backtester has been built following an Event-Driven system. This allows the user to avoid the lookahead bias when running the simulation. Its implementation also allows for a rapid scalability in terms of the number of trading strategies than can be added to the system. It would only be necessary to create a new class with the name of the strategy to be added and to implement the method responsible for generating the trading signals. The main goal of this web application was the development of the backesting. Nevertheless, other functionalities which allow the user to keep track of his trading have also been implemented. These are the functionalities related to portfolio management, backtesting by hand, the trading journal, and the handling of historical data. Therefore, the web application here developed is made up of a set of tools which are very useful for investing in financial markets. Future work It is possible to improve the application in several ways. In that sense, these are the following lines of work to focus in the future: • Add more strategies: The Event-Driven system makes it very easy to code new strategies and add them to the system so that the user can run them. By doing this, the application would be of more use for a trader and would, therefore, gain in added value. • Live trading: It is also possible to reuse most of the code of the Event-Drive backtester for the implementation of live trading. It would only be necessary to handle the feed of live data. • Backtesting efficiency: Depending on the period and the number of assets on which to run the backtesting, this could take a vast amount of time to be completed. The execution of this task could be greatly improved if multiprocessing or multithreading were included in the development of such. 101 • Portfolio optimization: Apart from the mean variance analysis method that has been used in the web application for portfolio optimization, there are other different optimization methods that can be used (HRP, mCVAR…). The functionality of the application would be enrichened if the user could choose which method he wants to use to complete this task. • Add more asset classes: This project has only considered the possibility of investing in equities and futures, but other asset classes, such as bonds, cryptocurrencies, and currencies (forex), could be added to the system. This would create a more ample and thorough application. • Machine Learning: The application of Machine Learning techniques to financial markets is greatly increasing in popularity. These techniques, which could be used for both risk management and the development of successful strategies, could provide the application with a competitive advantage over the rest of similar tools in the market. 102 BIBLIOGRAFÍA [1 ] Fidelity, «Fidelity,» [En línea]. Available: https://www.fidelity.com/learningcenter/trading-investing/technical-analysis/technical-indicator-guide/atr. [2 ] MetaTrader 5, «MetaTrader,» [En línea]. Available: https://www.metatrader5.com/es. [3 ] MetaStock, «MetaStock,» [En línea]. Available: https://www.metastock.com/. [4 ] Interactive Brokers, «Interactive Brokers,» [En línea]. Available: https://www.interactivebrokers.co.uk/es/home.php. [5 ] TrendSpider, «TrendSpider,» [En línea]. Available: https://trendspider.com/. [6 ] TradingView, «TradingView,» [En línea]. Available: https://es.tradingview.com/. [7 ] NinjaTrader, «NinjaTrader,» [En línea]. Available: https://ninjatrader.com/es/. [8 ] Bootstrap , «Bootstrap 5,» [En línea]. Available: https://getbootstrap.com/docs/5.0/getting-started/introduction/. [9 ] A. Navarro, «Junco TIC,» 7 Mayo 2019. [En línea]. Available: https://juncotic.com/jinja2-en-flask-introduccion/. [1 0] jQuery, «jQuery,» [En línea]. Available: https://jquery.com/. [1 1] Wikipedia, «Wikipedia,» [En línea]. Available: https://es.wikipedia.org/wiki/Python. 103 [1 2] J. J. L. Gómez, «j2logo,» [En línea]. Available: https://j2logo.com/tutorial-flaskespanol/. [1 3] Wikipedia, «Wikipedia,» [En línea]. Available: https://es.wikipedia.org/wiki/MySQL. [1 4] Visual Studio Code, «Visual Studio Code,» [En línea]. Available: https://code.visualstudio.com/. [1 5] XAMPP, «XAMPP,» [En línea]. Available: https://www.apachefriends.org/es/index.html. [1 6] Wikipedia, «Wikipedia,» [En línea]. Available: https://es.wikipedia.org/wiki/Git. [1 7] CIO Wiki, «Cliente Server Architecture,» [En línea]. Available: https://ciowiki.org/wiki/Client_Server_Architecture#:~:text=Client%20Server%20Architecture%2 0is%20a,a%20network%20or%20internet%20connection.. [1 8] PLEDIN 3.0, «Patrón modelo-vista-controlador,» [En línea]. Available: https://plataforma.josedomingo.org/pledin/cursos/flask/curso/u03/. [1 9] Z. Vojkovic, «Flask-framework: MVC pattern,» [En línea]. Available: https://stackoverflow.com/questions/12547206/flask-framework-mvc-pattern. [2 0] I. Rodríguez, «The Factory Method Pattern and Its Implementation in Python,» 11 Febrero 2019. [En línea]. Available: https://realpython.com/factory-method-python/. [2 1] UX & Bootstrap, «Portal: Free Bootstrap 5 Admin Dashboard Template For Developers,» [En línea]. Available: https://themes.3rdwavemedia.com/bootstraptemplates/startup/portal-free-bootstrap-admin-dashboard-template-fordevelopers/. [2 2] QuantStart, «Event-Driven Backtesting with Python - Part I,» [En línea]. Available: https://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-I/. 104 [2 3] QuantStart, «Event-Driven Backtesting with Python - Part II,» [En línea]. Available: http://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-II/. [2 4] QuantStart, «Event-Driven Backtesting with Python - Part III,» [En línea]. Available: http://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-III/. [2 5] QuantStart, «Event-Driven Backtesting with Python - Part IV,» [En línea]. Available: https://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-IV/. [2 6] QuantStart, «Event-Driven Backtesting with Python - Part V,» [En línea]. Available: https://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-V/. [2 7] QuantStart, «Event-Driven Backtesting with Python - Part VI,» [En línea]. Available: https://www.quantstart.com/articles/Event-Driven-Backtesting-with-Python-Part-VI/. [2 8] QuantStart, «Advanced Trading Infrastructure - Position Class,» [En línea]. Available: https://www.quantstart.com/articles/Advanced-Trading-Infrastructure-PositionClass/. [2 9] QuantStart, «Advanced Trading Infrastructure - Portfolio Class,» [En línea]. Available: https://www.quantstart.com/articles/Advanced-Trading-Infrastructure-PortfolioClass/. [3 0] QuantStart, «Advanced Trading Infrastructure - Portfolio Handler Class,» [En línea]. Available: https://www.quantstart.com/articles/Advanced-Trading-InfrastructurePortfolio-Handler-Class/. [3 1] Algovibes, «Modern portfolio theory in Python: Efficient Frontier and minimumvariance portfolio,» 2020. [En línea]. Available: https://www.youtube.com/watch?v=mJTrQfzr0R4. [3 2] L. A. Bucki, Word 2013 Bible, John Wiley & Sons, 2013. [3 3] CFI, «Cursos de Formación en Informática,» [En línea]. Available: http://cursosinformatica.ucm.es. [Último acceso: 01 06 2019]. 111 Ilustración 65. Formulario Backtesting Paso 1 En el segundo paso, el usuario ha de introducir la lista de tickers de los activos financieros sobre los que quiere correr el “backtesting”. Ilustración 66. Formulario Backtesting Paso 2 En el tercer paso, el usuario ha de elegir las fechas entre las que quiere correr el “backtesting”. Si elige unas fechas sobre las que no existan datos para los activos financieros escogidos, la aplicación informará al usuario después de que este haya enviado el formulario. 112 Ilustración 67. Formulario Backtesting Paso 3 En el paso 4, el usuario elige la sub-estrategia que quiere evaluar. Aquí puede elegir las cuatro sub-estrategias implementadas: “Comprar Máximos”, “Vender Máximos”, “Comprar Mínimos” y “Vender Mínimos”. Ilustración 68. Formulario Backtesting Paso 4 Finalmente, en el último paso el usuario tiene que elegir los parámetros de la subestrategia escogida. Aquí, tiene que introducir el marco temporal y el tipo de salida que quiere implementar. 113 Ilustración 69. Formulario Backtesting Paso 5 Una vez completados todos los campos del formulario, el usuario ya puede hacer click en “Ejecutar”. Entonces, si todos los datos son correctos, se crea el “backtesting” y se muestra por pantalla su configuración. Para ejecutarlo finalmente, el usuario ha de hacer click en el botón verde “Ejecutar Backtesting”. Ilustración 70. Vista Configuración Backtesting 114 Una vez ejecutado, se muestran los resultados del “backtesting”. En primer lugar, el sistema muestra una alerta acerca de si se recomienda o no el uso de esta estrategia tal como se puede ver en la Ilustración 71. Ilustración 71. Alerta Resultado Backtesting Lo siguiente ya son los resultados estadísticos del “backtesting” ejecutado. Como se puede observar en la Ilustración 72, se muestra el rendimiento acumulado, el Ratio de Sharpe (que mide la relación entre rendimiento y riesgo), el mayor Drawdown (máxima caída) y la duración de este Drawdown. A esto, además, hay que añadir un gráfico con la evolución de la curva de capital de la estrategia. Ilustración 72. Vista Resultados Backtesting Si el usuario hace scroll hacia abajo tiene también la opción de ver un gráfico, para cada uno de los activos financieros sobre los que se ha ejecutado el “backtesting”, en el que se muestra la evolución del precio del activo financiero en cuestión junto a las señales de compra 115 y de venta marcadas por la estrategia. En la Ilustración 73 se puede observar un ejemplo de este tipo de gráfico con la evolución del precio para Iberdrola y las señales de compra (verde) y de venta (rojo) marcadas por la estrategia. Ilustración 73. Vista Gráfico de las Señales de Trading Para guardar el “backtesting” para su posterior recuperación, el usuario tiene que hacer click en el botón “Guardar” que aparece en la Ilustración 70. Una vez guardado, aparecerán, como se puede observar en la Ilustración 74, los botones para compartir y eliminar el “backtesting”. Ilustración 74. Botones "Compartir" y "Eliminar" Backtesting 116 La ejecución del “backtesting” por grupos se hace de una forma muy parecida. Para acceder a esta página, hay que hacer click en el elemento “Backtesting” de la barra lateral de navegación. Una vez abierto el menú desplegable, el usuario tiene que hacer click en “Ejecutar Backtesting Por Grupos”. Ilustración 75. Seleccionar "Ejecutar Backtesting Por Grupos" Ahora, el usuario ha de completar un formulario casi idéntico al de “Ejecutar Backtesting”. La única diferencia reside en completar un paso previo en el que hay que elegir la métrica que se quiere utilizar para dividir a los activos financieros en dos grupos. Para ello, el usuario tiene dos opciones: “Capitalización del Mercado” y “Volumen”. En la Ilustración 76 se puede ver la vista para este primer paso del formulario. El resto de los pasos son los mismos que hay que completar en el formulario de “Ejecutar Backtesting”. Ilustración 76. Formulario "Ejecutar Backtesting Por Grupos" 117 Una vez completado el formulario, el usuario ya puede ver por pantalla los “backtesting” creados por cada uno de los dos conjuntos de activos financieros formados tal como se muestra en la Ilustración 77. A partir de ahí, este puede gestionarlos (verlos, ejecutarlos, guardarlos, publicarlos o eliminarlos) siguiendo los pasos que se han comentado hasta aquí. Ilustración 77. Vista Backtesting Por Grupos Gestión de carteras Al igual que la opción “Ejecutar Backtesting”, el usuario puede acceder a la página “Crear Cartera” tanto a través del dashboard como de la barra de navegación. A través del dashboard, el usuario tiene que hacer click en el botón “Crear Cartera” dentro de la sección “Lista de Carteras”. Y para hacerlo a través de la barra de navegación, tiene que hacer primero click en el botón “Cartera” de la barra de navegación lateral. Este abrirá un menú desplegable y el usuario deberá hacer click en la opción “Crear Cartera”. En la Ilustración 78 se puede observar cómo seleccionar la opción de “Crear Cartera” a través de las dos vías descritas. 118 Ilustración 78. Seleccionar "Crear Cartera" La creación de una cartera se hace también a través de un formulario. Este formulario está compuesto por los dos pasos incluidos en la Ilustración 79. Ilustración 79. Vista Formulario Crear Cartera Una vez creada la cartera, el usuario puede acceder a las estadísticas más relevantes de esta, como se puede observar en la Ilustración 80. Ahí el usuario puede consultar visualmente las pérdidas o ganancias, el valor de mercado de la cartera, el capital que tiene en su cuenta y el 119 “Equity” (valor de mercado + capital). Además, también cuenta con un gráfico que representa la distribución de los activos de la cartera. Ilustración 80. Vista Cartera Para compartir o eliminar la cartera, el usuario tiene que hacer click en los correspondientes botones que aparecen en el encabezado superior a la derecha en la Ilustración 80. Además, desde esta misma vista y tan solo haciendo scroll hacia abajo, el usuario también tiene acceso al conjunto de estadísticas relacionadas con las posiciones y las transacciones de la cartera, tal como se muestra en la Ilustración 81. 120 Ilustración 81. Vista Posiciones y Transacciones de la Cartera La modificación de la cartera consiste en la compra o venta de contratos de alguno de los activos financieros que componen dicha cartera. Para ello, y conforme se puede observar en la Ilustración 81, hay un formulario en la parte superior en donde el usuario ha de introducir el ticker, indicar si quiere comprar o vender (“Buy” o “Sell”) y la cantidad de contratos que quiere comprar o vender. Además, debajo de cada activo financiero hay otro formulario en el que el usuario indica también si quiere comprar o vender y la cantidad de contratos que quiere comprar o vender del activo financiero en cuestión. Por ejemplo, si se quieren comprar 100 acciones más de Inditex habría que seleccionar la opción “Buy”, introducir la cifra de 100 en el campo siguiente y hacer click en el botón “Enviar” tal como se muestra en la Ilustración 82. Ilustración 82. Vista Modificar Cartera 127 Administrar datos Sólo el administrador tiene acceso a esta funcionalidad. Por lo tanto, una vez iniciada la sesión como administrador, el usuario puede hacer click en el botón “Subir Datos Históricos” que aparece en la barra lateral de navegación tal como se indica en la Ilustración 94. Ilustración 94. Seleccionar "Subir Datos Históricos" Entonces, tal cual aparece en la Ilustración 95, el usuario tiene la opción de subir datos sobre acciones o futuros. Ilustración 95, Vista Acciones o Futuros Si por ejemplo, el usuario elige la primera opción, entonces tendrá que rellenar un formulario con los datos correctos. Para ello, tiene que introducir el ticker del activo financiero sobre el que quiere subir los datos, el nombre de la compañía, el mercado en el que cotiza la acción, la moneda en la que está denominada la acción y las fechas de los datos. El nombre, el 128 mercado y la moneda tan sólo son necesarios rellenarlos para aquellas acciones sobre las que no se hayan subido datos históricos previamente. Ilustración 96, Vista Formulario para subir datos históricos Una vez enviado dicho formulario, se muestra una vista con el gráfico de los precios a modo de confirmación. Ilustración 97. Vista Confirmación después de subir datos históricos 129 Finalmente, para eliminar datos históricos que se hayan subido previamente, el administrador ha de hacer click en el botón “Eliminar Datos Históricos” de la barra de navegación lateral. Ilustración 98. Seleccionar "Eliminar Datos Históricos" Una vez hecho esto, el administrador debe completar el formulario que aparece por pantalla. Aquí, ha de introducir el ticker del activo financiero sobre el que quiere eliminar los datos y, después, las fechas de los datos que quiere eliminar. Tiene también la posibilidad de eliminar todos los datos del ticker introducido marcando la casilla de “Seleccionar Todo”. La Ilustración 99 contiene una imagen con los dos pasos que tiene que completar el administrador. Ilustración 99. Vista Formulario Eliminar Datos Históricos 130 Si los datos introducidos por el usuario son correctos, el sistema procederá con la eliminación de los datos indicados por el administrador y, posteriormente, dirigirá a este al menú principal. Gestión de las Cuentas de Usuario Por último, cada usuario puede modificar la información asociada a su cuenta. Para ello, el usuario ha de hacer click en el botón “Cuenta de Usuario” que aparece en el menú desplegable asociado al símbolo de usuario situado arriba a la derecha. Se puede ver dónde se encuentra dicho botón en la Ilustración 100. Ilustración 100. Vista Seleccionar "Cuenta de Usuario" Una vez hecho esto, el usuario accede a la página en donde puede modificar toda su información. En concreto, desde aquí puede modificar su nombre de usuario, su nombre completo y su contraseña y, además, puede darse de baja también en la aplicación haciendo click en el botón rojo “Eliminar Cuenta” que aparece en Ilustración 101. Ilustración 101. Vista Cuenta de Usuario 131 Cada usuario tendrá acceso únicamente a la información de su propia cuenta y podrá modificar únicamente la información de su propia cuenta excepto el administrador, que podrá realizar sendas acciones para todas las cuentas de usuario del sistema.