Upload
fx-talentum
View
31
Download
2
Embed Size (px)
Citation preview
TRABAJO FIN DE GRADO
ESCUELA UNIVERSITARIA POLITECNICA
Departamento de Ciencias Politécnicas
Grado en Ingeniería Informática
Desarrollo de un software de predicción financiera
Autor:
D. José Carlos Cano Lorente
Directores:
Dr. D. José María Cecilia Canales
Dr. D. Horacio Pérez Sánchez
Murcia, Junio de 2015
TRABAJO FIN DE GRADO
ESCUELA UNIVERSITARIA POLITECNICA
Departamento de Ciencias Politécnicas
Grado en Ingeniería Informática
Desarrollo de un software de predicción financiera
Autor:
D. José Carlos Cano Lorente
Directores:
Dr. D. José María Cecilia Canales
Dr. D. Horacio Pérez Sánchez
Murcia, Junio de 2015
Autorización
Dr. D. José María Cecilia Canales y Dr. D. Horacio Pérez Sánchez,
profesores de la UCAM
CERTIFICAN: que el Trabajo Fin de Grado titulado “Desarrollo de un
software de predicción financiera” que presenta D. José Carlos Cano Lorente,
para optar al título oficial de Grado en Ingeniería Informática, ha sido realizado
bajo su dirección.
A su juicio reúne las condiciones necesarias para ser presentado en la
Universidad Católica San Antonio de Murcia y ser juzgado por el tribunal
correspondiente.
Murcia, a de Junio de 2015
Agradecimientos
A mis directores de proyecto, José María Cecilia y Horacio Pérez, que
desde nuestra primera reunión para tratar el desarrollo de este TFG, mostraron
una gran confianza en lo que podríamos conseguir, y supieron transmitirme esa
ilusión. Sus enseñanzas e indicaciones han sido fundamentales para enfocar la
metodología y no perder de vista nunca los objetivos que perseguíamos.
A la empresa Artificial Intelligence Talentum, S.L., por haber colaborado
con la UCAM en definir este proyecto, y por darme la oportunidad de contribuir
humildemente en una parte del ambicioso proyecto del desarrollo de
herramientas de trading. Sus ánimos, desde nuestra primera entrevista, han
sido muy gratificantes.
A la Universidad Católica San Antonio de Murcia, por ofrecerme la
posibilidad de actualizar mi formación. Su plan de estudios on-line es de gran
calidad, y permite compaginar la vida profesional, familiar y académica de
muchas personas como yo.
Y a mi esposa y mis tres hijas, que me han acompañado con resignación
durante los dos últimos años en mis dedicación al estudio de las asignaturas y
a la elaboración de este TFG.
Índice de contenidos
Índice de contenidos ............................................................................................. 11
1 Introducción .................................................................................................... 25
1.1 Motivación .................................................................................................. 25
1.2 Definición .................................................................................................... 26
1.3 Objetivos propuestos .................................................................................. 26
2 Estudio del mercado ....................................................................................... 29
2.1 Conceptos relevantes del dominio de la aplicación ................................... 29
2.2 Relación con proyectos con la misma funcionalidad .................................. 35
2.3 Estudio de viabilidad ................................................................................... 37
2.3.1 Alcance del proyecto ............................................................................. 37
2.3.2 Estudio de la situación actual ................................................................ 37
2.3.3 Estudio y valoración de las alternativas de solución ............................. 38
2.3.4 Selección de la solución ......................................................................... 38
3 Metodologías usadas ...................................................................................... 41
3.1 Desarrollo en cascada o secuencial ............................................................ 41
3.2 Metodología Ágil ......................................................................................... 42
3.2.1 XP (Extreme Programming) ................................................................... 44
3.2.2 SCRUM ................................................................................................... 44
3.2.3 Otras metodologías ágiles ..................................................................... 47
3.3 Metodología elegida ................................................................................... 47
3.3.1 Los roles ................................................................................................. 48
3.3.2 Los eventos ............................................................................................ 49
3.3.3 Seguimiento ........................................................................................... 49
4 Tecnologías y herramientas utilizadas en el proyecto .................................... 51
4.1 Cygwin ......................................................................................................... 51
4.2 VMWare Player ........................................................................................... 52
4.3 Eclipse ......................................................................................................... 52
4.4 Subversion ................................................................................................... 52
4.5 Python y Matplotlib .................................................................................... 53
4.6 Libconfig ...................................................................................................... 53
4.7 TA-Lib .......................................................................................................... 54
4.8 Kunagi ......................................................................................................... 54
5 Estimación de recursos y planificación ........................................................... 57
5.1 Método de estimación utilizado ................................................................. 57
5.2 Planificación ................................................................................................ 59
5.3 Valoración de la dedicación y coste económico ......................................... 64
5.3.1 Costes de material ................................................................................. 64
5.3.2 Costes de consultoría ............................................................................ 65
6 Desarrollo del proyecto ................................................................................... 67
6.1 Preparativos ................................................................................................ 67
6.2 Sprint 1 ........................................................................................................ 71
6.2.1 Sprint Planning ...................................................................................... 71
6.2.2 Sprint Review ......................................................................................... 74
6.2.3 Sprint Retrospective .............................................................................. 76
6.2.4 Demos .................................................................................................... 77
6.3 Sprint 2 ........................................................................................................ 79
6.3.1 Sprint Planning ...................................................................................... 79
6.3.2 Sprint Review ......................................................................................... 83
6.3.3 Sprint Retrospective .............................................................................. 85
6.3.4 Demos .................................................................................................... 86
6.4 Sprint 3 ........................................................................................................ 89
6.4.1 Sprint Planning ...................................................................................... 89
6.4.2 Sprint Review ......................................................................................... 92
6.4.3 Sprint Retrospective .............................................................................. 93
6.4.4 Demos .................................................................................................... 94
6.5 Sprint 4 ........................................................................................................ 95
6.5.1 Sprint Planning ...................................................................................... 95
6.5.2 Sprint Review ....................................................................................... 101
6.5.3 Sprint Retrospective ............................................................................ 102
6.5.4 Demos .................................................................................................. 102
6.6 Sprint 5 ...................................................................................................... 104
6.6.1 Sprint Planning .................................................................................... 104
6.6.2 Sprint Review ....................................................................................... 110
6.6.3 Sprint Retrospective ............................................................................ 111
6.6.4 Demos .................................................................................................. 111
6.7 Sprint 6 ...................................................................................................... 113
6.7.1 Sprint Planning .................................................................................... 113
6.7.2 Sprint Review ....................................................................................... 117
6.7.3 Sprint Retrospective ............................................................................ 118
6.7.4 Demos .................................................................................................. 119
7 Pruebas y Despliegue de la solución ............................................................ 121
7.1 Pruebas ..................................................................................................... 121
7.2 Despliegue ................................................................................................. 136
8 Conclusiones ................................................................................................ 137
8.1 Objetivos alcanzados ................................................................................ 137
8.2 Conclusiones del trabajo y personales ..................................................... 138
8.3 Vías futuras ............................................................................................... 138
9 Bibliografía .................................................................................................... 141
10 Anexo I Diseño de la aplicación ................................................................. 145
10.1 Gestión de memoria .............................................................................. 145
10.1.1 Datos históricos ................................................................................. 145
10.1.2 Nuevos indicadores ........................................................................... 146
10.1.3 Datos de configuración y control del proceso................................... 148
10.2 Proceso .................................................................................................. 151
10.3 Módulos................................................................................................. 152
11 Anexo II Manual de Usuario ...................................................................... 155
11.1 Introducción .......................................................................................... 155
11.2 Preparando la ejecución ........................................................................ 156
11.3 Indicadores técnicos .............................................................................. 159
11.4 Definiendo los escenarios ..................................................................... 161
11.4.1 Indicadores técnicos .......................................................................... 161
11.4.2 Gráficos .............................................................................................. 163
11.4.3 Constantes ......................................................................................... 165
11.4.4 Operaciones ....................................................................................... 166
11.4.5 Precios ............................................................................................... 168
11.4.6 Uniéndolo todo .................................................................................. 168
11.5 Escritura de fórmulas ............................................................................ 169
11.6 Ejecución ............................................................................................... 170
11.7 Manejo de errores ................................................................................. 175
12 Anexo III Manual de Instalación................................................................. 177
12.1 Instalación en Linux ............................................................................... 177
12.1.1 Linux como máquina virtual sobre Windows (opcional) ................... 177
12.1.2 Instalación del IDE Eclipse (opcional) ................................................ 188
12.1.3 Instalación de TA-Lib ......................................................................... 191
12.1.4 Instalación de libconfig ...................................................................... 193
12.1.5 Instalación de Python ........................................................................ 195
12.1.6 Instalación de matplotlib ................................................................... 196
12.1.7 Instalación de MySQL ........................................................................ 197
12.2 Instalación en Windows ........................................................................ 197
12.2.1 Instalación del compilador ................................................................ 197
12.2.2 Instalación de TA-lib .......................................................................... 205
12.2.3 Instalación de libconfig ...................................................................... 209
12.2.4 Instalación de python ........................................................................ 210
12.2.5 Instalación de matplotlib ................................................................... 211
12.2.6 Instalación de subversion .................................................................. 211
12.2.7 Instalación del cliente MySql ............................................................. 213
12.3 Instalación de la aplicación “Trading” ................................................... 213
12.3.1 Instalación de un ejecutable ............................................................. 213
12.3.2 Instalación del código fuente ............................................................ 214
13 Lista de colores definidos en matplotlib ..................................................... 219
14 Lista de errores de ejecución..................................................................... 221
15 Índice de figuras ........................................................................................ 223
16 Índice de tablas ......................................................................................... 231
17 Glosario de términos ................................................................................. 235
21
Resumen
Los inversores, cuando actúan en el mercado, se mueven guiados por
las perspectivas de evolución de una u otra empresa, tipos de cambio, etc.
Estas perspectivas se ven influenciadas por datos fundamentales como pueden
ser resultados anuales, evolución del volumen de facturación o capacidad de
crecimiento, cuando trabajamos con empresas, o datos macroeconómicos y
acontecimientos a nivel mundial, cuando trabajamos en el Mercado de Divisas.
El éxito o fracaso de las inversiones vienen determinados por el
momento en el que el inversor entra o sale de los mercados, por lo que la
búsqueda de buenas estrategias de trading, entendidas éstas como una serie
de reglas (matemáticas, algorítmicas, analíticas o gráficas) que definan la
forma de operar, se ha convertido en objetivo primordial de los inversores.
El avance de la tecnología e Internet ha puesto al alcance de cualquier
persona suficiente información sobre empresas, naciones y mercados como
para que todos seamos potenciales inversores.
Pero también ha facilitado la creación de ingentes repositorios
informatizados de datos históricos, favoreciendo con ello el denominado
“análisis técnico”, encargado de predecir tendencias futuras basándose en la
evolución pasada de las cotizaciones.
Es en este punto donde se ha desarrollado este TFG, ofreciendo al
cliente una herramienta de software que evalúa varias estrategias o escenarios,
aplicando diferentes reglas e indicadores a un conjunto de datos de entrada,
simulando cómo se hubiera comportado y qué beneficios o pérdidas se
hubieran obtenido en cada caso.
Un buena estrategia de trading puede ser posteriormente el núcleo de
un sistema de trading automatizado (que opere sin intervención humana)
decidiendo cuándo entrar y salir del mercado, e interactuando con el mercado
real.
Palabras clave:
Mercado, Divisa, Bolsa, Análisis Técnico, Indicador
23
Abstract
Investors, when acting in the financial markets, are moved by the
evolutions perspective of the companies, exchange rates, etc. These
perspectives are influenced by fundamental data such as annual results,
evolution in turnover and growth capacity, (when working with company stocks)
or macroeconomic data and worldwide events (when working in the Forex
market).
The success or failure of investments are determined by the time at
which the investor enters or leaves the markets, so finding good trading
strategies, understanding these as a set of rules (mathematical, algorithmic,
analytical or graphical) that define the way we operate, has become a primary
target of investors.
The advancement of technology and the Internet has provided to anyone
with required information about companies, nations and markets to make we all
potential investors.
But it has also facilitated the creation of huge databases storing historical
data, favoring the so-called "technical analysis" in charge of predicting future
trends based on past prices development.
The present work has been developed in this area, offering the customer
a software tool that evaluates several strategies or scenarios by applying
different rules and indicators to a set of input data, simulating the behavior and
which profits or losses could have been obtained in each case.
A good trading strategy can subsequently be the nucleus of an
automated trading system (which operate without human intervention) deciding
when to enter and exit the market, and interacting with the real market.
Keywords:
Market, Currency, Exchange, Technical Analysis, Indicator.
25
1 Introducción
1.1 Motivación
Un operador de bolsa (o trader) puede realizar operaciones basándose
en decisiones individuales, considerando cuándo y qué comprar o vender en
cada momento. Sus decisiones se basarán en el conocimiento del que
disponga sobre la evolución de los diferentes valores bursátiles o tipos de
cambio. También debe ser capaz de inferir comportamientos futuros tomando
como base información económica precisa, pero también el “estado de ánimo”
de los mercados. Adicionalmente, un trader experimentado podrá aplicar
experiencias basadas, que influenciarán sus decisiones en un sentido u otro.
De esta forma, toda la responsabilidad recae en el individuo, por lo que
las emociones podrían influir en la toma de decisiones. Además, su eficacia
operativa estará relacionada con la capacidad que tenga de estar vigilando el
mercado continuamente, pero siempre concentrándose en unos productos, que
tenderán a ser unos pocos.
Sin embargo, un trading automático puede vigilar el mercado
continuamente, para tantos productos como se diseñe y, basándose en un
conjunto de reglas, actuará en los mercados, eliminado el componente de las
emociones en la toma de decisiones.
Obviamente, una y otra metodología presentan ventajas y desventajas, y
siempre podemos pensar que una combinación de ambas ofrecerá mejores
resultados.
A la hora de elaborar una estrategia, los profesionales del trading utilizan
diversos indicadores que, aplicados sobre un conjunto de datos, nos pueden
indicar la tendencia que puedan seguir los precios. El trader, usará su
creatividad para elegir la combinación de indicadores que determinarán las
entrada en el mercado. Las salidas del mercado vendrán determinados por lo
puntos de máxima pérdida aceptada (lo que se denomina Stop Loss) y del nivel
de recogida de beneficios (conocido como Take Profit).
La principal motivación de este proyecto ha sido ayudar al trader en la
fase del backtesting o, según define Holland [1], “[…] la evaluación de las
rentabilidades que caben esperar de una estrategia de trading basada en los
rendimientos calculados a partir de datos históricos”. Con una herramienta de
este tipo, se puede probar si una determinada combinación de parámetros
funcionó en el pasado e indica al trader lo acertado o equivocada que puede
ser una estrategia.
26
El desarrollo de una herramienta de backtesting, principal objetivo de
este proyecto, engloba varias disciplinas, incluyendo la economía, la
informática y la estadística. Este hecho contribuyó de manera decisiva a que el
autor lo seleccionara como TFG.
1.2 Definición
Durante este TFG se ha desarrollado la aplicación “Trading”, una
aplicación de escritorio enfocada principalmente a entornos de
supercomputación sobre Linux.
Se ha desarrollo en lenguaje C, buscando rapidez de ejecución y
eficiencia en el manejo de grandes volúmenes de datos.
Funcionalmente este software permite la lectura de datos históricos de
operaciones en mercados financieros, desde fichero o desde una base de
datos. Sobre esta información, y en base a archivos de configuración creados
por el usuario, es capaz de calcular índices financieros y, en combinación con
un conjunto de reglas, decidir entradas y salidas del mercado. Finalmente
reporta el rendimiento de las operaciones para decidir qué reglas son las más
beneficiosas.
Adicionalmente ofrece una salida gráfica donde, sobre diagramas de
velas con los precios, se pueden mostrar los indicadores técnicos y las
operaciones de entrada/salida.
1.3 Objetivos propuestos
Los objetivos marcados por nuestro cliente (Artificial Intelligence
Talentum, S.L.) para este proyecto quedan detallados a continuación:
Objetivo General 1 (OG1): Desarrollo de una aplicación eficiente
o Objetivos Específico 1 (OE1): Desarrollo de un programa
automatizable (mediante el uso de archivos de
configuración), para el funcionamiento en
supercomputadoras
o Objetivos Específico 2 (OE2): Uso de un lenguaje de
programación eficiente en términos de velocidad y
memoria
Objetivo General 2 (OG2): Desarrollo de una herramienta de
análisis visual de operaciones en los mercados
o Objetivos Específico 3 (OE3): Lectura de datos a través de
un fichero o directamente desde una base de datos
27
o Objetivos Específico 4 (OE4): Representación gráfica de
datos históricos e indicadores técnicos, mediante gráficos
de velas y líneas
Objetivo General 3 (OG3): Desarrollo de una herramienta de
backtesting
o Objetivo Específico 5 (OE5): Calcular indicadores técnicos
sobre un conjunto de datos históricos
o Objetivo Específico 6 (OE6): En base a un conjunto de
reglas, decidir el momento de realizar una operación en el
mercado y de finalizar la misma
o Objetivo Específico 7 (OE7): calcular el beneficio neto del
conjunto de operaciones que se produzcan en el periodo
de tiempo establecido
o Objetivo Específico 8 (OE8): elaborar un informe con datos
estadísticos sobre las operaciones realizadas
29
2 Estudio del mercado
2.1 Conceptos relevantes del dominio de la aplicación
Según podemos consultar en el “Diccionario Económico” de la edición
digital del diario expansión [8], “El mercado financiero es el lugar, mecanismo
o sistema electrónico donde se negocian los activos, productos e instrumentos
financieros o se ponen en contacto los demandantes y los oferentes del activo
y es donde se fija un precio público de los activos por la confluencia de la oferta
y la demanda”.
Otra definición la podemos encontrar en la enciclopedia financiera on-
line, donde se nos indica que “Un Mercado Financiero pude definirse como un
conjunto de mercados en los que los agentes deficitarios de fondos los
obtienen de los agentes con superávit” [9].
Según esta misma fuente, los principales mercados financieros son los
siguientes:
Bolsas de Valores: Una bolsa de valores es una organización que
establece "sistemas de negociación" para que los inversores
puedan comprar y vender acciones, derivados y otros valores.
Las bolsas de valores también proporcionan las instalaciones
para la emisión y amortización de valores, así como otros
instrumentos financieros y los rendimientos de capital incluyendo
el pago de dividendos. Se trata de una de las fuentes más
importantes de recaudación de capital para las empresas.
Mercados de Renta Fija: El mercado de bonos (también conocido
como de deuda, de crédito, o mercado de renta fija) es un
mercado financiero, donde los participantes compran y venden
títulos de deuda, normalmente en forma de bonos. Los mercados
de renta fija, en la mayoría de los países siguen siendo
descentralizados, al contrario del mercado de acciones, futuros y
del mercado de factores. Esto ha ocurrido, en parte, porque no
hay dos emisiones de bonos exactamente iguales, lo que hace
que el número de títulos en el mercado sea inmenso.
Mercados de Divisas: El mercado de divisas o FOREX, permite
que los bancos, empresas y otras instituciones fácilmente
compren y vendan divisas. El propósito del mercado de divisas es
facilitar el comercio internacional y la inversión. El mercado de
divisas ayuda a las empresas a convertir una moneda en otra.
30
Mercados de Factores: El comercio de materias primas consiste
en el comercio físico directo y a través de derivados financieros
para la compra/venta a plazo permitiendo asegurar un precio de
venta o compra en el futuro a productores y/o clientes.
El análisis técnico, como herramienta para analizar los mercados y los
movimientos de precios, viene siendo utilizado desde el siglo XIX, en tiempos
del analista Chales Dow (que da nombre a la teoría considerada el origen de
los sistemas de inversión que usan como base esta metodología). Dow publicó
sus ideas en una serie de editoriales que escribió para el diario Wal Street
Journal.
Según John J. Murphy, autor de una publicación conocida y considerada
por muchos en este ámbito como la Biblia del Análisis Técnico, “La teoría de
Dow todavía es la piedra angular del estudio de análisis técnico, incluso ante la
sofisticada tecnología informática actual y la proliferación de indicadores
técnicos supuestamente nuevos y mejores” [4]
Murphy define el análisis técnico como “[…]el estudio de los
movimientos del mercado, principalmente mediante el uso de gráficos, con el
propósito de pronosticar las futuras tendencias de los precios” [5] y entiende
que los fundamentos que lo soportan son:
Los movimientos del mercado los descuentan todo. Según esto, el técnico
cree que cualquier cosas que posiblemente pueda afectar al precio (por
razones fundamentales, políticas, psicológicas u otras) se refleja
realmente en el precio de ese mercado. Concluye por tanto que todo lo
que hace falta es un estudio de los movimientos de los precios, sin
importar la razón de los mismos.
Los precios se mueven por tendencias, y es el propósito de este enfoque
identificarlas dentro de sus primeras etapas de desarrollo, con el fin de
que las transacciones vayan en la dirección de dichas tendencias hasta
que los precios muestren señales de variar la dirección que llevan.
La historia se repite y una gran parte del análisis técnico y del estudio del
movimiento de los mercados tiene que ver con el estudio de la psicología
humana. Por ejemplo, los patrones gráficos recogidos durante los últimos
cien años reflejan imágenes concretas que aparecen en los gráficos de
precios y reflejan la psicología alcista o bajista del mercado y, dado que
la psicología humana tiene tendencia a no cambiar, podemos pensar que,
si ha funcionado bien en el pasado, también funcionará en el futuro.
31
En el estudio del comportamiento del mercado la principal herramienta
son los gráficos, donde se representan las cotizaciones del mercado. Los más
utilizados son las velas japonesas, pues aportan una idea de la volatilidad de
los precios, el precio de cierre, de apertura, el máximo y el mínimo en cada
período. Una vela corresponde a un período y, de un vistazo, se observa si al
terminar el período se ha elevado el precio o ha disminuido. La vela verde
indica una tendencia alcista y la roja una bajista:
Figura 2 Gráfico de velas. Evolución de los precios
John J. Murphy dedica varios capítulos de su libro “Análisis técnico de
los mercados financieros” a describir diferentes tipos de gráficos y su utilidad
[6].
Ahora bien, el análisis mediante gráficos suele ser subjetivo ya que
puede darse el caso de que dos analistas, analizando la misma información,
extraigan conclusiones diferentes sobre la situación del mercado.
Figura 1 Gráfico de velas. Descripción
32
La otra herramienta que ofrece el análisis técnico, y que busca eliminar
en lo posible esa subjetividad, son los indicadores, que podríamos considerar
como ejemplo de comportamiento objetivo de forma que, mediante unas
determinadas reglas, se decidirán operaciones de entrada y salida del
mercado. Los indicadores hacen uso únicamente de instrumentos matemáticos
y estadísticos lo que permite su inclusión en herramientas de software que
ejecutan automáticamente decisiones basándose en las tendencias.
Se debe tener en cuenta que la mayoría de estos indicadores analizan la
naturaleza de las tendencias. Es por ello que se desaconseja su uso en el caso
de períodos temporales donde los mercados apenas muestran tendencia (por
ejemplo en momentos que se denominan “de movimiento lateral”).
A la hora de definir una estrategia de trading basada en indicadores
técnicos, el trader dispone de una gran cantidad de ellos donde elegir (por
ejemplo, TAlib, librería usada en este proyecto, ofrece 200 indicadores [37]). Es
fácil encontrar abundante bibliografía y Sites en internet sobre este tema pero
hay coincidencia sobre cuáles son los más utilizados:
Media móvil simple: aplicada a los precios de apertura o cierre de las
cotizaciones. Para generar órdenes de compra y venta se utiliza una regla
sencilla: las señales de compra se usan cuando la media móvil corta por
arriba la línea de precios y las de venta, cuando corta por abajo la línea
de precios.
RSI: Índice de fuerza relativa. Marca aquellos momentos en los que el
mercado tiene un estado de sobrecompra o sobreventa y en los cuales
hay que entrar a operar. En un rango de valores de 0 a 100 lo normal es
comprar cuando este indicador es menor a 70 y vender cuando sobrepasa
el valor de 30.
MME: media móvil exponencial. Se utiliza este tipo de medias porque
asigna más importancia a los precios de cierre más cercanos y menor
importancia a los más alejados.
Bandas de Bollinger: analiza las fluctuaciones del mercado, mediante una
línea central obtenida con una media móvil y dos bandas laterales,
obtenidas sumando y restando un determinado número de desviaciones
típicas.
Una vez diseñada la estrategia basada en el análisis técnico hay que
evaluar su fiabilidad, ejecutando con herramientas informáticas una simulación
contra datos históricos y analizando las ganancias y pérdidas del sistema, y
33
también el modo en que la estrategia opera (por ejemplo, se podría querer
conocer si la estrategia inicia muchas operaciones de pocos márgenes o pocas
de grandes márgenes). Estamos hablando del backtesting, objetivo principal
del software desarrollado en este TFG y que ayuda al trader a “afinar” el
sistema, permitiendo cambios en los parámetros y relanzar la simulaciones
para observar el impacto en el comportamiento.
Para evaluar la bondad de un sistema de trading se utilizan varios
ratios. De entre todos ellos, podemos destacar:
Beneficio Neto (o Profit): en principio ésta debería ser la medida
principal del rendimiento o efectividad de un sistema. Cuanto más
beneficio neto, mejor. Sin embargo surge una duda: si escogemos
el sistema que gana más ¿podemos asegurar que esto se
repetirá en el futuro?. Por eso, este ratio, usado por sí solo
presenta dos inconvenientes:
o Pudiera ser que la ganancia que ha entregado se haya
debido a una única operación de mucho beneficio, aunque
el resto de operaciones hayan sido pérdidas ¿se repetirá
en el futuro una operación de este tipo?
o Aunque el sistema tenga ganancias constantes, si en un
momento determinado ocasiona una pérdida de capital
muy elevada será muy probable que se piense que ha
dejado de funcionar (aunque no sea así) y se deje de
operar. Para manejar esta situación se introduce un nuevo
ratio.
Drawdown: es la máxima disminución de capital desde un
máximo anterior. Mide cuánto dinero se está perdiendo en un
momento determinado respecto de un momento anterior en el que
el sistema tuvo su máxima ganancia. Cuando miremos el
beneficio neto de un sistema deberíamos mirar también el
drawdown que vamos a tener que soportar para conseguir dicho
beneficio
Recovery Factor: relaciona los dos anteriores (divide la ganancia
neta entre el máximo drawdown del sistema). Un sistema que
genera un beneficio de 100 con un máximo drawdown de 10,
tiene un Recovery Factor de 10:1. A mayor ratio mejor estrategia.
Profit Factor: se calcula dividiendo la ganancia de las operaciones
ganadores entre la pérdida de las operaciones perdedoras. Por
34
definición, si la estrategia es rentable, el Profit Factor sería mayor
que 1.
Número de operaciones: indica el total de operaciones realizadas
en los mercados. Si nos interesa que nuestro sistema no genere
demasiadas operaciones, hay que incluir este ratio en el análisis.
Basándose en todos esos indicadores, un trader puede decidir si un
sistema es bueno o no. Así, por ejemplo, podría pedir que tuviera un Profit
Factor > 2 y un Recovery Factor > 7.
Como ejemplo, Oscar Cagigas en su blog [7], considera que las
características de un sistema que merece la pena ser operado con dinero real
son que:
Tiene menos de 4 o 5 parámetros (es sencillo)
Está evaluado en suficientes datos. Al menos 2 años si es intradía
y al menos 10 años si es diario. Como mínimo buscando unas
200 operaciones.
Genera ganancias año tras año, aunque sean limitadas y es
robusto, o sea que, variando ligeramente sus parámetros, sus
resultados varían ligeramente (es decir, no está construido sobre
un pico de ganancia).
Funciona en la mayoría de instrumentos con características
similares (otra forma de robustez).
Recovery Factor >= 6
Profit Factor >= 2
Dependiendo de la complejidad de la estrategia (número de indicadores
y reglas de decisión) y del volumen de datos históricos sobre los que se quiere
simular, podría ser necesario disponer de un software que pueda ejecutarse en
sistemas de alto poder de computación, y esperar como resultado un informe
con las estrategias victoriosas de entre todas las ejecutadas basándose en los
indicadores usados (cuantas más veces se evalúe un sistema, y contra cuantos
más datos, más seguros podremos estar de su eficacia).
35
2.2 Relación con proyectos con la misma funcionalidad
Podemos encontrar en el mercado herramientas comerciales de
backtesting y también otras que, siendo herramientas de trading, incluyen
módulos de backtesting y optimización. Podemos destacar:
Metatrader (http://www.metatrader4.com/en): una plataforma de trading
creada en 2005 por MetaQuotes software para operar inicialmente en
Forex. Su punto más fuerte es la capacidad gráfica y la facilidad de uso.
Dispone de una gran variedad de indicadores y de un lenguaje de
programación que permite crear nuevos indicadores. Ofrece la opción de
realizar backtesting (y optimización) para comprobar el sistema que
programemos y una gestión incorporada de bases de datos históricos con
una función de importación/exportación de dichos datos.
TradeStation (http://www.tradestation.com/): creada en 1991 como tal, si
bien provenía de la compañía Omega Research, fundada en 1982.
Dispone de todo lo necesario para el backtesting y conexiones con los
servidores que operan en el mercado. Al igual que Metatrader, provee de
datos históricos y permite su descarga. Es posible también crear y
almacenar estrategias.
Wealth-Lab (http://www.wealth-lab.com): Es una plataforma de trading
propiedad de Fidelity Investments. Los usuarios pueden programar y
probar estrategias. Dispone de un entorno de programación basado en
C#. Se pueden tener varias fuentes de datos y es posible importar datos
de otras plataformas incluso de ficheros ASCII.
QuantConnect: (https://www.quantconnect.com/) proyecto que cuenta con
el apoyo de Fundación Chile y CORFO. Permite a los usuarios programar
en un entorno local y luego recibir un correo electrónico con el resultado
de su simulación, la cual se trabaja a través de la nube. Los traders que
usan este software deben tener conocimientos de programación para
poder sacar partido e interactuar con la API que comparte.
MultiCharts (http://www.multicharts.com/). Creada en 2005. Cuenta con un
lenguaje de programación llamado PowerLanguage y ofrece backtesting y
optimización.
NinjaTrader (http://www.ninjatrader.com/) . Empresa creada en 2004 y con
sede en Denver. Es gratuita cuando se usa para representación gráfica,
análisis de mercados y desarrollo y simulación de sistemas de trading y
únicamente se paga por la funcionalidad de interactuar con los mercados
para colocar órdenes.
36
Figura 8 Web Site de NinjaTrader
Figura 3 Web Site de MetaTrader Figura 4 Web Site de TradeStation
Figura 5 Web Site de Wealth-Lab Web Figura 6 Web Site de QuantConnect
Figura 7 Web Site de MultiCharts
37
2.3 Estudio de viabilidad
2.3.1 Alcance del proyecto
El resultado de este proyecto es un software financiero de backtesting
desarrollado en C y orientado a sistemas Linux, especialmente a
computadoras de alto rendimiento. El alcance lo hemos establecido en lograr
una buena capacidad de procesamiento, el manejo de grandes volúmenes de
datos históricos y la posibilidad de configuración flexible, en concreto
especificar de una manera sencilla combinaciones de parámetros que generen
un elevado número de combinaciones (escenarios) a probar.
El interfaz gráfico de usuario está excluido del producto, siendo la
ejecución desatendida el modo normal de explotación de este software. Una
vez suministrados los datos de entrada y las reglas que deben operar sobres
esos datos, el programa debe poder ejecutarse sin intervención del usuario,
ofreciendo como salida un informe con las mejores estrategias de trading.
2.3.2 Estudio de la situación actual
El backtesting es una herramienta de gran importancia en el diseño de
estrategias de trading, por lo que casi todo el software comercial existente
incorpora la capacidad de optimización.
Ahora bien, las herramientas disponibles en el mercado aportan como
ventaja para los usuarios la interfaz gráfica y los lenguajes de programación
propios que, si bien permiten elaborar complejas estrategias de trading,
también dificultan la curva de aprendizaje de las herramientas. Además,
aunque todas ellas manejan datos
históricos, lo hacen en formatos propietarios o en formatos públicos, pero con
poca flexibilidad.
El software desarrollado en el marco de este proyecto quiere ser una
alternativa:
Priorizando la velocidad de cálculo, eliminando el interfaz de
usuario
38
Posibilitando el acceso a bases de datos propias donde el cliente
pueda componer sus propios conjunto de datos, permitiendo así
analizar estrategias testeadas sobre valores agregados.
2.3.3 Estudio y valoración de las alternativas de solución
En función de las consideraciones expuestas en el apartado anterior, el
uso de software comercial queda excluido como una solución para las
necesidades de nuestro cliente.
Como alternativa, decidimos desarrollar una nueva herramienta que nos
aporte la funcionalidad que necesitamos, lo cual nos lleva a tener que
seleccionar entre varias alternativas:
El lenguaje de programación adecuado
el sistema operativo sobre el que ejecutar la aplicación: Windows,
Linux
Persistencia de datos: motores de bases de datos (Sql Server,
MySQL, Oracle), ficheros
Nuestro cliente tiene identificadas sus necesidades, con especial
hincapié en la rapidez de ejecución en un proceso iterativo de búsqueda del/los
mejores escenarios dentro de los diseñados. No tiene requerimientos
especiales en cuanto al interfaz de usuario, que será el objeto de otra
aplicación.
2.3.4 Selección de la solución
Descartamos, por tanto, desarrollar la herramienta para explotarla en un
entorno web. El objetivo de la aplicación, el proceso de optimización en sí, será
más rápido y consumirá menos memoria en una aplicación de escritorio.
A la hora de seleccionar el lenguaje de programación para un software
de escritorio, nos hemos decantado por el C (Ansi C), principalmente por su
rapidez (está cercano a los lenguajes de bajo nivel por lo que es muy popular
para la creación de software de sistema) y eficiencia.
Otras opciones habrían sido C++, C# o Java. Java lo descartamos por
ser un lenguaje interpretado, lo que lo hace más lento. C# lo descartamos por
estar enfocado a sistemas Windows. Sin embargo, C++, siendo también un
buen candidato, no lo hemos seleccionado porque es más complejo y porque la
orientación a objetos realmente no es un requerimiento en este proyecto.
39
En cuanto al sistema operativo, hemos seleccionado Linux por ser muy
robusto, estable y rápido. Además requiere poco hardware y el manejo de la
memoria de Linux evita que los errores de las aplicaciones detengan el núcleo
de Linux. Como última ventaja, aportamos que es un sistema operativo libre.
No obstante, también puede ser ejecutado sobre Windows (en concreto sobre
Cygwin [22]), que proporciona un entorno de funcionamiento similar a los
sistemas Unix, pero dentro de Microsoft Windows).
Para el cálculo de indicadores se ha confiado en la librería TA-lib [37],
que implementa el cálculo de 200 de estos indicadores y que ofrece interfaces
para diferentes lenguajes de programación.
Para facilitar su explotación en supercomputadores, la aplicación
“Trading” se lanza desde una consola de comandos, aceptando como entrada
los archivos de configuración que contienen las estrategias a probar y ofrece
como salida archivos de texto informando sobre los resultados de las pruebas y
también gráficos para un análisis visual del comportamiento de las estrategias.
La elaboración de los gráficos recae en matplotlib [34]. La lectura y análisis
sintáctico de los archivos de configuración se realiza mediante la librería
libconfig [36].
En cuanto al almacenamiento de información, realmente no es
necesaria, por lo que no usaremos ninguna. Únicamente debemos permitir el
acceso, en modo lectura, a bases de datos MySQL del cliente para recoger
datos históricos.
41
3 Metodologías usadas
Nos enfrentamos en este punto a la decisión de adoptar una de las dos
grandes corrientes metodológicas en el desarrollo de software existentes: o “En
Cascada” (o secuencial) o “Ágil”. Presentamos brevemente las características
de una y otra, con objeto de conocer las motivaciones que nos han hecho
decantarnos por la segunda.
3.1 Desarrollo en cascada o secuencial
El esquema de desarrollo en cascada propone actividades secuenciales,
donde el desarrollo fluye del punto inicial al final con varias etapas
diferenciadas, y el inicio de una etapa espera la finalización de la anterior:
Análisis de Requisitos
Diseño del Sistema
Implementación
Verificación
Mantenimiento
Nos propone realizar con antelación un análisis intensivo de
requerimientos. Esto es debido a que se hace complicado volver a etapas
previas cuando se encuentran diferencias en el alcance del proyecto. Una vez
que una fase se ha completado es casi imposible hacer cambios.
A pesar de que este modelo es el paradigma más antiguo utilizado en la
ingeniería del software, su eficacia se pone en duda por los problemas que se
encuentran algunas veces [10]. Mencionamos dos en concreto expuestos por
Pressman (2002) en su libro sobre Ingeniería del Software:
“A menudo es difícil que el cliente exponga explícitamente todos los
requisitos El modelo lineal secuencial lo requiere y tiene dificultades a la hora
de acomodar la incertidumbre natural al comienzo de muchos proyectos
El cliente debe tener paciencia. Una versión del programa no estará
disponible hasta que el proyecto esté muy avanzado. Un grave error puede ser
desastroso si no se detecta hasta que se revisa el programa”
Pero, a pesar de estos problemas, sigue siendo el modelo más utilizado
porque, frente a un desarrollo desorganizado, ofrece algunas ventajas, como
son el hecho de estar centrado en la planificación (exigiendo un plan y visión
claras), lo que facilita la estimación de costes y plazo. Además, en caso de que
42
un diseñador abandonara el equipo, el reemplazo sería fácil siguiendo el plan
de desarrollo que siempre está previamente documentado.
3.2 Metodología Ágil
Propone un diseño de software incremental e iterativo. Fue la respuesta
a las limitaciones de la metodología en cascada, dotando a los diseñadores de
una mayor libertad de responder a cambios en los requisitos a medida que
surgen.
Los doce principios que constituyen esta metodología son públicos y
están recogidos en el Manifiesto por el Desarrollo Ágil de Software [11] pero se
podrían resumir en la siguiente tabla, extraída de la misma fuente:
Tabla 1 Filosofía de desarrollo Ágil
Es importante Pero todavía lo es mas
Procesos y herramientas Individuos e interacciones
Documentación extensiva Software funcionando
Negociación contractual Colaboración con el cliente
Seguir un plan Respuesta ante el cambio
En definitiva, se ofrece un modelo de diseño flexible, donde se fomentan
planes adaptables y desarrollo evolutivo. Los desarrolladores trabajan en
pequeños módulos cada vez.
Especialmente destacable es la interacción con el cliente. Éste ofrece
realimentación simultáneamente al desarrollo, como las pruebas de software.
Por este motivo las metodologías ágiles son especialmente beneficiosas en los
casos en los que los objetivos finales de los proyectos no están claramente
definidos (casos de clientes cuyas necesidades y objetivos sean un poco
vagos). En estos casos los requisitos se clarifican a medida que el proyecto
evoluciona, dejando que el desarrollo pueda ser modificado para adaptarse a
los nuevos evolutivos.
Por el contrario, los plazos y costes son a priori difíciles de predecir
pues, sin un plan claro, todo presenta un aspecto de indefinición.
43
Los doce principios mencionado previamente son los siguientes [11]:
Nuestra mayor prioridad es satisfacer al cliente mediante la
entrega temprana y continua de software con valor.
Aceptamos que los requisitos cambien, incluso en etapas tardías
del desarrollo. Los procesos Ágiles aprovechan el cambio para
proporcionar ventaja competitiva al cliente.
Entregamos software funcional frecuentemente, entre dos
semanas y dos meses, con preferencia al periodo de tiempo más
corto posible.
Los responsables de negocio y los desarrolladores trabajan juntos
de forma cotidiana durante todo el proyecto.
Los proyectos se desarrollan en torno a individuos motivados.
Hay que darles el entorno y el apoyo que necesitan, y confiarles
la ejecución del trabajo.
El método más eficiente y efectivo de comunicar información al
equipo de desarrollo y entre sus miembros es la conversación
cara a cara.
El software funcionando es la medida principal de progreso.
Los procesos Ágiles promueven el desarrollo sostenible. Los
promotores, desarrolladores y usuarios debemos ser capaces de
mantener un ritmo constante de forma indefinida.
La atención continua a la excelencia técnica y al buen diseño
mejora la Agilidad.
La simplicidad, o el arte de maximizar la cantidad de trabajo no
realizado, es esencial.
Las mejores arquitecturas, requisitos y diseños emergen de
equipos auto-organizados.
A intervalos regulares el equipo reflexiona sobre cómo ser más
efectivo para, a continuación, ajustar y perfeccionar su
comportamiento en consecuencia.
Son varios los métodos ágiles existentes. XP (Extreme Programming) es
quizás el más conocido junto a SCRUM.
44
3.2.1 XP (Extreme Programming)
XP es un método que trata del “cómo se trabaja” en el proyecto. Fue
formulado por Kent Beck [12] y se basa en doce prácticas de obligado
cumplimiento que se pueden encontrar en la web [13]. Las características
fundamentales son [14]:
Desarrollo iterativo e incremental: pequeñas mejoras, unas tras
otras.
Pruebas unitarias continuas, frecuentemente repetidas y
automatizadas, incluyendo pruebas de regresión. Se aconseja
escribir el código de la prueba antes de la codificación.
Programación en parejas: se recomienda que las tareas de
desarrollo se lleven a cabo por dos personas en un mismo
puesto.
Frecuente integración del equipo de programación con el cliente o
usuario. Se recomienda que un representante del cliente trabaje
junto al equipo de desarrollo.
Corrección de todos los errores antes de añadir nueva
funcionalidad. Hacer entregas frecuentes.
Refactorización del código, es decir, reescribir ciertas partes del
código para aumentar su legibilidad y mantenimiento, pero sin
modificar su comportamiento. Las pruebas han de garantizar que
en la refactorización no se ha introducido ningún fallo.
Propiedad del código compartida: en vez de dividir la
responsabilidad en el desarrollo de cada módulo en grupos de
trabajo distintos, este método promueve el que todo el personal
pueda corregir y extender cualquier parte del proyecto.
Simplicidad en el código: es la mejor manera de que las cosas
funcionen.
3.2.2 SCRUM
Como hemos comentado, otro método ágil muy extendido es SCRUM
[15], que incide en “cómo se organiza y planifica” el proyecto. Consiste en un
conjunto de buenas prácticas para trabajar colaborativamente en equipo, y
obtener el mejor resultado posible de un proyecto. En SCRUM se realizan
entregas parciales y regulares del producto final, priorizadas por el beneficio
45
que aportan al receptor del proyecto. Por ello, SCRUM está especialmente
indicado para proyectos en entornos complejos, donde se necesita obtener
resultados pronto y donde los requisitos son cambiantes o poco definidos.
En SCRUM, un proyecto se ejecuta en bloques temporales cortos y fijos
(iteraciones de entre dos semanas y un mes natural). Cada iteración tiene que
proporcionar un resultado completo, un incremento de producto final que sea
susceptible de ser entregado con el mínimo esfuerzo al cliente cuando lo
solicite.
Figura 9 El Proceso en Scrum
El proceso se inicia con una lista de objetivos/requisitos del producto,
que actúa como plan del proyecto. En esta lista, denominada en SCRUM
Product Backlog, el cliente prioriza los objetivos balanceando el valor que le
aportan respecto a su coste y quedan repartidos en iteraciones y entregas.
Estos requisitos se denominan Historias de Usuario y están descritos en un
lenguaje no técnico, tal y como el cliente lo ve.
Los requisitos y prioridades se revisan y ajustan durante el curso del
proyecto a intervalos regulares.
Existen 4 eventos que caracterizan SCRUM y que se ven reflejados en
la figura 9:
1. Reunión de Planificación (Sprint Planning) [16]: Reunión durante
la cual el Product Owner presenta las historias de usuario por
orden de prioridad, según el valor que aporte al negocio. El
equipo determina la cantidad de historias que puede
comprometerse a completar en ese sprint para, en una segunda
parte de la reunión, decidir y organizar cómo lo va a conseguir.
46
2. SCRUM Diario (Daily SCRUM) [16]: Reunión de, como máximo,
15 minutos en la que el equipo se sincroniza para trabajar de
forma coordinada. Cada miembro comenta lo que hizo el día
anterior, que hará hoy y si hay impedimentos.
3. Revisión del Sprint (Sprint Review) [16]: Reunión que se celebra
al final del sprint y en la que el equipo presenta las historias
conseguidas mediante una demostración del producto
4. Retrospectiva del Sprint (Sprint Retrospective) [16]: Reunión
durante la cual el equipo analiza qué se hizo bien, qué procesos
serían mejorables y discute acerca de cómo perfeccionarlos.
El equipo de proyecto debe constar de al menos de tres personas, para
desempeñar como mínimo los tres roles que caracterizan SCRUM:
el SCRUM Master
el Producto Owner
el equipo de desarrollo.
En la siguiente tabla observamos un breve resumen de las tareas
principales de cada rol:
Tabla 2 Roles en SCRUM
SCRUM MASTER PRODUCT OWNER EQUIPO DE DESARROLLO
Lidera al equipo para que
cumpla las reglas y procesos
de SCRUM
Representa al cliente y se
asegura de que el equipo
trabaja en los temas
correctos, desde el punto
de vista del negocio
Tienen los conocimientos
técnicos necesarios para
llevar a cabo las historias a
las que se comprometen al
inicio de cada sprint
Elimina impedimentos,
asegurando el mejor
entorno para el desempeño
del equipo
Traslada la visión del
proyecto al equipo
Deciden cómo ordenar y
cómo asignar las tareas
Formaliza las
prestaciones en historias
a incorporar en el Product
Backlog y las reprioriza de
forma regular.
Cada uno debería
intercambiar tareas con
otro miembro del equipo
(no existen roles)
47
3.2.3 Otras metodologías ágiles
Aparte de la dos mencionadas, existen otras metodologías ágiles que
tiene como factor común el carácter iterativo y la entrega rápida al cliente de
versiones del producto para obtener una retroalimentación lo antes posible.
No entraremos en detalles de cada una, pero podemos mencionar las
siguientes:
RUP [17]
Kanban [18]
Lean-Agile [19]
3.3 Metodología elegida
A la hora de decantarnos por una u otra metodología hemos tenido en
cuenta la naturaleza de nuestro proyecto:
Tenemos una idea general del objetivo del proyecto, pero sin
detalles. Entendemos que el cliente irá concretando los requisitos
conforme vaya viendo las primeras versiones, ya que podrá
hacerse mejor una idea del potencial del software.
Dado el horizonte temporal del desarrollo del TFG, no queremos
invertir mucho tiempo en elaborar un plan detallado y
especificaciones a bajo nivel
Nos gustaría poder mantener contacto con el cliente durante el
proyecto, para asegurarnos de la satisfacción del mismo con el
producto final. Nos motiva establecer una comunicación frecuente
con el cliente, y aprender de sus ideas
El equipo de proyecto lo constituyen tres personas, los dos
tutores y el autor del TFG
Por disponibilidad del autor del TFG, preferimos establecer un
seguimiento periódico del proyecto, revisando las versiones
ejecutables disponibles en cada encuentro
Todas estas características quedarían cubiertas usando una
metodología Ágil, eliminando la restricción marcada por los métodos en
cascada de conocer de antemano todos los detalles del proyecto y disponer de
una documentación detallada previa al inicio del desarrollo del software. Esto
48
dilataría mucho el tiempo de entrega al cliente de las primeras versiones del
software.
Finalmente, entre XP y SCRUM nos decantamos por SCRUM,
principalmente porque el equipo de desarrollo lo forma únicamente el autor del
TFG, lo que violaría una de las reglas de XP (el pair programming, o
programación en parejas).
Una vez acordada la metodología, debemos tomar algunas decisiones
en cuanto a la configuración del equipo y a la planificación de los eventos que
marca SCRUM.
3.3.1 Los roles
Como indicábamos anteriormente, SCRUM marca claramente 3 roles,
que deben respetarse y que cumplen una misión muy concreta en esta
metodología.
Durante una reunión de coordinación previa del equipo de este TFG,
decidimos realizar la siguiente asignación de personas a roles, en función del
perfil de cada miembro:
Tabla 3 Asignación de roles en proyecto Trading
SCRUM MASTER PRODUCT OWNER EQUIPO DE DESARROLLO
José María Cecilia Horacio Pérez José Carlos Cano
Con este modo de organizarnos, Horacio Pérez (tutor del TFG) será el
punto de contacto con el cliente, la empresa Artificial Intelligence Talentum,
S.L, y por tanto será quien traduzca en historias de usuario los requerimientos
del negocio y validará las sucesivas entregas del producto.
José María Cecilia (tutor del TFG) será el facilitador del desarrollo del
proyecto, instruyendo al resto del equipo en la metodología SCRUM y
monitorizando el cumplimiento de los estándares. Ante cualquier impedimento
que pudiera surgir y que pudiera poner en riesgo el desarrollo normal del
proyecto, será el encargado de proveer soluciones.
José Carlos Cano (autor del TFG) será el único miembro de Equipo de
Desarrollo, que codificará y probará el software.
49
3.3.2 Los eventos
SCRUM nos marca algunos hitos esenciales durante el desarrollo del
proyecto, en concreto las reuniones de planificación y revisión del sprint.
Entendemos que estas reuniones serán presenciales por lo que buscamos una
frecuencia que sea sostenible en el tiempo, tanto por disponibilidad de los
tutores como del propio autor del TFG.
En esta línea, acordamos realizar sprints de 4 semanas de duración
(SCRUM recomienda una duración de entre 2-4 semanas) y cada reunión será
a la vez Sprint Planning y Sprint Review.
Los SCRUM Diarios y La Retrospectivas de cada sprint, con un marcado
carácter técnico, las realizará el autor del TFG, como miembro único del Equipo
de Desarrollo.
3.3.3 Seguimiento
Javier Garzás en su libro "Gestión de proyectos ágil”, [20] recomienda el
uso de tableros Kanban, como herramienta visual de seguimiento de las tareas
de cada sprint. Se pueden ver algunos ejemplos del uso de tableros en varias
instituciones que siguen metodología SCRUM para algunos proyectos visitando
la página web del autor [21].
Los tableros Kanban están enmarcados en una técnica del mismo
nombre que se creó en Toyota, y que se utiliza para controlar el avance del
trabajo, en el contexto de una línea de producción. Los componen tarjetas o
Post-It, que contienen una tarea con su descripción. Las tarjetas se colocan en
varias columnas, que componen el tablero, según se esté trabajando en ella,
esté pendiente o ya acabada.
Figura 10 Tablero Kanban
50
Estos tableros se pueden colocar en grandes paneles e incluso en
paredes, lo que las hace visibles a todo el equipo del proyecto, incluido al
cliente, ofreciendo de esta manera transparencia sobre lo que se está haciendo
y el ritmo al que se hace, lo que incrementa la confianza y la sensación de
equipo.
Pero también existen herramientas informáticas para el manejo de
tableros Kanban, especialmente útiles para:
Trabajo con equipos distribuidos, donde no es posible consultar
físicamente un tablero real
Conservar históricos
Realizar gráficos automatizados de evolución y carga de trabajo
En este proyecto utilizaremos una herramienta que nos facilitará la
creación y seguimientos de los tableros y nos creará en tiempo real los gráficos
Burn Down de cada sprint, que grafican el trabajo pendiente a lo largo del
tiempo y por tanto la velocidad a la que se están completando los
objetivos/requisitos. Permite extrapolar si el Equipo de Desarrollo podrá
completar el trabajo en el tiempo estimado.
Un ejemplo de este tipo de gráfico se puede observar en la imagen
adjunta
Figura 11 Burn Down Chart
Observamos en el gráfico que, dentro de un sprint, el Equipo de
Desarrollo controla su desempeño basándose en días de trabajo.
En nuestro proyecto, siguiendo las prácticas que se pueden encontrar en
la mayoría de los libros y artículos sobre SCRUM, estimaremos las tareas en
horas.
51
4 Tecnologías y herramientas utilizadas en el proyecto
4.1 Cygwin
En el apartado “4.3.4 Selección de la solución” de esta memoria
decidimos el desarrollo de una herramienta en C (Ansi C) con objeto de ser
explotada en entornos Linux.
Dado que el autor del TFG también trabaja en proyectos de desarrollo
para plataformas Microsoft Windows, y que las herramientas de documentación
utilizadas son de la familia Office, vamos a tomar como plataforma habitual la
de Microsoft, pero instalando los componentes necesario que nos permitan
portar el desarrollo a Linux.
En un intento de crear un entorno UNIX/POSIX completo sobre Windows
surgió en 1995 Cygwin [22], como un proyecto de Steve Chamberlain (un
ingeniero de Cygnus). En la actualidad, el paquete está mantenido
principalmente por trabajadores de Red Hat.
Al instalar un sistema Cygwin, se obtiene [23]:
Una biblioteca de enlace dinámico (cygwin1.dll) que implementa
la interfaz de programación de aplicaciones POSIX, usando para
ello llamadas a la API nativa de Windows.
Una cadena de desarrollo GNU (que incluye entre otras utilidades
GCC y GDB) para facilitar las tareas básicas de programación.
Aplicaciones equivalentes a los programas más comunes de los
sistemas UNIX. Incluso, cuenta con un sistema X (Cygwin/X)
desde 2001.
Existe otra alternativa similar a Cygwin, en concreto MinGW.
La diferencia está en que MinGW es una portabilidad a Windows de las
utilidades de compilación GNU, como son GCC, Make y Bash, pero sin
embargo no emula ni pretende aportar compatibilidad con sistemas UNIX. Es
decir, si compilamos algo usando MinGW lo estaremos haciendo para
Windows.
Sin embargo, cuando lo hacemos con Cygwin, lo haremos para el
entorno UNIX que proporcina Cygwin, y necesita la librería cygwin1.dll para
ejecutarse en Windows.
52
4.2 VMWare Player
VMWare player [24] es un sistema de virtualización por software que en
nuestro caso nos permitirá un ambiente de ejecución Linux corriendo en un
equipo con sistema operativo Windows, como si de otro hardware se tratara. Al
tratarse de una capa de software intermedia entre el hardware físico real y el
virtual, la velocidad de ejecución es evidentemente menor pero, para probar
nuestro desarrollo en un entorno Linux real, es suficiente.
Existen otras alternativas a VMWare Player, como puede ser Virtual PC.
La funcionalidad es similar pero varía en cómo se implementa. En el
caso de Virtual PC se está emulado una plataforma x86, mientras que VMWare
la virtualiza. La mayor parte de las instrucciones en VMware se ejecutan
directamente sobre el hardware físico, mientras que en el caso de Virtual PC se
traducen en llamadas al sistema operativo que se ejecuta en el sistema físico
[25].
4.3 Eclipse
Hemos seleccionado Eclipse [26] como IDE de desarrollo por ser una
herramienta muy extendida en el mundo de la programación, principalmente
para los lenguajes JAVA y C. Inicialmente creada por IBM, ahora es mantenida
y evolucionada por la Fundación Eclipse.
Ofrece gran cantidad de funcionalidades mediante la instalación de
módulos (extensión a múltiples lenguajes de programación, control de
versiones, sistemas de gestión de bases de datos, modelado de datos,
herramientas de red, etc) [27].
A favor de este IDE también ha jugado la fácil integración con el entorno
Cygwin, requerido para nuestro proyecto y con el control de versiones
Subversion por medio del módulo subversive [30].
4.4 Subversion
También reconocido por las siglas SVN [28] es una herramienta de
control de versiones Open Source basada en un repositorio cuyo
funcionamiento se asemeja enormemente al de un sistema de ficheros.
Utiliza el concepto de revisión para guardar los cambios producidos en el
repositorio. Entre dos revisiones sólo guarda el conjunto de modificaciones
(delta), optimizando así al máximo el uso de espacio en disco. SVN permite al
usuario crear, copiar y borrar carpetas con la misma flexibilidad con la que lo
haría si estuviese en su disco duro local.
53
Puede acceder al repositorio a través de redes, lo que le permite ser
usado por personas que se encuentran en distintas localizaciones [29].
La integración de Subversion (SVN) con Eclipse se realiza por medio del
plug-in desarrollado en el proyecto Subversive
GIT y CVS son alternativas a Subversion como herramienta de control
de versiones, aunque existen muchas más [31].
4.5 Python y Matplotlib
Python [32] es un lenguaje de programación interpretado y
multiplataforma. Es administrado por la Python Software Foundation y posee
una licencia de código abierto. Fue creado a finales de los ochenta por Guido
van Rossum. Se caracteriza principalmente por que hace hincapié en una
sintaxis que favorezca un código legible [33].
Matplotlib [34] es una biblioteca para la generación de gráficos a partir
de datos contenidos en listas o arrays, desarrollado en el lenguaje de
programación Python. Proporciona una API, pylab, diseñada para recordar a la
que ofrece MATLAB. Fue desarrollada por John D. Hunter en 2012. [35]
Hemos usado la combinación de Python y Matplotlib para generar los
gráficos de velas y de los indicadores técnicos en el desarrollo de nuestra
aplicación
4.6 Libconfig
Libconfig [36] es una librería simple para el procesado de ficheros de
configuración que contienen alguna estructura. El formato admitido es más
legible que un XML y, además, distingue entre tipos de datos, por lo que evita
que tengamos que realizar un análisis gramatical en nuestro código.
Ofrece interfaces tanto para C como para C++ y funciona en sistemas
UNIX compatibles con POSIX (GNU/Linux, Mac OS X, Solaris, FreeBSD) y
Windows (2000, XP, Windows 7, ….).
Observamos un ejemplo de la sintaxis en la siguiente imagen:
54
Figura 12 Fichero de ejemplo para uso con libconfig
4.7 TA-Lib
TA-Lib [37] es una librería que incluye el cálculo de 200 indicadores
(ADX, MACD, RSI, Stochastic, Bollinger Bands etc.) y que ofrece una API open
source para C/C++, Java, Perl, Python y .NET.
Constituye el núcleo encargado de los cálculos que se utilizan en
nuestra aplicación.
Una alternativa a TA-Lib es el paquete Quantmod [38] que se ofrece
para la librería R (un paquete estadístico y gráfico compatible con sistemas
UNIX, Windows y MAC OS [39]).
4.8 Kunagi
Como comentamos en el apartado “3.3.3 Seguimiento” vamos a
complementar la metodología SCRUM con los tableros propuestos por Kanban
y, para ello, nos decidimos por una herramienta accesible por Web, dado que
55
los miembros del Equipo, el Product Owner y el SCRUM Master no trabajan en
el mismo lugar. Queremos poder registrar el Product Backlog, los sucesivos
Sprint Backlogs y sus tareas asociadas.
Una búsqueda en Internet arroja bastantes resultados en lo referido a
herramienta Ágiles, incluso algunas realizan recopilaciones de las más usadas,
con comparativas en cuanto a funcionalidad y prestaciones (un ejemplo de ello
es http://agilescout.com/best-agile-scrum-tools [40]).
Revisando varias de estas recopilaciones y siempre buscando ediciones
freeware, seleccionamos, en base a las opiniones de usuarios, tres de ellas:
Sprintometer, Scrinch y Kunagi.
De entre ellas, la más intuitiva y con menos requerimientos de hardware
es Kunagi [41]. Contempla todos los aspectos de SCRUM y gráficamente es
sencilla, muy parecida a los tableros que recomienda Javier Garzás en su libro.
Es fácilmente desplegable (por medio de un archivo war) compatible con
Apache Tomcat [42] (un contenedor web de servlets open source que
implementa las especificaciones de los Java Servlets y de Java server Pages).
Apache Tomcat está desarrollado en Java, lo que facilita su portabilidad a
múltiples entornos. En nuestro caso lo hemos instalado en nuestro ordenador
de desarrollo en Microsoft Windows.
No requiere ninguna base de datos para almacenar información. Por el
contrario, usa ficheros XML que se almacenan en el directorio de la aplicación
del servidor donde se ejecuta Apache Tomcat.
57
5 Estimación de recursos y planificación
Como hemos indicado en el capítulo “5.3 Metodología elegida”, en este
proyecto no conocemos de antemano los detalles exactos del producto final,
por lo que hemos apostado por emplear la metodología SCRUM, que nos
permita tener el cliente vinculado al proyecto, entregándole regularmente
versiones del producto para que pueda ver a corto plazo el fruto de su inversión
y afine sus requerimientos, haciéndole partícipe del desarrollo y creando una
relación de confianza con el equipo.
Según Roman Pichler [2], una planificación conlleva una decisión
acerca de qué factores no deberían verse comprometidos de cara al
lanzamiento de un producto de éxito, lo cual nos lleva a hacernos una serie de
preguntas:
Tiempo: ¿es necesario respetar una fecha de lanzamiento o
finalización?
Coste: ¿hay un presupuesto fijo para el desarrollo del producto?
Funcionalidad: ¿deben desarrollarse todos los requerimientos que
figuran en la Pila de Producto?
Las tres restricciones no pueden satisfacerse de manera conjunta (al
menos una de ellas debe quedar libre como válvula de escape).
Fijar la funcionalidad no es una buena idea y, además, va en contra de
los principios de la metodología Ágil, donde esperamos evolucionar el producto
en base a las indicaciones del cliente.
Sin embargo, fijar la fecha de entrega de las diferentes versiones lleva a
una disciplina en el equipo de desarrollo, una mentalidad de producir resultados
periódicamente. Además, de esta manera, si el equipo de desarrollo es estable,
la elaboración del presupuesto es sencilla pues se reduce al cálculo: Nº de
desarrolladores x tiempo.
Flexibilizando el requisito de la funcionalidad permitimos que, en caso de
que el presupuesto se vea comprometido, el Propietario del Producto pueda
aceptar liberar un producto tras una reducción en las prestaciones.
5.1 Método de estimación utilizado
En SCRUM las tareas se estiman en Puntos Historia o Story Points (SP
a partir de ahora), que son una medida “relativa” del esfuerzo que es necesario
aplicar para desarrollar una Historia de Usuario. Cuando decimos “relativa”
58
estamos reflejando que una tarea etiquetada como 2SP conlleva el doble de
esfuerzo que otra etiquetada como 1SP.
Según Garzás [21], “un punto historia es una fusión entre la cantidad de
esfuerzo que supone desarrollar la historia de usuario, la complejidad de su
desarrollo y el riesgo inherente”. Al ser una medida relativa permite adaptarse
al equipo y nos deja libertad a la hora de asignar valores. Dado que debemos
usar rangos acotados, fijando un tope máximo, nos decantamos por la
siguiente serie: 1, 2, 3 ,5, 8, 13.
A la hora de calcular la duración del proyecto, sólo los Puntos Historia no
son suficientes, sino que necesitamos saber con qué rapidez el equipo es
capaz de desarrollar las Historias de Usuario. A este concepto se la denomina
Velocidad, que se calcula sumando el número de Puntos Historia de cada
Historia de Usuario “terminada” durante un Sprint. Dado que el Dueño del
Producto no consigue valor de las Historias de Usuario no acabadas, se
excluyen del cálculo todas aquéllas parcialmente desarrolladas.
Según Kenneth S. Rubin [3], “la velocidad mide el output (el tamaño de
lo que se entrega), no el outcome (el valor de lo que se entrega)”. Es decir,
completar una Historia de Usuario de 8SP no significa necesariamente que
aporte más valor al cliente que una de 5SP. Quizás interese trabajar más en la
de 5SP porque aporta más valor y es menos costosa.
La velocidad se suele mantener durante todo el proyecto, ya que es
inherente a la naturaleza de nuestro equipo y es conocida por proyectos
anteriores, o por sprints anteriores dentro del mismo proyecto. En nuestro caso,
esta información no está disponible y debemos realizar una estimación
adoptando alguna asunciones:
Nuestro equipo de desarrollo está compuesto por una persona
La jornada de trabajo dedicada al proyecto es 3 Horas/Día
El factor de disponibilidad será del 80% de esas 3 horas, donde el
20% restante lo dejamos como colchón para mejoras técnicas
que no aportan aparentemente valor al cliente, o bien para
imprevistos
Consideramos como punto de partida en nuestros cálculos que,
basándonos en nuestra experiencia, una Historia de Usuario de
1SP necesita una media de 3 horas para su desarrollo y prueba
59
Garzás [21] recomienda no considerar más de ese 80% de
disponibilidad.
Teniendo en cuenta que el Equipo de Desarrollo se compone de una
sola persona, con una dedicación de 3 horas al día durante 6 días a la semana,
durante 4 semanas, el número de horas de desarrollo es de 3 * 6 * 4 = 72 que,
aplicando un factor de disponibilidad del 80% nos deja el valor real de 58 horas
en cada iteración.
Por tanto la velocidad estimada será de 58 horas / 3 Horas por SP = 19
SP en cada Sprint.
5.2 Planificación
Sabemos que SCRUM trabaja en iteraciones o ciclos de, como máximo,
un mes de duración, llamados sprints, que presentan como características más
relevantes:
Tienen una fecha de inicio y de fin
Deben ser de corta duración (entre una semana y un mes)
Preferiblemente todos los Sprints deben tener la misma duración
El objetivo a cubrir durante cada ciclo no puede ser alterado y
debe ser completado al llegar el fin del Sprint
Según Kenneth S. Rubin [3], las ventajas de tener en mente una fecha
de fin son que:
Permite limitar el trabajo en curso (no terminado) porque el equipo
planificará sólo aquello que sabe que puede entregar en el Sprint
Fuerza la priorización y el llevar a cabo pequeños trabajos,
focalizándose en lo que aporta valor rápidamente al cliente
Muestra avances entregando nuevas versiones al fin de cada
ciclo
Evita perfeccionismos innecesarios, evitando perder tiempo
buscando algo “perfecto” cuando “suficientemente bueno” podría
valer
Motiva la conclusión de las tareas ya que los equipos tienen en
mente una fecha límite conocida
60
Mejora las predicciones sobre lo que se puede entregar porque es
razonable pensar que será parecido a lo entregado en el sprint
anterior
Por otro lado, una duración corta:
Facilita la planificación
Ofrece retroalimentación frecuente sobre el trabajo ya realizado y
en curso
Mejora el retorno de la inversión en el desarrollo al tener, al final
de cada sprint, una release
Limita la propagación de los posibles errores
Mantiene al equipo activo (en oposición a los proyecto de larga
duración, donde se pierde entusiasmo por el esfuerzo empleado)
Siguiendo esta indicaciones, nosotros nos decantamos por sprints de
cuatro semanas, que se alinean muy bien con la disponibilidad tanto del
Propietario del Producto, del SCRUM Master y del equipo de desarrollo.
En nuestra reunión inicial con el cliente queremos proponerle y acordar
una estimación de tiempos, en este caso, el número de sprints y, para ello,
basándonos en el documento de requerimientos proporcionados por la
empresa, se han podido identificar las siguientes Historias de Usuario:
STO001: Como cliente quiero poder leer un archivo con datos
históricos en formato csv para calcular sobre ellos indicadores
técnicos
STO002: Como cliente quiero que el software detecte el intervalo
de tiempos del archivo de datos para poder generar gráficos
intradía / interdía
STO003: Como cliente quiero que el software pueda manejar
grandes cantidades de datos para poder leer series históricas
STO004: Como cliente quiero poder leer uno o más archivos de
configuración para poder lanzar ejecuciones desatendidas
STO005: Como cliente quiero disponer de una lista de
indicadores técnicos disponibles, que sea ampliable para poder
utilizarla a la hora de declarar los escenarios
61
STO006: Como cliente quiero poder indicar rangos o listas de
parámetros de los indicadores para poder lanzar simulaciones
masivas
STO007: Como cliente quiero poder incluir constantes en los
ficheros de configuración de los escenarios para simplificar la
lectura de los mismos
STO008: Como cliente quiero poder escribir fórmulas o reglas en
formato matemático para que el software pueda interpretarlas
para dar versatilidad
STO009: Como cliente quiero poder indicar las fórmulas de
decisión en los archivos de configuración para poder generar
diferentes escenarios
STO010: Como cliente quiero poder generar un gráfico con
información diaria a partir de un archivo CSV (desde script) para
disponer de una herramienta visual de análisis
STO011: Como cliente quiero que los gráficos se puedan generar
dinámicamente en función a parámetros (estudiar solución
técnica) para decidir si se usan ficheros de configuración de
gráficos
STO012: Como cliente quiero que cada gráfico que se genere
lleve asociado un fichero csv con la información representada
para poder ser tratada con otras herramientas analíticas
STO013: Como cliente quiero que los gráficos puedan contener
varias ventanas, y se puedan asociar variables a cada ventana,
con tipos y colores parametrizables y que se pueda definir el
tamaño de la imagen resultante para ofrecer de esta manera
mayor versatilidad
STO014: Como cliente quiero indicar al software que me genere
gráficos siempre, nunca o en los n casos más favorables para no
sobrecargar en el caso de ejecución de escenarios masivos
STO015: Como cliente quiero poder mostrar en el gráfico las
operaciones de entrada/salida del mercado para permitir un
análisis visual
STO016: Como cliente quiero guardar en una matriz el resultado
de la ejecución de todos los escenarios para poder realizar
estudios posteriores
62
STO017: Como cliente quiero que el software ordene los
escenarios según uno o más ratios calculados tras su ejecución
para conocer las reglas de mercado más ventajosas
STO018: Como cliente quiero que, además de decidir entradas /
salidas del mercado en base a unas fórmulas, también contemple
Stop Loss y Take Profit para asimilarlo a las operaciones reales
del mercado
STO019: Como cliente quiero disponer de un LOG en un archivo
de texto indicando tiempos de ejecución para conocer el
rendimiento de la librería de indicadores técnicos usada y del
software en general
Ahora bien, ¿cómo calculamos el tamaño de cada historia en esta fase
inicial para poder presentar a la empresa un plan de proyecto? En realidad sólo
podemos hacerlo basarnos en estimaciones, seleccionando de la lista de
Historias de Usuario aquéllas con las que nos sintamos más confiados a la
hora de valorar su duración en Puntos de Historia y, haciendo uso de la
naturaleza relativa de este indicador, ponderando a continuación el resto.
Así, basándonos en nuestra experiencia como desarrolladores, sabemos
que STO001 (lectura de un fichero con cierto formato) no es una tarea
compleja y podríamos asignarle una duración de 1SP. Asimismo la ST008, que
supone el desarrollo de un analizador sintáctico (o parser), sin duda es una
tarea más compleja que la anterior, tanto en el desarrollo como en la fase de
pruebas, y creemos que debemos asignarle una duración de 5SP.
Mostramos a continuación una tabla donde hemos reflejado todas las
Historias de Usuario identificadas hasta la fecha y una estimación de
duración/complejidad en Puntos Historia tomando como referencia las
anteriores.
La columna nombrada como “Justificación” explica el razonamiento
seguido para asignar los Puntos de Historia a cada caso:
63
Tabla 4 Historias de usuario identificadas al inicio del proyecto
Historias de
Usuario
(STO)
Puntos de
Historia
(SP)
Justificación
STO001Como cliente quiero poder leer un archivo con datos históricos en
formato csv para calcular sobre ellos indicadores técnicos1 Tomada como base para el resto de estimaciones
STO002Como cliente quiero que el software detecte el intervalo de tiempos
del archivo de datos para poder generar gráficos intradía/interdía1
Serán cá lculos sobre el campo de fecha extra ído del
archivo de entrada
STO003Como cliente quiero que el software pueda manejar grandes
cantidades de datos para poder leer series históricas8
Esta tarea supone el diseño de la arquitectura y
gestión de la memoria que a lmacenará los datos
STO004Como cliente quiero poder leer uno o más archivos de configuración
para poder lanzar ejecuciones desatendidas13
En esta fase inicia l debemos decidi r s i desarrol lar
código para leer archivos con s intaxis a defini r o
buscar soluciones en el mercado
STO005Como cliente quiero disponer de una lista de indicadores técnicos
disponibles, que sea ampliable para poder utilizarla al declarar los 1 Usaremos un nuevo fichero de configuración
STO006Como cliente quiero poder indicar rangos o listas de parámetros de
los indicadores para poder lanzar simulaciones masivas5
El uso de rango y/o bucles aparentemente nos va a
l levar a elaborar a lgún proceso de l lamada recurs iva
STO007Como cliente quiero poder incluir constantes en los ficheros de
configuración de los escenarios para simplificar la lectura de los 1 Duración parecida a la STO005
STO008Como cliente quiero poder escribir fórmulas o reglas en formato
matemático y que el software pueda interpretarlas para dar
versatilidad
5Tomada como base para el resto de estimaciones .
Compleja .
STO009Como cliente quiero poder indicar las fórmulas de decisión en los
archivos de configuración para poder generar diferentes escenarios1 Duración estimada parecida a la STO005
STO010Como cliente quiero poder generar un gráfico con información diaria a
partir de un archivo csv (desde script)8
En esta fase inicia l sabemos la herramienta que
uti l i zaremos pero no tenemos el conocimiento sobre
su uso y debemos tener en cuenta el trabajo de
investigación
STO011Como cliente quiero que los gráficos se puedan generar
dinámicamente en función a parámetros (estudiar solución técnica)
para decidir si se usan ficheros de configuración de gráficos13
Supone la lectura del archivo de configuración, su
interpretación y la generación de sentencias que
generen el gráfico
STO012Como cliente quiero que cada gráfico que se genere lleve asociado un
fichero csv con la información representada para tratamientos en
otras herramientas
1 Simi lar en duración a la STO001
STO013
Como cliente quiero que los gráficos puedan contener varias ventanas,
y se puedan asociar variables a cada ventana, con tipos y colores
parametrizables y que se pueda definir el tamaño en pixels para
ofrecer mayor versatilidad
8 Simi lar en duración a la STO011
STO014Como cliente quiero indicar al software que me genere gráficos
siempre, nunca o en los n casos más favorables para no sobrecargar en
el caso de escenarios masivos5
Habrá que generar un módulo específico para gráficos .
La complejidad vendrá dada por la neces idad de
a lmacenar todos los parámetros usados en cada
escenario para reuti l i zarlos a la hora de graficar los
mejores
STO015Como cliente quiero poder mostrar en el gráfico las operaciones de
entrada/salida del mercado para permitir un análisis visual3 Simi lar a la STO013
STO016Como cliente quiero guardar en una matriz el resultado de la ejecución
de todos los escenarios para poder realizar estudios posteriores5
Almacenar los va lores no es en s í complejo pero s í el
trabajo posterior sobre el los
STO017Como cliente quiero que el software ordene los escenarios según uno
o más ratios calculados tras la ejecución para conocer las reglas más
ventajosas
5 Trabajo sobre cá lculos de ratios
STO018Como cliente quiero que, además de decidir entradas / salidas del
mercado en base a unas fórmulas, también contemple StopLoss y
TakeProfit para asimilarlo a las operaciones reales13
A tener en cuenta junto a las reglas de entrada / sa l ida
del mercado que se guiarán en base a las fórmulas
a lmacenadas en los archivos de los scripts
STO019Como cliente quiero disponer de un LOG de ejecución indicando
tiempos para conocer el rendimiento de la librería de indicadores
técnicos usada5
Desde cualquier punto del programa puede ser
necesario enviar mensajes a l fichero LOG
(especia lmente en caso de errores)
La suma de todos los SP arroja un total de 102 Puntos de Historia para
el desarrollo completo del proyecto que, convertido a horas por el factor
convenido en el apartado 7.1 de 1SP = 3 horas, nos da un valor de 306 horas
de trabajo del equipo de desarrollo.
Por tanto, ya estamos en disposición de estimar la duración del proyecto
en número de Sprints pues conocemos los Puntos de Historia totales y la
velocidad del equipo calculada al final del apartado 5.1:
64
102 SP / 19SP por Sprint = 5,4 ciclos, por lo que decidimos informar al
cliente de que vamos a trabajar durante 6 Sprints, con un margen de error
equivalente a 0,6 ciclos para imprevistos o nuevas Historias de Usuario que
pudieran ir surgiendo a lo largo del proyecto en la reuniones de revisión y
planificación de los sprints.
En la naturaleza de SCRUM está el hecho de revisar, al final de cada
Sprint, las desviaciones de la velocidad estimada frente a la real. Para ello
utilizaremos el gráfico del Sprint Burndown, que nos mostrará las tareas
estimadas durante el sprint y las desviaciones. La velocidad real en cada Sprint
se tomará como nueva velocidad del equipo para los siguientes Sprints y será
un factor decisivo a la hora de seleccionar Historias de Usuario para cada
nuevo Sprint cuando confeccionemos el Sprint Backlog.
5.3 Valoración de la dedicación y coste económico
En nuestro cálculos del coste económico del proyecto vamos a
considerar dos grupos:
Costes de material, donde reflejaremos el coste del material
empleado durante la realización del proyecto
Costes de consultoría, donde reflejaremos el coste de personal
basado en horas de trabajo
5.3.1 Costes de material
Incluiremos todos los costes de hardware y software empleados, que
son independientes de la duración del proyecto. Estos costes no se aplicarán al
cliente dado que esta misma infraestructura es utilizada para proyectos con
otros clientes.
La siguiente tabla identifica los distintos elementos considerados:
65
Tabla 5 Costes de material no facturables
Hardware Euros
Ordenador portátil Lenovo T420 800
Monitor Lenovo 24'' 350
Impresora HP Deskjet H450 60
HDD externo para copias de seguridad 60
Periféricos 50
1.320
Software Euros
Licencia Windows 7 Professional SP1 149
Licencia Microsoft Office 2010 Profesional (MS Word y MSExcel) 393
Virtual Machines Player (VMWare) 0
Linux (Ubuntu) 0
Entorno de desarrollo (Eclipse) 0
Entorno Linux para Windows (CygWin) 0
542
5.3.2 Costes de consultoría
Como indicamos en el capítulo 5 (metodología), en SCRUM
identificamos 3 roles: el SCRUM Mater, El Propietario del Producto y el Equipo
de Desarrollo.
Los roles de SCRUM Master y Propietario del Producto no implican una
dedicación completa al proyecto sino que requiere su intervención durante
momentos clave bien definidos dentro del proceso de SCRUM. Sin embargo, el
coste de los miembros del Equipo de Desarrollo asignados a este proyecto se
aplicará íntegramente al mismo.
De cara a negociar con un cliente el coste de un proyecto desarrollado
siguiendo la metodología SCRUM podemos ofrecer facturar cada Sprint
basándonos en los Puntos de Historia completados y aceptados. De esta
manera estamos creando una relación con el cliente en la que se asegura de
pagar únicamente por las funcionalidades que recibe y que previamente se han
solicitado y acordado al principio de cada sprint.
Usaremos el factor de conversión “1 Punto de Historia” = “3 Horas de
desarrollo”, sobre un coste de horas de consultoría de 30 Euros/Hora.
Según este criterio, y basándonos en la estimación inicial de 102 Puntos
de Historia, podremos informar al cliente de un coste del proyecto aproximado
de 7.500 Euros.
66
Tabla 6 Estimación de costes iniciales facturables al cliente
Puntos de
Historia
Horas de
desarrollo Euros
Sprint 1 19 57 1.710
Sprint 2 19 57 1.710
Sprint 3 19 57 1.710
Sprint 4 19 57 1.710
Sprint 5 19 57 1.710
Sprint 6 7 21 630
102 306 7.470
Consultoría
Como hemos comentado, la facturación real de cada Sprint se adaptará
a lo realmente entregado, e incluirá los impuestos aplicables en cada momento.
Si se decidiera un incremento en la funcionalidad que conllevara nuevos
Sprints o nuevos Puntos de Historia, se seguiría el mismo criterio a la hora de
facturarlo (así quedará reflejado en el contrato entre ambas partes).
67
6 Desarrollo del proyecto
6.1 Preparativos
Existe una gran controversia sobre cómo incluir en la metodología
SCRUM las tareas técnicas y no técnicas previas al inicio del desarrollo y, por
tanto, a la entrega de alguna funcionalidad al cliente.
Podríamos incluir en este grupo las siguientes:
preparar los entornos de desarrollo.
trabajar en el Product Backlog, principalmente en dejar listas las
historias de usuario, priorizadas y estimadas.
Hacer una previsión del reparto de historias de usuario por
iteración.
Hacer un estudio de la arquitectura.
Alcanzar un acuerdo sobre la definición de “Done”, es decir, de
cuándo una Historia de Usuario está acabada y aceptada
Existen tres corrientes que ofrecen diferentes soluciones:
1. Una corriente aboga por la existencia de un sprint 0, a pesar de
que no desarrolle ninguna Historia de Usuario, pero respetando la
naturaleza de SCRUM (asignándole una duración fija, realizando
SCRUM diarios y la Revisión del Sprint).
2. Otra corriente, contraria a la anterior, opina que un sprint de este
tipo presenta los siguientes inconvenientes:
No genera código funcional
Elimina el sentido de urgencia
Conduce a malentendidos sobre cómo funciona SCRUM
Disgusta al cliente
y aboga por evitar denominar como sprint a esta fase porque
considera que, si lo llamáramos así, estaríamos ejecutando SCRUM,
pero eso sería incompatible con los citados cuatro inconvenientes.
3. La tercera vía es incluirlas como tareas técnicas en el sprint 1,
junto a otras que sí aporten valor al cliente. De esta manera, en la
revisión del sprint, el Product Owner puede obtener una primera
68
versión entregable del software, aunque con funcionalidades
reducidas.
En este proyecto preferimos ceñirnos completamente a la metodología
SCRUM y, de acuerdo con el cliente, no comenzar el proyecto en su fase de
desarrollo hasta no estar en disposición de generar valor.
Por tanto, durante las primeras semanas, mantuvimos dos reuniones
para conocer los requerimientos del cliente, traducirlos a Historias de Usuario,
decidir la arquitectura e instalar los entornos de desarrollo y pruebas
necesarios.
Tabla 7 Fase inicial: Objetivos del cliente
OG1 Objetivo General 1: Desarrollo de una aplicación eficiente
OE1Objetivos Específico 1: Desarrollo de un programa scriptable, mediante archivos de configuración,
para el funcionamiento en supercomputadoras
OE2 Objetivos Específico 2: Lenguaje de programación eficiente en términos de velocidad y memoria
OG2 Objetivo General 2: Desarrollo de una herramienta de análisis visual de operaciones en los mercados
OE3 Objetivos Específico 3: Lectura de datos históricos
OE4 Objetivos Específico 4: Representación gráfica de datos históricos e indicadores técnicos
OG3 Objetivo General 3: Desarrollo de una herramienta de backtesting
OE5 Objetivo Específico 5: Cálculo de indicadores técnicos sobre un conjunto de datos históricos
OE6Objetivo Específico 6: Decisión acerca del momento de realizar una operación en el mercado y de
finalizar la misma
OE7Objetivo Específico 7: Calcular el beneficio neto del conjunto de operaciones que se produzcan en
el periodo de tiempo que se ha extraído de los históricos
OE8 Objetivo Específico 8: Elaborar un informe con datos estadísticos sobre las operaciones realizadas
Tabla 8 Fase inicial. Traducción a Historias de Usuario
Historias de Usuario
(STO)
Puntos de
Historia (SP)
STO001 Como cliente quiero poder leer un archivo con datos históricos en formato CSV para calcular sobre ellos indicadores técnicos
1
STO002 Como cliente quiero que el software detecte el intervalo de tiempos del archivo de datos para poder generar gráficos intradía/interdía
1
STO003 Como cliente quiero que el software pueda manejar grandes cantidades de datos para poder leer series históricas
8
STO004 Como cliente quiero poder leer uno o más archivos de configuración para poder lanzar ejecuciones desatendidas
13
69
STO005 Como cliente quiero disponer de una lista de indicadores técnicos disponibles, que sea ampliable para poder utilizarla al declarar los escenarios
1
STO006 Como cliente quiero poder indicar rangos o listas de parámetros de los indicadores para poder lanzar simulaciones masivas
5
STO007 Como cliente quiero poder incluir constantes en los ficheros de configuración de los escenarios para simplificar la lectura de los mismos
1
STO008 Como cliente quiero poder escribir fórmulas o reglas en formato matemático y que el software pueda interpretarlas para dar versatilidad
5
STO009 Como cliente quiero poder indicar las fórmulas de decisión en los archivos de configuración para poder generar diferentes escenarios
1
STO010 Como cliente quiero poder generar un gráfico con información diaria a partir de un archivo CSV (desde script)
8
STO011 Como cliente quiero que los gráficos se puedan generar dinámicamente en función a parámetros (estudiar solución técnica) para decidir si se usan ficheros de configuración de gráficos
13
STO012 Como cliente quiero que cada gráfico que se genere lleve asociado un fichero CSV con la información representada para tratamientos en otras herramientas
1
STO013 Como cliente quiero que los gráficos puedan contener varias ventanas, y se puedan asociar variables a cada ventana, con tipos y colores parametrizables y que se pueda definir el tamaño en pixels para ofrecer mayor versatilidad
8
STO014 Como cliente quiero indicar al software que me genere gráficos siempre, nunca o en los n casos más favorables para no sobrecargar en el caso de escenarios masivos
5
STO015 Como cliente quiero poder mostrar en el gráfico las operaciones de entrada/salida del mercado para permitir un análisis visual
3
STO016 Como cliente quiero guardar en una matriz el resultado de la ejecución de todos los escenarios para poder realizar estudios posteriores
5
STO017 Como cliente quiero que el software ordene los escenarios según uno o más ratios calculados tras la ejecución para conocer las reglas más ventajosas
5
STO018 Como cliente quiero que, además de decidir entradas / salidas del mercado en base a unas fórmulas, también contemple StopLoss y TakeProfit para asimilarlo a las operaciones reales
13
STO019 Como cliente quiero disponer de un LOG de ejecución indicando tiempos para conocer el rendimiento de la librería de indicadores técnicos usada
5
Por último, y no menos importante, también acordamos entre el Product
Owner y el el Equipo de Desarrollo que, en cada Historia de Usuario,
incluiremos un campo que especifique la definición de “Terminado” en modo de
criterios de aceptación, porque nos resulta difícil encontrar una definición
aplicable a todas en conjunto.
70
En este punto ya teníamos toda la información necesaria para plantear
al cliente los costes estimados del proyecto, el número de sprints y, por tanto,
una primera estimación de duración del proyecto. Los costes de esta fase de
análisis no se trasladaron al cliente.
También inicializamos en Kunagi el proyecto Trading, creando los
usuarios y asignando los roles a cada miembro del equipo:
Asimismo, dimos de alta las Historias de Usuario con su estimación en
Puntos de Historia y la velocidad estimada del Equipo de Desarrollo (Kunagi
realiza con toda esa información una estimación de fechas de entrega):
Figura 13 Trading en Kunagi: Roles
71
Figura 14 Trading en Kunagi: Historias de Usuario
Ya estábamos preparados para el Sprint 1.
6.2 Sprint 1
6.2.1 Sprint Planning
En la reunión de planificación de este primer sprint, el Product Owner ha
seleccionado dos Historias de Usuario estimadas en un total de 14 Puntos de
Historia.
72
STO001: Como cliente quiero poder leer un archivo con datos
históricos en formato csv para calcular sobre ellos indicadores
técnicos
STO004: Como cliente quiero poder leer uno o más archivos de
configuración para poder lanzar ejecuciones desatendidas
Una aclaración: la velocidad del equipo calculada en el aparatado “5.1
Método de estimación utilizado” era de 19 SP, que supera en 5 SP a la suma
de la duración estimada de las dos historias seleccionadas. Podríamos haber
incluido otra Historia de Usuario más pero, para el cliente, la siguiente en
prioridad tiene una duración de 8 SP, lo cual superaría la capacidad de trabajo
del equipo. Una opción podría haber sido fragmentar la tercera historia en dos
partes, una de las cuales hubiera entrado en este sprint. Pero en este primer
ciclo optamos por ser conservadores y no incluir nada. En el Sprint Review
podremos ajustar este dato.
Figura 15 Sprint 1 Backlog
73
Falta completar en cada Historia de Usuario el valor que aporta al
negocio (según indique el Product Owner) y los criterios de aceptación para
tener toda la información que SCRUM recomienda en su estándar.
ID
STO001DESCRIPCIONComo cliente quiero poder leer un archivo con datos históricos en formato csv para calcular sobre ellos indicadores técnicosVALOR2ESTIMACION1 SPACEPTACIONEl nombre del fichero podrá ser un parámetroSe debe controlar la existencia del ficheroControlar que los datos del fichero tienen el formato esperado
ID
STO004DESCRIPCIONComo cliente quiero poder leer uno o más archivos de configuración para poder lanzar ejecuciones
desatendidasVALOR10ESTIMACION13 SPACEPTACIONAdmitir campos individuales y listas como elementos en los archivosVerificar existencia de archivos de configuraciónAlmacenar en variables locales
Figura 16 Sprint 1 Historias de Usuario
Ahora el equipo detallará las tareas y, en base a ello, confirmará la
duración de estas Historias de Usuario.
A continuación se muestra una tabla con la lista de tareas identificadas
para el Sprint 1:
Tabla 9 Sprint 1 Tareas
Historia de
Usuario
Tarea Descripción Horas
STO001 TSK001 Crear función en C para control de existencia de fichero en
disco
1
STO001 TSK002 Crear bucle de lectura controlando número de columnas y tipo,
almacenando array en memoria
1
STO001 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 1
STO004 TSK001 Crear una función que interprete un fichero de texto que
contenga nombre de parámetros y valores (individuales o listas)
24
STO004 TSK002 Crear funciones que recuperen parámetros concretos y los
almacene en variables en memoria
9
STO004 TSK003 Realizar control de errores: valor incorrecto en parámetros o no
existencia
3
STO004 TSK004 Realizas las pruebas de acuerdo a los criterios de aceptación 3
74
Una vez incorporadas las tareas en Kunagi, nuestro tablero Kanban
muestra el siguiente aspecto:
Figura 17 Sprint 1 Tablero al inicio del Sprint
6.2.2 Sprint Review
Este ha sido el primer Sprint de nuestro proyecto. Las tareas asociadas
a las Historias de Usuario fueron estimadas por el Equipo de Desarrollo en 42
horas (3 para la primera y 39 para la segunda).
Como podemos comprobar en el gráfico Burndown que mostramos a
continuación, la primera parte del Sprint fuimos con retraso debido a los
siguientes motivos:
1. Configuraciones iniciales
2. Cambio de estrategia en la segunda Historia de Usuario
75
Durante la realización de la primera Historia de Usuario realizamos
también tareas de preparación del proyecto en Eclipse (enlazado con Cygwin) y
el diseño de la arquitectura del software. Por ello no fue hasta el tercer día en
que comenzamos con su primera tarea. Una vez iniciada, esta Historia de
Usuario se desarrolló y probó en el plazo previsto.
Durante la segunda Historia de Usuario, que sabíamos compleja,
tuvimos que abordar un cambio de estrategia, que dilató la primera tarea en la
que el objetivo era el desarrollo de una función para interpretar ficheros de
texto donde almacenar los parámetros de la aplicación. Una vez iniciado el
desarrollo, vimos cómo la complejidad aumentaba ya que había que controlar
que la sintaxis de la información contenida en el fichero fuera correcta, e
implementar funciones que accedieran a contenidos concretos (un parámetro u
otro).
Pensamos que quizás habría software ya creado y decidimos detener el
desarrollo que habíamos iniciado e emprender una búsqueda. Con cierta
rapidez encontramos la librería libconfig que parecía responder a nuestros
requerimientos. Para asegurarnos, dedicamos tiempo a las tareas de
instalación y enlazado en nuestro proyecto, y unas primeras pruebas para
comprobar que funcionaba correctamente, antes de continuar el desarrollo en
torno a ella.
El tiempo invertido es investigar esta librería trajo sus frutos a partir de la
mitad del sprint, donde pudimos recuperar rápidamente el atraso de los
primeros días, confirmando lo acertado de nuestra apuesta por este producto.
Figura 18 Sprint 1 Burndown Chart
76
Como ejemplo del seguimiento en el tablero, adjuntamos situación que
nos muestra Kunagi justo antes de realizar las últimas pruebas del sprint (tarea
que podemos ver en la columna central):
Figura 19 Sprint 1 Tablero a falta de las pruebas de la Historia STO004
En cuanto al desarrollo general del proyecto, el Release Burndown Chart
nos muestra la entrega de 4 SP menos de lo esperado en función de nuestra
velocidad teórica debido a que inicialmente seleccionamos menos Historias de
Usuario.
6.2.3 Sprint Retrospective
Cabe en este punto hacernos las siguientes preguntas:
Si hiciéramos el sprint otra vez, ¿haríamos las cosas igual? ¿o haríamos
algunas cosas de forma diferente y cómo?
Figura 20 Sprint 1 Release Burndown Chart
77
De lo ocurrido en este sprint con el cambio de estrategia respecto a la
lectura de archivos de configuración, hemos aprendido que al valorar el
esfuerzo de una Historia de Usuario, debemos incluir un factor de incertidumbre
para aquéllos casos en los que no tengamos claro qué tecnología usar.
A pesar de ello, el equipo ha trabajado a la velocidad estimada al
principio del proyecto porque, al haber seleccionado menos Puntos de Historia,
este sprint ha sido llevado con soltura, especialmente en el último tercio del
mismo. Por este motivo mantenemos la velocidad del Equipo en 19 SP por
Sprint y nos hace sentirnos confiados para las siguientes iteraciones.
6.2.4 Demos
6.2.4.1 Lectura de fichero csv
Partimos de un fichero de datos históricos proporcionados por el cliente.
Figura 21 Sprint 1 Demo: fichero CSV de entrada
El programa muestra en consola el resultado de la lectura, indicando el
número de líneas leídas y los datos de las tres últimas lecturas.
Figura 22 Sprint 1 Demo: lectura de fichero csv
78
6.2.4.2 Lectura de fichero de configuración
Partimos de un fichero de configuración con sintaxis admitida por la
librería libconfig.
Figura 23 Sprint 1 Demo: fichero de configuración ejemplo
El software muestra los valores extraídos del fichero e incorporados en
memoria
Figura 24 Sprint 1 Demo: lectura fichero de configuración
6.2.4.3 Control de errores
A continuación se muestra el control de errores en la lectura del archivo
de datos históricos:
Figura 25 Sprint 1 Demo: error en lectura del fichero csv
79
6.3 Sprint 2
6.3.1 Sprint Planning
En la reunión de planificación de este primer sprint, el Product Owner ha
priorizado cinco Historias de Usuario estimadas en un total de 19 Puntos de
Historia.
STO010: Como cliente quiero poder generar un gráfico con
información diaria, inicialmente desde script, para disponer de una
herramienta visual de análisis
STO003: Como cliente quiero que el software pueda manejar
grandes cantidades de datos para poder leer series históricas
STO002: Como cliente quiero que el software detecte el intervalo
de tiempos del archivo de datos para poder generar gráficos
intradía/interdía
Figura 26 Sprint 2 Backlog
80
STO012: Como cliente quiero que cada gráfico que se genere
lleve asociado un fichero csv con la información representada
para tratamientos en otras herramientas analíticas
STO005: Como cliente quiero disponer de una lista de
indicadores a poder utilizar, que sea editable para poder utilizarla
al declarar los escenarios
Hemos acordado con el Product Owner seleccionar Historias cuya
duración completen la velocidad del equipo, estimada en 19 SP. Recordemos
que en Sprint 1 realizamos 14 SP pero que, conforme se desarrollaron las
tareas, somos optimistas en alcanzar las 19 SP.
Analizamos en detalle cada Historia de Usuario junto al Product Owner):
ID
STO010DESCRIPCIONComo cliente quiero poder generar un gráfico con información diaria (desde script),para disponer de una herramienta visual de análisisVALOR5ESTIMACION8 SPACEPTACIONSe debe controlar la existencia del ficheroQueremos guardar el gráfico como una imagen png en disco
ID
STO003DESCRIPCIONComo cliente quiero que el software pueda manejar grandes cantidades de datos, para poder leer series
históricasVALOR10ESTIMACION8 SPACEPTACIONManejar dinámicamente la memoriaControlar en todo momento errores de asignaciónReutilizar espacio de memoria ya reservado en ejecuciones anteriores
ID
STO002DESCRIPCIONComo cliente quiero que el software detecte el intervalo de tiempos del archivo de datos para poder generar gráficos intradía/interdíaVALOR1ESTIMACION1 SPACEPTACIONPoder distinguir entre minutos, horas y díasControlar que los datos fecha/hora son correctos antes de realizar los cálculos
ID
STO012DESCRIPCIONComo cliente quiero que cada gráfico que se genere lleve asociado un fichero csv con la información representada para tratamientos en otras herramientasVALOR3ESTIMACION1 SPACEPTACIONImplementar control de errores al escribir en discoIncluir en el fichero datos históricos y dejar preparado para incluir resultados del cálculo de indicadores
81
ID
STO005DESCRIPCIONComo cliente quiero disponer de una lista de indicadores a poder utilizar, que sea editable para poder utilizarla al declarar los escenariosVALOR1ESTIMACION1 SPACEPTACIONLeer un archivo de configuración de texto donde poder incluir los indicadores aceptados y sus parámetrosAlmacenar en memoria dinámicamente
Figura 27 Sprint 2 Historias de Usuario
Ahora el equipo detallará las tareas y, en base a ello, confirmará la
duración de estas Historias de Usuario.
A continuación se muestra la tabla que elaboramos con la lista de tareas
identificadas para el Sprint 2:
Tabla 10 Sprint 2 Tareas
Historia de
Usuario
Tarea Descripción Horas
STO010 TSK001 Análisis de alternativas que ofrece matplotlib para graficar
información financiera
18
STO010 TSK002 Crear función que compruebe existencia del script en el
directorio de la aplicación y lo ejecute
3
STO010 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO003 TSK001 Diseñar y crear structs y arrays para toda la información a
manejar: indicadores técnicos, datos históricos parámetros
6
STO003 TSK002 Crear un módulo específico para manejo de memoria con
malloc, realloc y free (datos de texto y numéricos float e int)
12
STO003 TSK003 Implementar un control de errores de manejo de memoria 3
STO003 TSK004 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO002 TSK001 Desarrollar una función que valide que la información histórica
leída contiene el detalle necesario para permitir el cálculo
1
82
STO002 TSK002 Desarrollar función que calcule el salto temporal entre los dos
últimos datos consecutivos
1
STO002 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 1
STO012 TSK001 Crear función que recorra la estructura de datos históricos y
genere información en fichero en formato tabular
1
STO012 TSK002 Controlar mensajes de error de acceso a ficheros del sistema
operativo
1
STO012 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 1
STO005 TSK001 Ampliar la rutina de lectura de archivos de configuración y
estructuras en memoria
2
STO005 TSK002 Realizas las pruebas de acuerdo a los criterios de aceptación 1
A continuación activamos en Kunagi el sprint 2 y asignamos las Historia
de Usuario y sus tareas asociadas. Podemos ver a continuación el tablero
completo en el momento del inicio, justo antes de que el equipo comience a
trabajar con él.
83
Figura 28 Sprint 2 Tablero al inicio del Sprint
6.3.2 Sprint Review
En la fase inicial de este sprint nos vimos penalizados por las tareas de
investigación de las dos grandes Historias de Usuario seleccionadas: la
creación de gráficos usando matplotlib y el diseño de nuestra aplicación en lo
que se refiere al uso de memoria dinámica.
Fueron muchas las horas de trabajo dedicadas a la investigación de esta
librería y a su enlace con nuestra aplicación en C. Pronto pudimos ver que es
una magnífica utilidad y que proporciona gráficos de gran calidad estética y una
84
fantástica interface para los programadores. En este sprint trabajamos
básicamente con ficheros script propietarios de matplotlib, pero pudimos
vislumbrar que podríamos generar los gráficos dinámicamente con un poco
más de investigación.
En cuanto al manejo de memoria, nuestra decisión fue implementar
estructuras que contendrían la información recogida de los archivos de
configuraciones pero, además, un sistema de arrays de punteros a estructuras
en memoria para contener el grueso de la información, es decir, los datos
históricos sobre los que realizaremos el backtesting y los indicadores
calculados por la librería TA-Lib. En el apartado “10, Anexo I Diseño de la
aplicación” se explica en detalle la solución técnica aplicada.
Una vez concluida esta fase de diseño, la implementación fue rápida y
pudimos recuperar, e incluso adelantarnos, al calendario previsto.
El resto de Historias de Usuario no presentaron dificultades y se
mantuvo el buen ritmo.
La sensación que tenemos en el Equipo de Desarrollo es que podríamos
admitir cargas de más de 19SP
Adjuntamos a continuación el tablero justo al terminar la primera Historia
de Usuario del sprint, mostrando la primera tarea de la segunda Historia
seleccionada.
Figura 29 Sprint 2 Burndown Chart
85
Figura 30 Sprint 2 Tablero al finalizar la Historia de Usuario STO010
En cuanto al desarrollo general del proyecto, el Release Burndown Chart
nos muestra la entrega de 4 SP menos de lo esperado, en función de nuestra
velocidad teórica, debido al retraso acumulado desde el primer Sprint.
6.3.3 Sprint Retrospective
Al igual que en el sprint 1, las tareas de investigación en el uso de
nuevos productos pueden conducir a retrasos en las etapas iniciales. Sin
embargo hemos observado que en tareas de desarrollo nuestra velocidad está
por encima de los estimado.
Figura 31 Sprint 2 Release Burndown Chart
86
En el Sprint 3 intentaremos incluir alguna Historia que nos haga superar
nuestros 19SP. Creemos poder manejarla y, así, podríamos recuperar el
retraso inicial.
6.3.4 Demos
6.3.4.1 Gráfico de velas simple generado por matplotlib
Figura 32 Sprint 2 Demo: script de matplotlib
Figura 33 Sprint 2 Demo: gráficos de velas con matplotlib
87
6.3.4.2 Almacenamiento de información en estructuras C y cálculo del
intervalo temporal
Tomamos de nuevo el fichero csv de entrada del sprint 1:
Figura 34 Sprint 2 Demo: fichero CSV de entrada
El software lee y graba la información en la siguiente estructura:
Figura 35 Sprint 2 Demo: estructura para almacenar datos históricos
Adjuntamos un volcado de la información almacenada en la estructura
junto al resultado del cálculo del intervalo de tiempo entre muestras (en este
caso, 5 minutos):
88
Figura 36 Sprint 2 Demo: información almacenada en la estructura
6.3.4.3 Fichero generado
Adjuntamos imagen de una muestra del archivo generado por la
aplicación. Este fichero contiene la información leída del fichero CSV de
entrada, pero contendrá columnas adicionales para almacenar los resultados
de los indicadores técnicos (ver últimas columnas del fichero, con información
de ejemplo):
Figura 37 Sprint 2 Demo: fichero de salida generado
89
6.4 Sprint 3
6.4.1 Sprint Planning
Como comentamos en el Sprint Review del ciclo 2, en esta ocasión
pediremos abordar Historias de Usuario con una duración estimada superior a
nuestra velocidad inicial, ya que consideramos que somos capaces de
realizarlas, especialmente si no hay tareas de investigación implicadas.
Por tanto, según la prioridad marcada por el Product Owner, decidimos
aceptar las siguientes Historias de Usuario, con un peso total de 21 SP:
STO011: Como cliente quiero que los gráficos se puedan generar
dinámicamente en función a parámetros (estudiar solución
técnica) para decidir si se usan ficheros de configuración de
gráficos
STO013: Como cliente quiero que los gráficos puedan contener
varias ventanas, y se puedan asociar variables a cada ventana,
con tipos y colores parametrizables y que se pueda definir el
tamaño en pixels para ofrecer mayor versatilidad
Figura 38 Sprint 3 Backlog
90
Analizamos en detalle cada Historia de Usuario junto al Product Owner:
ID
STO011DESCRIPCIONComo cliente quiero que los gráficos se puedan generar dinámicamente en función a parámetros (estudiar solución técnica) para decidir si se usan ficheros de configuración de gráficosVALOR5ESTIMACION13 SPACEPTACIONQueremos prescindir del uso de ficheros de script estáticosQueremos poder crear o no los gráficosQueremos que la creación de gráficos sea desatendida y los genere con nombres que se puedan posteriormente identificar
ID
STO013DESCRIPCION
Como cliente quiero que los gráficos puedan contener varias ventanas, y se puedan asociar variables a cada ventana, con tipos y colores parametrizables y que pueda definir en pixels el tamaño para ofrecer mayor versatilidadVALOR8ESTIMACION8 SPACEPTACION
Definir el formato del gráfico en el archivo de configuraciónAceptar número de ventanas, tipos de gráficos, colores, variables a representar, mostrar/ocultar ejes, ...
Figura 39 Sprint 3 Historias de Usuario
Una vez completa toda la información que describe totalmente las
Histoias de Usuario para este sprint, el equipo de desarrollo identifica y valora
las tareas asociadas, obteniendo como resultado la siguiente tabla:
Tabla 11 Sprint 3 Tareas
Historia de
Usuario
Tarea Descripción Horas
STO011 TSK001 Estudiar solución técnica (llamadas desde C a matplotlib).
Seleccionar el paso de información por memoria o en base a
ficheros
24
STO011 TSK002 Crear un módulo sólo para la generación de los gráficos 12
STO011 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO013 TSK001 Identificar las características de los gráficos parametrizables 14
STO013 TSK002 Modificar los ficheros de configuración de los escenarios para
incluir la información
4
STO013 TSK003 Realizar una función para recoger de los archivos de
configuración la información sobre los gráficos
3
STO013 TSK004 Realizas las pruebas de acuerdo a los criterios de aceptación 3
Procedemos a continuación a reflejar el contenido del sprint en Kunagi.
Primero incluimos las Historias de Usuario. En la siguiente imagen observamos
el paso de incluir la STO013 (“Pull to Spring”).
91
También vemos cómo la aplicación nos va mostrando la velocidad del
equipo en base a la conseguida en los sprints anteriores.
Figura 41 Sprint 3: Tablero a falta de incluir las tareas
Y ahora mostramos el tablero completo en el momento del inicio del
sprint:
Figura 40 Sprint 3: incluir Historias de Usuario en un Sprint
92
Figura 42 Sprint 3 Tablero al inicio del Sprint
6.4.2 Sprint Review
Este sprint 3 se ha desarrollado con total normalidad. Parte del esfuerzo
dedicado a la investigación de la librería matplotlib durante el ciclo anterior ha
dado sus frutos en éste, donde la mayor parte del trabajo se ha empleado en
implementar la solución en nuestro proyecto.
Dada la versatilidad y potencia de este módulo gráfico y de la librería
libconfig (para la lectura de los archivos de configuración), se ha podido crear
un completo paquete de gráficos financieros dentro de nuestra aplicación.
Podemos observar en el Burndown Chart cómo el desarrollo de las
tareas ha estado prácticamente en todo momento mejor de lo presupuestado,
sin encontrar grandes dificultades.
La única excepción fue le creación de gráficos intradía, donde el Equipo
de Desarrollo tardó en encontrar la configuración correcta para el eje de
abscisas (la documentación existente es muy extensa y lleva tiempo localizar
un aspecto en concreto).
93
Con este sprint el Equipo de desarrollo ha mostrado gran interés en
recuperar el terreno perdido a nivel general del proyecto, consiguiendo
acercarse al objetivo inicial. Véase el siguiente gráfico:
6.4.3 Sprint Retrospective
Definitivamente el Equipo ha sido capaz de trabajar por encima de las
19SP. En la reunión de planificación del siguiente sprint informaremos al
Product Owner de este hecho, de cara a la selección de las siguientes Historias
de Usuario.
Figura 43 Sprint 3 Burndown Chart
Figura 44 Sprint 3 Release Burndown Chart
94
6.4.4 Demos
6.4.4.1 Lectura de la configuración de gráficos
En esta demo mostramos al cliente cómo, a partir de un archivo de
configuración, el software almacena esta información en memoria para su
posterior uso al graficar los resultados de las simulaciones:
Figura 45 Sprint 3 Demo: configuración del formato de los gráficos
Figura 46 Sprint 3 Demo: salida por consola de la información leída
95
6.4.4.2 Gráfico dinámico: primera versión
Figura 47 Sprint 3 Demo: gráfico creado dinámicamente
6.5 Sprint 4
6.5.1 Sprint Planning
En este cuarto ciclo informamos al Product Owner que nuestra apuesta
por superar las 19SP ha sido acertada y proponemos modificar la velocidad a
21SP, actualización permitida por SCRUM si se produce en función del
resultado de las revisiones de rendimiento realizadas durante los Sprint Review
y Sprint Retrospective.
El Product Owner nos presenta sus requerimientos traducidos a
Historias de Usuario priorizadas:
96
STO008: Como cliente quiero poder escribir fórmulas en formato
matemático para que el software pueda interpretarlas
STO006: Como cliente quiero poder indicar rangos o listas de
parámetros de los indicadores para lanzar simulaciones masivas
STO009: Como cliente quiero poder indicar las fórmulas de
decisión en los archivos de configuración para poder generar
diferentes escenarios
STO019: Como cliente quiero disponer de un LOG de ejecución
indicando tiempos para conocer el rendimiento de la librería de
indicadores técnicos usada y del software en general
STO015: Como cliente quiero poder indicar en el gráfico las
operaciones de entrada/salida del mercado para permitir un
análisis visual (esta Historia de Usuario, en función de la
conversación mantenida con el cliente, y por su complejidad,
Figura 48 Sprint 4 Backlog
97
hemos decidido estimarla al alza en 5SP, en lugar de los 3SP
que tenía inicialmente)
Y el detalle de cada una se muestra a continuación:
ID
STO008DESCRIPCIONComo cliente quiero poder escribir fórmulas en formato matemático y que el software pueda interpretarlasVALOR8ESTIMACION5 SPACEPTACIONDebe ejecutar operaciones aritméticas básicasDebe contemplar el uso de paréntesisDebe poder evaluar condicione >,<,=Debe poder recoger el valor de variables e indicadoresDebe poder recoger el valor de constantesValor absoluto y negaciónAdmitir subíndices
ID
STO006DESCRIPCIONComo cliente quiero poder indicar rangos o listas de parámetros de los indicadores para lanzar simulaciones masivasVALOR8ESTIMACION5 SPACEPTACIONAceptar valores únicosAceptar lista de valoresAceptar rando: desde-hasta-salto
ID
STO009DESCRIPCIONComo cliente quiero poder indicar las fórmulas de decisión en los archivos de configuración para poder generar diferentes escenariosVALOR3ESTIMACION1 SPACEPTACIONDebe contemplar las fórmulas para cálculo de tendencia alcista y bajistaDebe permitir indicar las fórmulas para el volumen a contratar
ID
STO019DESCRIPCIONComo cliente quiero disponer de un LOG de ejecución indicando tiempos para poder conocer el rendimiento del softwareVALOR3ESTIMACION5 SPACEPTACIONDebe poder ser opcional su generaciónDebe mostrar tiempos de ejecuciónMostrar errores cuando se produzcan, y el motivoResultados de las simulacionesPoder seleccionar el directorio donde se genera
98
ID
STO015DESCRIPCIONComo cliente quiero poder indicar en el gráfico las operaciones de entrada/salida del mercado para poder realizar un análisis visualVALOR3ESTIMACION5 SPACEPTACIONIndicar el punto en el tiempo donde se realiza una operaciónDistinguir por colores/texto el tipo de entrada/salida
Tras el análisis de cada Historia, el Equipo de Desarrollo identifica las
siguientes tareas, y su duración en horas de trabajo:
Tabla 12 Sprint 4 Tareas
Historia de
Usuario
Tarea Descripción Horas
STO008 TSK001 Desarrollar un analizador sintáctico para expresiones
matemáticas
7
STO008 TSK002 Desarrollar una función que reemplace el nombre de las
variables por su valor numérico
5
STO008 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO006 TSK001 Modificar la lectura de los archivos de configuración para poder
distinguir entre valores individuales, listas y rangos
5
STO006 TSK002 Almacenar en estructuras en memoria para su posterior uso por
el simulador
7
STO006 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO009 TSK001 Preparar las estructuras en memoria para almacenar las
fórmulas
1
STO009 TSK002 Desarrollar la función de lectura del archivo de configuración
para el apartado de las fórmulas
1
STO009 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 1
STO019 TSK001 Crear una función que, en función de un parámetro, genera el
archivo en un directorio seleccionado en el config
3
STO019 TSK002 Modificar todo el código fuente en los puntos que manejen 10
99
información relevante para ser enviada al fichero
STO019 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 2
STO015 TSK001 Incluir una nueva columna en la estructura que almacena los
indicadores, para indicar la operación realizada en cada
momento (codificar numéricamente el tipo … p.e. 1: entrada 2:
salida …..)
4
STO015 TSK002 Modificar el módulo de los gráficos para recoger esta
información y dibujar una etiqueta en el gráfico según el color
de cada operación
8
STO015 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
Ahora procedemos a recoger esta información en nuestra herramienta
de seguimiento del proyecto (Kunagi). Observamos en la imagen siguiente el
cambio del Product Backlog antes y después de enviar estas cinco Historias de
Usuario al sprint 4.
También podemos observar la nueva velocidad del equipo de 21 SP.
Figura 49 Sprint 4: Reducción del Product Backlog tras asignar al Sprint
100
Y éste es el tablero completo en el momento del inicio del Sprint:
Figura 50 Sprint 4 Tablero al inicio del Sprint
En la siguiente imagen podemos observar un momento del sprint con
una Historia de Usuario parcialmente completada (una tarea están en
desarrollo). Podemos observar en las líneas horizontales (verde y azul) el
estado de completitud de la misma.
101
Figura 51 Sprint 4 Tablero con dos tareas finalizadas y una en curso
6.5.2 Sprint Review
Este sprint ha resultado técnicamente muy interesante al incluir el
desarrollo de un analizador sintáctico de expresiones matemáticas y la lógica
para manejar parámetros que puedan tomar valores en un conjunto o en un
rango del tipo desde-hasta-salto.
Únicamente nos ha quedado por mejorar (no lo hemos hecho por
ceñirnos a las horas de trabajo estimadas) el tratamiento correcto de la
precedencia en las operaciones +, -, *, /. De momento, en esta versión,
indicaremos en el manual de usuario que se deben usar paréntesis para suplir
esta carencia.
Observamos el buen alineamiento de la ejecución de tareas con la
estimación realizada por el Equipo de Desarrollo:
Podemos observar en el gráfico Release Burn down global del proyecto
que, al aumentar nuestra velocidad, hemos conseguido recuperar el atraso con
que iniciamos el primer sprint. El Equipo es capaz de desarrollar de manera
sostenida a una velocidad de 21SP.
Figura 52 Sprint 4 Burndown Chart
102
6.5.3 Sprint Retrospective
No tenemos nada relevante que comentar en esta retrospectiva. Este
ciclo se ha desarrollado con total normalidad. El manejo de tiempos ha sido
adecuado y hemos sido incluso capaces de detectar el peligro de invertir
demasiado tiempo en el desarrollo de un analizador sintáctico que incluyera la
complejidad del manejo de la precedencia. Por el contrario, hemos preferido
concluir una versión sin esta funcionalidad, en aras de que el cliente pueda ver
una demo del producto.
6.5.4 Demos
6.5.4.1 Analizador sintáctico de fórmulas
Mostramos a continuación el resultado satisfactorio de un análisis de la
fórmula que determina una situación alcista. Se observa la sustitución de los
nombres de las variables/indicadores por sus posiciones en la tabla de datos.
En este caso:
Outmacd se encuentra almacenado en el índice 9 de la tabla
Outma se encuentra almacenado en el índice 7 de la tabla
Figura 53 Sprint 4 Release Burndown Chart
Figura 54 Sprint 4 Demo: analizador sintáctico de expresiones
103
6.5.4.2 Rangos de números
Se muestra la salida en la que, a partir del fichero de configuración
donde el parámetro optInFastPeriod del indicador MACD toma dos valores
(“12” y 14”), se generan dos líneas con el mismo id de parámetro, pero con
diferentes valores:
6.5.4.3 Ejemplo de fichero LOG
Figura 56 Sprint 4 Demo: fichero LOG
Figura 55 Sprint 4 Demo: parámetros con varios valores
104
6.5.4.4 Operaciones de entrada/salida en gráficos
6.6 Sprint 5
6.6.1 Sprint Planning
En la reunión de planificación del quinto sprint, el Product Owner había
seleccionado 4 Historias de Usuario, que en total sumaban 16 Puntos de
Historia (SP), lo cual quedaba por debajo de las 21 SP que éramos capaces de
desarrollar (-5SP).
La siguiente Historia de Usuario, priorizada según el valor para el
negocio tenía un tamaño de 13SP, lo que nos hacía imposible incluirla en su
totalidad.
SCRUM nos permite dividir una Historia de Usuario en otras de menores
dimensiones, siempre y cuando las resultantes sigan ofreciendo una
funcionalidad al cliente.
Solicitamos por tanto al Product Owner que analizara si era posible
dividir la historia STO018 (como cliente quiero que, además de decidir entradas
/ salidas del mercado en base a unas fórmulas, también contemple Stop Loss y
Figura 57 Sprint 4 Demo: indicadores de entrada/salida del mercado
105
Take Profit) en, al menos, otras dos, siendo una de ellas de tamaño entorno a
los 5SP para que pudiera ser incluida en este sprint.
Finalmente llegamos a un acuerdo, y la Historia de Usuario STO018 se
convirtió en dos:
La STO018, con un nuevo tamaño de 5SP: Como cliente quiero
que se puedan incluir en los archivos de configuración
información relativa al StopLoss y TakeProfit para asimilarlo a las
operaciones reales
Una nueva STO020, de tamaño 8SP: Como cliente quiero que las
simulaciones tengan en cuenta el efecto del StopLoss y
TakeProfit para generar órdenes de salida del mercado
Podemos observar en la siguiente figura esta división:
Figura 58 Sprint 5 Backlog
106
STO016: Como cliente quiero guardar en una matriz el resultado
de la ejecución de todos los escenarios para poder realizar
estudios posteriores
STO017: Como cliente quiero que el software me ordene los
escenarios según uno o más ratios para conocer las reglas de
mercado más ventajosas
STO014: Como cliente quiero indicar al software que me genere
gráficos siempre, nunca o en los n casos más favorables para no
sobrecargar en el caso de ejecución de escenarios masivos
STO007: Como cliente quiero poder incluir constantes en los
ficheros de configuración de los escenarios para simplificar la
lectura de los mismos
STO018: Como cliente quiero incluir en los archivos de
configuración información relativa al Stop Loss y Take Profit para
asimilarlo a las operaciones reales del mercado
Como en los sprint anteriores, ahora debemos documentar para cada
Historia de Usuario, los aspectos que la definen completamente, desde su
estimación en Puntos de Historia, hasta el valor que aportaría al negocio y los
criterios que, una vez satisfechos, determinarían que la Historia está
completamente realizada y aceptada:
107
ID
STO016DESCRIPCIONComo cliente quiero guardar en una matriz el resultado de la ejecución de todos los escenarios para poder realizar estudios posterioresVALOR3ESTIMACION5 SPACEPTACIONAlmacenar el detalle de las operaciones de entrada/salidaAlmacenar el profitCalcular y almacenar otros ratios
ID
STO017DESCRIPCIONComo cliente quiero que el software me ordene los escenarios según uno o más ratios para conocer las regla del mercado más ventajosasVALOR3ESTIMACION5 SPACEPTACIONComprobar que hay resultados para ordenarDebe contemplar que haya escenarios con el mismo resutado
ID
STO014DESCRIPCIONComo cliente quiero indicar al software que me genere gráficos siempre, nunca o en los n casos más favorables para no sobrecargar el sistema en ejecuciones masivasVALOR3ESTIMACION5 SPACEPTACIONComprobar que no queremos generar más gráficos que los disponiblesNombrar los ficheros para que se pueda distinguir si son parte de los n-mejores o del total
ID
STO007DESCRIPCIONComo cliente quiero poder incluir constantes en los ficheros de configuración de los escenarios para simplificar la lectura de los mismosVALOR1ESTIMACION1 SPACEPTACIONLas constantes deben ir para cada escenarioLos nombres de las constantes debe poder usarse en las fórmulas que interpreta el analizador sintáctico
ID
STO018DESCRIPCIONIncluir en los archivos de configuración información relativa al StopLoss y TakeProfit para asimiilarlo a las operaciones reales del mercadoVALOR11ESTIMACION5 SPACEPTACIONDebe poder basarse en fórmulasDebe estar por separado SL y TPIndicar una para compra (operaciones a largo) y venta (operaciones en corto)
108
Se muestran a continuación las tareas asociadas a cada Historia de Usuario:
Tabla 13 Sprint 5 Tareas
Historia de
Usuario
Tarea Descripción Horas
STO016 TSK001 Definir las estructuras para almacenar resultados de cada
iteración y el historial de operaciones de entrada/salida
3
STO016 TSK002 Desarrollar la función que almacene la información de cada
ciclo
10
STO016 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 2
STO017 TSK001 Seleccionar un método de ordenación( burbuja, otros) 2
STO017 TSK002 Desarrollar la función Sort tomando como entradas las
estructuras del historial de simulaciones y operaciones de
entrada/salida
10
STO017 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
STO014 TSK001 Modificar fichero de configuración general para incluir este
parámetros y realizar la función de lectura
1
STO014 TSK002 Revisar todo el código para generar gráficos o no, según el
valor del parámetro
10
STO014 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 4
STO007 TSK001 Modificar ficheros de configuración de los escenarios para
incluir una lista de constantes, con nombre y valor
1
STO007 TSK002 Modificar el código del analizador sintáctico para que
reconozca los nombre de las constantes
1
STO007 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 1
STO013 TSK001 Modificar ficheros de configuración de los escenarios para
incluir fórmulas de TP y SL
4
STO013 TSK002 Realizar la función de lectura y almacenamiento en memoria de
las fórmulas de TP y SL
8
STO013 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 3
109
Ahora procedemos a recoger esta información en nuestra herramienta
de seguimiento del proyecto (Kunagi):
Figura 59 Sprint 5 Tablero al inicio del Sprint
110
6.6.2 Sprint Review
Durante este quinto sprint, hemos experimentado un poco de retraso en
las etapas iniciales, coincidiendo con las tareas de desarrollo del código fuente
para almacenar en un array los resultados que se van produciendo en cada
iteración del programa de simulación. El diseño de cómo implementar esta
función y las tareas asociadas ha sido algo más complicado de lo que
estimábamos, ya que también identificamos que teníamos que guardar
punteros a otras estructuras donde se almacenarían los apuntes financieros de
entradas/salidas del mercado.
Sin embargo, como podemos observar en el gráfico, hemos podido
terminar el ciclo apenas un poco peor de lo previsto, por lo que, de cara al
proyecto completo, la evolución es correcta y se van cumpliendo las
estimaciones. Lo podemos observar en la figura siguiente:
Figura 60 Sprint 5 Burndown Chart
111
6.6.3 Sprint Retrospective
No tenemos nada reseñable que comentar. Este ciclo se ha desarrollado
con total normalidad.
6.6.4 Demos
6.6.4.1 Matriz de resultados ordenada
Mostramos al cliente una captura del output del programa donde se
obtiene una tabla con las iteraciones de cada escenario ejecutado, ordenados
de mayor a menor beneficio neto. Es en sí la matriz solicitada en la historia
STO016, ordenada según pedía la historia STO017.
Figura 62 Sprint 5 Demo: Tabla de resultados
También se obtiene, al final de la ejecución, un informe con los
escenarios que ofrecen los mejores resultados:
Figura 61 Sprint 5 Release Burndown Chart
112
Figura 63 Sprint 5 Demo: Resultados ordenados
6.6.4.2 Lectura de constantes desde el fichero de configuración
En esta demo mostramos cómo los datos contenidos en el archivo de
configuración, en el apartado de constantes, son recogidos y almacenados
para su posterior tratamiento:
Figura 64 Sprint 5 Demo: constantes en los archivos de configuración
Figura 65 Sprint 5 Demo: constantes almacenadas en la aplicación
113
6.7 Sprint 6
6.7.1 Sprint Planning
Recordamos cómo en las primeras reuniones con el cliente, y
basándonos en los requerimientos del negocio (traducidos a Historias de
Usuario) y en la velocidad estimada del equipo, pudimos identificar un total de
6 sprints.
Conforme se ha ido desarrollando el proyecto, hemos llegado a este
sexto sprint con una Historia de Usuario pendiente de una duración estimada
de 8 Puntos de Historia (8SP) y, además, hemos podido confirmar que
podemos entregar hasta 21SP.
El cliente nos ha comunicado que la funcionalidad que hemos entregado
hasta el momento se ajusta a las expectativas. Este hecho, junto al remanente
de 13SP que quedan disponibles en este último ciclo, da al cliente la
oportunidad de enriquecer el producto final con más funcionalidades que se
han ido identificado conforme se han entregando las sucesivas versiones:
En esta última reunión de planificación, el Product Owner ha
informado que le gustaría aumentar la utilidad de la herramienta
permitiendo que los datos históricos usados para el backtesting
pudieran incorporarse desde una base de datos, alojada en un
servidor propiedad del cliente, y no sólo con desde el fichero csv
con el hemos trabajado durante todo el proyecto.
Adicionalmente, habiendo observado la demo que se recoge en el
apartado 6.6.4.1, el cliente pide que el criterio de ordenación de
los escenarios pueda ser en base a otros parámetros, y no sólo el
beneficio neto. De aquí ha surgido otra Historia de Usuario.
Por último, y a la vista de la versatilidad que ofrece la
funcionalidad de que los parámetros puedan tomar valores en
listas o en rangos, pide que el StopLoss y el TakeProfit puedan
también ser optimizados de esta manera.
Por tanto, a la Historia de Usuario que quedaba pendiente, se han unido
otras tres que, si el resultado del sprint es satisfactorio y aceptado por el
cliente, habrán supuesto completar la funcionalidad completa requerida al inicio
del proyecto.
Identificamos a continuación las Historias de Usuario para el sprint 6:
114
STO020: Como cliente quiero que las simulaciones tengan en
cuenta el efecto del StopLoss y TakeProfit para generar órdenes
de salida del mercado
[nueva] STO021: Como cliente quiero poder leer datos históricos
desde una base de datos MySQL, para poder diferenciar mi
producto de otras herramientas comerciales que manejan datos
en formato estándar
[nueva] STO022: Como cliente quiero que el software calcule
indicadores de eficacia de la estrategia de trading, aparte del
beneficio neto, para poder determinar cuál es el mejor escenario
[nueva] STO023: Como cliente quiero que el StopLoss y
TakeProfit puedan tratarse como un parámetro más, admitiendo
valores en listas o en rangos, al igual que el resto de parámetros
de los indicadores para poder generar escenarios múltiples
En la siguiente imagen podemos observar el proceso de asignar
Historias del Product Backlog al sprint que se inicia. Observamos cómo en el
Product Backlog ya no quedan Historias de Usuario por entregar.
Sólo queda ahora completar toda la información que identifica
totalmente a estas Historia de Usuario:
Figura 66 Sprint 6 Backlog
115
ID
STO020DESCRIPCIONComo cliente quiero que las simulaciones tengan en cuenta el efecto del StopLoss y TakeProfit para generar órdenes de salida del mercado VALOR11ESTIMACION8SPACEPTACIONPara cada operación a corto o a largo se debe poder marcar el SL y TPEn cada iteración el simulador debe evaluar la condición de SL y TPSi se dispara la condición, debe quedar registros del momento y del beneficio obtenido
ID
STO021DESCRIPCION
Como cliente quiero poder leer
datos históricos desde una base de
datos MySQL, para poder
diferenciar mi producto de otras
herramientas comerciales que
manejan datos en formato estándarVALOR8ESTIMACION5 SPACEPTACIONPoder indicar los parámetros de conexión en el archivo de configuraciónControlar cuando no se obtenga ningún resultado, que no genere errores
ID
STO022DESCRIPCIONComo cliente quiero que el software calcula indicadores de eficacia de la estrategia de trading, aparte del beneficio neto, para poder determinar cuál es el mejor escenarioVALOR1ESTIMACION3 SPACEPTACIONPermitir tener varios indicadores, no sólo el beneficioPoder ordenar por cualquiera de ellosPoder conocer los parámetros usados en cada iteación
ID
STO023DESCRIPCIONComo cliente quiero que el StopLoss y TakeProfit puedan calcularse como un parámetro más, admitiendo valores en listas o en rangos, al igual que el resto de parámetros de los indicadores para poder generar escenarios múltiplesVALOR5ESTIMACION3 SPACEPTACIONPoder considerar a SLy TP como un parámetro más, con valores discretos o en listas/rangoAlmacenar los valores que toman en cada iteración
Tabla 14 Sprint 6 Tareas
Un análisis detallado por parte del Equipo de Desarrollo, lleva a
identificar las siguientes tareas necesarias para desarrollar las Historias de
Usuario:
Historia de
Usuario
Tarea Descripción Horas
STO020 TSK001 Incluir en el bucle de cálculo el disparado del StopLoss y
TakeProfit, generando las órdenes de salida
10
116
STO020 TSK002 Incluir en el libro de apuntes, la salida debido a SL/TP y su
valor en beneficio/pérdida
10
STO020 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 4
STO021 TSK001 Incluir en el archivo de configuración parámetros de conexión a
una BBDD
3
STO021 TSK002 Escribir una función similar a la que lee archivos csv, pero
desde tablas de una base de datos
10
STO021 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 2
STO022 TSK001 Preparar espacio en las struct para alojar varios cálculos de
rendimiento
1
STO022 TSK002 Al final de cada simulación calcular todos los ratios 6
STO022 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 2
STO023 TSK001 Modificar ficheros de configuración de los escenarios para
incluir una lista de constantes, con nombre y valor
1
STO023 TSK002 Modificar el código del analizador sintáctico para que
reconozca los nombre de las constantes
6
STO023 TSK003 Realizas las pruebas de acuerdo a los criterios de aceptación 2
Con toda esta información, actualizamos Kunagi, nuestra
herramienta de control y seguimiento del proyecto. Asignamos las Historias al
sprint y creamos las tareas dentro de cada Historia:
117
Figura 67 Sprint 6 Tablero al inicio del Sprint
6.7.2 Sprint Review
El Equipo de Desarrollo reconoce que nuevamente una tarea de
investigación, en este caso el acceso a una base de datos de MySQL ha
supuesto un ligero retraso en la implementación de una tarea. Si bien existe
una librería MySQL estándar de acceso a datos para C/C++, se ha dedicado
algo más tiempo del previsto a la configuración del acceso al servidor de
cliente. Además, para poder trabajar off-line, se ha preparado una base de
datos MySQL local para realizar más pruebas.
Una vez realizadas estas tareas, el sprint se ha desarrollado con
normalidad y los desarrollos siguientes han estado en plazo. Observamos en el
gráficos el efecto de este retraso a partir de la mitad del sprint.
118
C
Para poder reflejar en el gráfico del proyecto la inclusión de las tres
nuevas Historias de Usuario, hemos recalculado el Release Burndown Chart
con objeto de añadir los 11 Puntos de Historia, elevando el total del proyecto
desde los 102 estimados al principio, hasta los 116 conseguidos.
6.7.3 Sprint Retrospective
Como hemos venido observando durante los sucesivos Sprints, la
velocidad del equipo se ha ajustado bien a las estimaciones. El aumento
de19SP a 21SP ha sido muy efectivo y se ha podido recuperar el retraso con el
que iniciamos el sprint 1.
Figura 68 Sprint 6 Burndown Chart
Figura 69 Sprint 6 Release Burndown Chart
119
En los casos en los que alguna Historia de Usuario se ha desviado
respecto a lo previsto, siempre se ha reaccionado antes del final de la iteración,
consiguiendo entregar las funcionalidades previstas.
6.7.4 Demos
6.7.4.1 Uso de TakeProfit y StopLoss como parámetros
Observamos en primer lugar cómo se especifican estos elementos en el
archivo config. Un indicador del tipo KTE (constante) albergará todas aquéllas
variables que, sin ser parámetros de indicadores técnicos de TALib, van a
tomar valores cambiantes en las sucesivas iteraciones;
Mostramos a continuación una salida por consola donde el programa ha
leído y reconocido los parámetros, y cómo los usa (en el cálculo del Take
Profit) a la hora de realizar la siguiente operación en el mercado:
Figura 70 Sprint 6 Demo: Variables para cálculo de TP y SL
Figura 71 Sprint 6 Demo: Uso del parámetro en el cálculo del SoptLoss
120
6.7.4.2 Ejecución de las condiciones StopLoss y TakeProfit
En esta demo comprobamos que la aplicación tiene en cuenta los
valores de Stop Loss y Take Profit para generar operaciones de salida al
alcanzar los precios cierto umbral.
Vemos un log de operaciones con dos salidas por Stop Loss y una por
Take Profit:
6.7.4.3 Ratios de performance
En esta demo hemos mostrado al cliente tres ratios calculados en cada
iteración, en concreto el Profit, Profit Factor y Nº de Trades (operaciones):
Consultar el “apartado 2.1” de este TFG para la descripción de estos
ratios.
Figura 72 Sprint 6 Demo: Ejecuciones de Stop Loss y Take Profit
Figura 73 Sprint 6 Demo: Indicadores de rendimiento
121
7 Pruebas y Despliegue de la solución
7.1 Pruebas
Las metodologías de desarrollo ágil han surgido intentando generar
sistemas con alta calidad y a la vez, con una reducción y simplificación de
tareas. Bajo este enfoque, las pruebas de software han tomado un papel
crucial, dada la necesidad de realizar pequeñas liberaciones “funcionalmente”
estables, surgiendo así el testing ágil.
Mientras que en las metodologías tradicionales las actividades de
prueba normalmente no se pueden iniciar hasta que la especificación de
requisitos se encuentre completa, en el caso del testing ágil dichas tareas
quedan inmersas dentro de cada iteración.
Otra diferencia importante entre las metodologías tradicionales de
pruebas y las ágiles, es que mientras las primeras tienen como objetivo
primordial la validación del producto desarrollado, en las ágiles tiene gran peso
su utilización como medio para guiar el desarrollo del software, sustituyendo así
la definición formal de requisitos.
En nuestro proyecto, al elaborar cada historia de usuario habíamos
incluido los criterios de aceptación. A continuación detallamos el plan de
pruebas que cada criterio lleva asociado:
Tabla 15 Caso de prueba 001
CP-001 El nombre del fichero debe informarse como un parámetro y debe
verificarse que existe en el directorio de la aplicación
Usuario Cliente
Historia de
Usuario STO001
Prerrequisitos Debemos tener en el directorio de la aplicación el archivo config.cfg, o bien, el que
hayamos informado como argumento en la llamada a trading.exe
Descripción Incluir en config.cfg la línea inputDataFile =”xxxxxxx” y lanzar la aplicación trading.exe
Resultado
esperado Informar con un mensaje de error si el fichero no existe en el directorio de la aplicación
Probador José Carlos Cano
122
Tabla 16 Caso de prueba 002
CP-002 Comprobar que los datos del fichero de históricos tiene el formato
esperado
Usuario Cliente
Historia de
Usuario STO001
Prerrequisitos El fichero de configuración y el de datos históricos deben existir en el directorio de la
aplicación
Descripción Incluir en config.cfg la sección columnsInDataFile, conteniendo una lista de nombres
de campo y tipo de datos (d:date, t:time, f:float) y lanzar la aplicación
Resultado
esperado
El software abrirá el fichero y leerá todas las líneas del mismo, verificando que existen
el mismo número de columnas de entrada, y con el mismo formato, que el informado en
la sección columnsInDataFile. Mostrar un mensaje en caso de error o, por el contrario,
el número de líneas leídas en caso de éxito
Probador José Carlos Cano
Tabla 17 Caso de prueba 003
CP-003 El software debe poder recorrer los archivos de escenario y validar
su sintaxis
Usuario Cliente
Historia de
Usuario STO004
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Situamos en el directorio de la aplicación los ficheros de los escenarios en formato:
scenarioXXXX.cfg y lanzamos trading.exe
Resultado
esperado
El sistema debe efectuar un recorrido por todos los ficheros con nombre
scenarioXXXXX.cfg, y abrirlos por medio de la librería libconfig, mostrando un error en
caso de que se encuentre un error en la sintaxis.
Probador José Carlos Cano
123
Tabla 18 Caso de prueba 004
CP-004 El software debe incorporar en memoria la información contenida
en los ficheros de escenarios
Usuario Cliente
Historia de
Usuario STO004
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Situamos en el directorio de la aplicación los ficheros de los escenarios en formato:
scenarioXXXX.cfg y lanzamos trading.exe
Resultado
esperado
Cada vez que se abre y lee un fichero scenarioXXXXX.cfg por medio de la librería
libconfig, el sistema almacena su contenido en estructuras de datos en memoria,
informando si falta alguna sección requerida
Probador José Carlos Cano
Tabla 19 Caso de prueba 005
CP-005 El software genera un gráfico en formato png
Usuario Cliente
Historia de
Usuario STO010
Prerrequisitos
Existen en el directorio de la aplicación los ficheros de los escenarios en formato:
scenarioXXXX.cfg y se ha incluído en config.cfg la sección outputFolder, para indicar
dónde se deben generar las imágenes
Descripción Colocar un archivo con extensión .py (scripts de Python) en el directorio de la aplicación
y ejecutar
Resultado
esperado
Si la sintaxis del script es correcta, en el directorio indicado por outputFolder se
encuentra una imagen en formato png, o se captura un error si el script tiene sintaxis
incorrecta o no se puede acceder a la ruta en disco especificada
Probador José Carlos Cano
124
Tabla 20 Caso de prueba 006
CP-006 Manejar dinámicamente memoria controlando en todo momento
errores de asignación
Usuario Cliente
Historia de
Usuario STO003
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Crear dos archivos de datos, con volumen diferente de información y lanzarlo en
ejecuciones separadas
Resultado
esperado
En cada ejecución el sistema lee el archivo y almacena los datos en memoria, haciendo
llamadas al sistema operativo para reservar memoria. Muestra las tres últimas líneas
almacenadas en la memoria interna para comprobar su integridad. Intercepta y muestra
un error en caso de fallo de memoria
Probador José Carlos Cano
Tabla 21 Caso de prueba 007
CP-007 Controlar crecimiento de uso de memoria reutilizando espacio ya
reservado
Usuario Cliente
Historia de
Usuario STO003
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Crear dos ficheros de escenarios, scenario1.cfg y scenario2.cfg. El primero contiene 3
indicadores y el segundo contiene 2 indicadores y lanzar la aplicación
Resultado
esperado
El sistema lee el archivo de datos y almacena la información en memoria. A
continuación lee el primer escenario y reserva espacio para tres indicadores. Al leer el
segundo escenario no reserva memoria, sino que reutiliza el espacio de dos de los
indicadores de la anterior ejecución, inicializando a -1 el tercero. El sistema muestra el
contenido del último registro de los tres indicadores (el último mostrará -1) para
comprobar la integridad de los datos
Probador José Carlos Cano
125
Tabla 22 Caso de prueba 008
CP-008 El sistema calculará el lapso de tiempo entre dos datos leídos del
archivo de históricos
Usuario Cliente
Historia de
Usuario STO002
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción
Crear tres archivos de datos, dos de ellos con intervalo de tiempos diferentes (5 minutos
y 1 día) y el tercero con formato erróneo en el campo de fecha, y lanzarlos en
ejecuciones separadas
Resultado
esperado
El sistema lee el archivo de datos y almacena la información en memoria. A
continuación calcula el intervalo de tiempo y lo muestra junto al número de líneas
leídas. En caso de formato de fecha errónea, intercepta y muestra el error
Probador José Carlos Cano
Tabla 23 Caso de prueba 009
CP-009 El sistema generará un archivo csv conteniendo los datos
históricos y los indicadores calculados
Usuario Cliente
Historia de
Usuario STO012
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación.
Descripción Crear dos archivos de datos, con volumen diferente de información, y lanzarlo en
ejecuciones separadas para comprobar la escritura a ficheros en las dos situaciones
Resultado
esperado
El sistema lee el archivo de datos y almacena la información en memoria. El sistema
simula el cálculo de indicadores reservando un espacio con números aleatorios. El
sistema vuelca toda la memoria a un archivo con formato separado por comas.
Intercepta y muestra error de manejo de ficheros en caso de producirse.
Probador José Carlos Cano
126
Tabla 24 Caso de prueba 010
CP-010 El sistema leerá un archivo de configuración y lo almacenará en
una estructura en memoria
Usuario Cliente
Historia de
Usuario STO005
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Situamos en el directorio de la aplicación un fichero de configuración con el nombre
functions.cfg y lanzamos trading.exe
Resultado
esperado
El sistema debe abrir el archivo functions.cfg, y leerlo por medio de la librería libconfig,
almacenando la información en una estructura en memoria. Mostrará un error en caso
de que la sintaxis no sea correcta, o un volcado por consola de la información
almacenada.
Probador José Carlos Cano
Tabla 25 Caso de prueba 011
CP-011 Queremos configurar la creación de gráficos de manera que se
generen sin necesidad de crear un script estático
Usuario Cliente
Historia de
Usuario STO011
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción Crearemos un array en memoria con instrucciones Python de prueba para generar un
gráfico de ejemplo (función seno)
Resultado
esperado
El sistema debe generar un archivo png con la función seno
El sistema recogerá un error en caso de que alguna instrucción no se pueda ejecutar o
falte algún componente
Probador José Carlos Cano
127
Tabla 26 Caso de prueba 012
CP-012 Queremos configurar la apariencia de los gráficos
Usuario Cliente
Historia de
Usuario STO013
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción
Situamos en el directorio de la aplicación los ficheros de los escenarios en formato:
scenarioXXXX.cfg conteniendo las secciones:
graphicNbWindows, graphicWidth, graphicHeight, graphicFontSize,
graphicWindows, graphicData
Resultado
esperado
Según el valor de outputGraphMode seleccionado se generarán en el directorio
indicado en outputFolder imágenes según los parámetros informados sobre número
de ventanas, variables a representar en cada ventana, tipo de gráfico y tamaño en
pixels
Se mostrará un error en el caso de que el intérprete de Python no pueda generar los
gráficos por error de sintaxis en las instrucciones generadas a partir de la información
contenida en los archivos de los escenarios
Probador José Carlos Cano
Tabla 27 Caso de prueba 013
CP-013
Queremos poder escribir fórmulas matemáticas en los archivos de
configuración y que el sistema las verifique sintácticamente y
calcule su valor
Usuario Cliente
Historia de
Usuario STO008
Prerrequisitos Deben existir archivos de configuración de escenarios en el directorio de la aplicación
Descripción Se introducirá una fórmula matemática en las secciones buy-formula= o sell-formula =
, incluyendo números, operadores +,-,*,/ y paréntesis
Resultado
esperado
El sistema devolverá un número float correspondiente al valor resultante de la fórmula
El sistema devolverá la fórmula con un signo ^ señalando donde haya un error
sintáctico
128
Probador José Carlos Cano
Tabla 28 Caso de prueba 014
CP-014
Queremos poder escribir fórmulas matemáticas en los archivos de
configuración que reconozcan nombre de variables y los
sustituyan por su valor
Usuario Cliente
Historia de
Usuario STO008
Prerrequisitos Deben existir archivos de configuración de escenarios en el directorio de la aplicación
Descripción
Se introducirá una fórmula matemática en las secciones buy-formula= o sell-formula =
, incluyendo nombres de constantes y parámetros de indicadores, operadores +,-,*,/
y paréntesis
Resultado
esperado
El sistema devolverá un número float correspondiente al valor resultante de la fórmula
El sistema devolverá la fórmula con un signo ^ señalando donde haya un error
sintáctico
El sistema devolverá la fórmula con -1 sustituyendo el nombre de variable que no se
haya localizado en el escenario actual
Probador José Carlos Cano
Tabla 29 Caso de prueba 015
CP-015 Queremos hacer que los parámetros de los indicadores puedan
adoptar valores múltiples
Usuario Cliente
Historia de
Usuario STO006
Prerrequisitos Deben existir archivos de configuración de escenarios en el directorio de la aplicación
Descripción
En las secciones technicalIndicators-> indicatorParameters se introducirán:
parameterValue= lista de valores separados por comas
o
parameterValueRange=(valor desde,valor hasta, salto)
129
Resultado
esperado
El sistema interpretará la información del archivo de configuración y añadirá registros a
la estructura en memoria, un valor por cada elemento (caso de parameterValue) o
cada iteración del bucle ( en el caso de parameterValueRange)
El sistema nos mostrará un volcado de la estructura completa con la información
Probador José Carlos Cano
Tabla 30 Caso de prueba 016
CP-016
Queremos que las decisiones de situación alcista/bajista del
mercado se basen en el resultado de fórmulas introducidas en los
archivos de configuración de los escenarios
Usuario Cliente
Historia de
Usuario STO009
Prerrequisitos Deben existir archivos de configuración de escenarios en el directorio de la aplicación
Descripción
Se introducirá una fórmula matemática en las secciones buy-condition= o sell-
condition =, incluyendo nombres de constantes y parámetros de indicadores,
operadores +,-,*,/ y paréntesis
Resultado
esperado
El sistema devolverá el número 1 si la condición de buy es true (alcista) y devolverá 2 si
la condición de sell es true (bajista)
El sistema devolverá la fórmula con un signo ^ señalando donde haya un error
sintáctico
El sistema devolverá la fórmula con -1 sustituyendo el nombre de variable que no se
haya localizado en el escenario actual
Probador José Carlos Cano
Tabla 31 Caso de prueba 017
CP-017
Queremos que el volumen de las operaciones se decidan en base
al resultado de fórmulas introducidas en los archivos de
configuración de los escenarios
Usuario Cliente
Historia de
Usuario STO009
130
Prerrequisitos Deben existir archivos de configuración de escenarios en el directorio de la aplicación
Descripción
Se introducirá una fórmula matemática en las secciones buy- formula= o sell- formula=, incluyendo nombres de constantes y parámetros de indicadores,
operadores +,-,*,/ y paréntesis
Resultado
esperado
El sistema devolverá el volumen de la operación
El sistema devolverá la fórmula con un signo ^ señalando donde haya un error
sintáctico
El sistema devolverá la fórmula con -1 sustituyendo el nombre de variable que no se
haya localizado en el escenario actual
Probador José Carlos Cano
Tabla 32 Caso de prueba 018
CP-018 Queremos disponer de un LOG con tiempos de ejecución, informe
de errores y resultado de los escenarios
Usuario Cliente
Historia de
Usuario STO019
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción Se informará del nombre del fichero de Log en la sección logFile = del fichero config.cfg
Se dejará en blanco en la siguiente prueba
Resultado
esperado
Si el nombre se ha informado generará un fichero .txt con información de tiempos y
pasos en la ejecución y un apartado con la lista de escenarios, con los parámetros
usados en cada caso
Si el nombre no se ha informado no deberá aparecer ningún archivo y sólo se observará
la información por defecto en la consola
Probador José Carlos Cano
Tabla 33 Caso de prueba 019
CP-019 Queremos ver en el gráfico de salida etiquetas donde se
produzcan entradas/salidas del mercado
Usuario Cliente
131
Historia de
Usuario STO015
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción Asegurarse de que outputGraphMode tiene valor 0 (o mayor) para que se generen
gráficos. Ejecutar la aplicación
Resultado
esperado
El gráfico de salida deberá mostrar etiqueta B,S,SL,TP donde haya una operación a
largo, a corto, condición de StopLoss y TakeProfit respectivamente
Probador José Carlos Cano
Tabla 34 Caso de prueba 020
CP-020
Queremos que el sistema elabore un registro en memoria de todas
las ejecuciones, incluyendo resultado y lista de operaciones de
entrada/salida
Usuario Cliente
Historia de
Usuario STO016
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción Asegurarse de que outputOpBookMode tiene valor 0 o mayor para que se generen
libros de operaciones. Ejecutar la aplicación
Resultado
esperado
A lo largo de las iteraciones, se irá alimentando una estructura en memoria con las
operaciones realizadas. Se utilizará para calcular sobre ella los ratios que medirán la
validez del sistema.
Se generará un error en caso de que se produjera fallo en asignación de memoria
conforme crece el espacio requerido por la estructura
Probador José Carlos Cano
Tabla 35 Caso de prueba 021
CP-021 Los escenarios se deben ordenar por Profit
Usuario Cliente
132
Historia de
Usuario STO017
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción Ejecutar la aplicación
Resultado
esperado
Se mostrará en consola (y en el fichero LOG si así se ha informado) la lista de todos
los escenarios ejecutados, con todas sus iteraciones, ordenados de mayor a menor
Profit
En el caso de existir dos escenarios con el mismo resultado se mostrarán juntos,
ordenados por hora de ejecución
En caso de no haber escenarios por ordenar, no debe producirse ningún error
Probador José Carlos Cano
Tabla 36 Caso de prueba 022
CP-022 Los gráficos se deben generar de forma desatendida según valor
de un parámetro
Usuario Cliente
Historia de
Usuario STO014
Prerrequisitos Introducimos en el archivo config.cfg una línea outputGraphMode= -1 ,
outputGraphMode= 0 y outputGraphMode= 2, y ejecutamos por separado
Descripción Ejecutar la aplicación
Resultado
esperado
Para el caso outputGraphMode= -1, En el directorio indicado en outputFolder no
debe aparecer ninguna imagen
Para el caso outputGraphMode= 0, En el directorio indicado en outputFolder deben
aparecer tantos gráficos como escenarios se ejecuten cuyos nombres serán:
“nombre_del_escenario”+”número_del_escenario”+”.png”
Para el caso outputGraphMode= 2, En el directorio indicado en outputFolder deben
aparecer 2 imágenes, que corresponderán a los mejores escenarios ordenados por un
factor, cuyos nombres serán: “nombre_del_escenario”+”BEST”+ordinal+”.png”
Probador José Carlos Cano
133
Tabla 37 Caso de prueba 023
CP-023 Admitir una lista de contantes y su valor en los archivos de
configuración
Usuario Cliente
Historia de
Usuario STO007
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción
Introducir en un archivo de escenario la sección constants con las subsecciones name
y value donde se indicará una lista de constantes y su valor float, y una fórmula que
incluya alguno de estos nombres
Ejecutar la aplicación
Resultado
esperado
El sistema devolverá el valor de la fórmula, tras sustituir el nombre por su valor o bien
mostrará un error en caso de sintaxis incorrecta o nombre no encontrado
Probador José Carlos Cano
Tabla 38 Caso de prueba 024
CP-024 Incluir en los archivos de configuración fórmulas para definir Stop
Loss y Take Profit
Usuario Cliente
Historia de
Usuario STO018
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación, así como los archivos de configuración de los escenarios
Descripción
Introducir en un archivo de escenario la sección stoploss y takeprofit dentro de buy y
sell. Escribir una fórmula que definirá el SL y TP en la operación que se realiza.
Ejecutar la aplicación
Resultado
esperado
El sistema leerá esta sección y la incluirá en la estructura en memoria para usarse en
las iteraciones posteriores
Mostrará un error de memoria en el caso de que no se puedan grabar la información.
En esta prueba no se exige análisis sintáctico de la fórmula
Probador José Carlos Cano
134
Tabla 39 Caso de prueba 025
CP-025 Incluir en la ejecución de los escenarios la detección de las
condiciones de StopLoss y TakeProfit
Usuario Cliente
Historia de
Usuario STO020
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción
Introducir en un archivo de escenario la sección stoploss y takeprofit dentro de buy y
sell. Escribir una fórmula que definirá el SL y TP en la operación que se realiza.
Ejecutar la aplicación
Resultado
esperado
El simulador debe evaluar la condición de SL y TP en cada iteración. En caso de
satisfacerse, generará la operación de salida del mercado y actualizará el libro de
operaciones
En caso de que la fórmula presente un error de sintaxis o variable no encontrada,
interceptará el error
Probador José Carlos Cano
Tabla 40 Caso de prueba 026
CP-026 Lectura de una base de datos MySQL y chequeo de las columnas
Usuario Cliente
Historia de
Usuario STO021
Prerrequisitos
El fichero de configuración general config.cfg debe existir en el directorio de la
aplicación
Incluir en config.cfg la sección columnsInDataFile, conteniendo una lista de nombres
de campo y tipo de datos (d:date, t:time, f:float) y lanzar la aplicación
Debe haber un motor de base de datos MySQL accesible en la red
135
Descripción
Introducir en el archivo config.cfg las siguientes líneas:
inputSQLServer=, inputSQLDatabase=, inputSQLUser=, inputSQLPassword=,
inputSQLQuery= con los datos de conexión y la consulta a ejecutar
Ejecutar la aplicación
Resultado
esperado
El sistema debe intentar acceder al servidor indicado en la configuración, y ejecutar la
consulta contra la base de datos seleccionada.
La aplicación debe mapear contra las columnas especificadas en columnsInDataFile y
verificar que son del mismo tipo. Devolver un error en caso contrario.
Devolver error si no se puede establecer la conexión o el motor MySQL.
Probador José Carlos Cano
Tabla 41 Caso de prueba 027
CP-027 Añadir ratios de medición de la eficacia de las estrategias
Usuario Cliente
Historia de
Usuario STO022
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación así como los archivos de configuración de los escenarios
Descripción Ejecutar la aplicación
Resultado
esperado
El sistema mostrará junto al Profit, los siguientes indicadores calculados para cada
iteración de cada escenario:
Profit Factor y número de operaciones acertadas y fallidas.
Mostrará -1 en el caso de producirse algún error en los cálculos
Probador José Carlos Cano
Tabla 42 Caso de prueba 028
CP-028 Convertir las constantes que definen el Stop Loss y Take Profit en
parámetros
Usuario Cliente
Historia de
Usuario STO023
136
Prerrequisitos El fichero de configuración general config.cfg y el fichero de datos históricos existen en
el directorio de la aplicación
Descripción
Introducir en los archivos de configuración de los escenarios, en la sección
technicalIndicators, un nuevo indicador de nombre KTE y añadir “TakeProfit” y
“StopLoss” como nombres de indicadores, indicando en parameterValue y
parameterValueRange los valores que pueden adoptar.
Ejecutar la aplicación
Resultado
esperado
El sistema debe tratar este nuevo indicador ficticio como uno más y almacenar en las
estructuras en memoria la lista de valores que pueden adoptar.
Probador José Carlos Cano
7.2 Despliegue
Esta aplicación está orientada a entornos científicos y sistemas de
supercomputación. Con objeto de obtener una versión ejecutable que
aproveche el potencial del hardware en producción, es muy recomendable la
compilación en el mismo entorno, o en uno similar. Por tanto, su despliegue
será manual, efectuado por personal técnico del cliente, y no requiere por tanto
de herramientas específicas.
En el Anexo II (Manual de Instalación), figura un apartado que explica
cómo copiar una versión ejecutable de prueba en los diferentes entornos y
también cómo crear una nueva versión compilada, tanto del programa
desarrollado en este TFG, como de la librerías que utiliza.
137
8 Conclusiones
8.1 Objetivos alcanzados
Podemos concluir que hemos conseguido desarrollar un software de
backtesting, que ejecuta estrategias de trading sobre un conjunto de datos de
prueba, que en realidad son datos históricos de precios. Estos datos
inicialmente los incorporábamos desde un fichero de texto, pero hemos
ampliado el alcance permitiendo también el acceso a una base de datos
MySQL.
De cara a la simulación, creemos que la aportación principal de nuestro
software ha sido la libertad que ofrecemos al cliente de definir sus propios
escenarios, con reglas de decisión que se basan en operaciones con
indicadores técnicos con parámetros variables. Esta variabilidad hace que se
puedan probar en una sola ejecución todos los escenarios que resultan de la
combinatoria de los posibles valores que toman estos parámetros,
consiguiendo así un optimizador de estrategias.
Sumamos a esto su carácter desatendido, donde únicamente debemos
proporcionar como entrada ficheros de texto que guiarán el resto del proceso,
obteniendo como salida archivos con los resultados. De esta manera, y
dependiendo de la complejidad y del número de escenarios a simular, es
perfectamente posible ejecutar la optimización en ordenadores de alto
rendimiento.
Tabla 43 Objetivos alcanzados
OG1 Objetivo General 1: Desarrollo de una aplicación eficiente
OE1Objetivos Específico 1: Desarrollo de un programa scriptable, mediante archivos de configuración,
para el funcionamiento en supercomputadoras
OE2 Objetivos Específico 2: Lenguaje de programación eficiente en términos de velocidad y memoria
OG2 Objetivo General 2: Desarrollo de una herramienta de análisis visual de operaciones en los mercados
OE3 Objetivos Específico 3: Lectura de datos históricos
OE4 Objetivos Específico 4: Representación gráfica de datos históricos e indicadores técnicos
OG3 Objetivo General 3: Desarrollo de una herramienta de backtesting
OE5 Objetivo Específico 5: Cálculo de indicadores técnicos sobre un conjunto de datos históricos
OE6Objetivo Específico 6: Decisión acerca del momento de realizar una operación en el mercado y de
finalizar la misma
OE7Objetivo Específico 7: Calcular el beneficio neto del conjunto de operaciones que se produzcan en
el periodo de tiempo que se ha extraído de los históricos
OE8 Objetivo Específico 8: Elaborar un informe con datos estadísticos sobre las operaciones realizadas
138
8.2 Conclusiones del trabajo y personales
El backtesting es una parte de un objetivo más ambicioso: los sistemas
automáticos de trading, donde un ordenador, además de decidir las
operaciones de entrada y salida de un mercado, las ejecuta tal y como lo haría
un trader.
Dado lo crítico que es confiar nuestro dinero a las decisiones de un
ordenador, el backtesting se convierte en una herramienta primordial y,
personalmente, me siento satisfecho de haber participado en este área a través
de este proyecto. Hemos invertido tiempo en investigación y documentación
sobre estrategias de trading, porque considero que no es posible el desarrollo
de un software de calidad sin conocer al menos las bases de lo que se quiere
implementar. De esta manera, el diálogo con el cliente es más fácil y permite
enfocar mejor las tareas de desarrollo.
También considero enriquecedor el haber trabajado con la metodología
SCRUM. Ciertamente el carácter iterativo del desarrollo ofrece múltiples
ventajas en proyectos en los que no sabemos con exactitud las
especificaciones finales. Soy de la opinión de que esta manera de conducir un
proyecto ofrece al cliente lo que realmente necesita porque, en realidad, te lo
va indicando en cada planificación de cada sprint.
En lo relativo a la tecnología, me ha sorprendido positivamente la librería
matplotlib. La calidad y la variedad de las imágenes que ofrece está a la altura
de mucho software comercial. La posibilidad de generar un gráfico enviando
sentencias como cadenas de texto que generas en tu código ofrece una
potencia que no hemos querido desaprovechar.
8.3 Vías futuras
Si bien quedaban fuera del alcance de este proyecto, hemos podido
identificar algunas líneas de trabajo que contribuirían a enriquecer y mejorar la
aplicación “trading”:
Incluir el cálculo de más ratios para medir la bondad de los
sistemas de trading que se han simulado
Se podrían añadir pruebas estadísticas avanzadas, como el
análisis de Montecarlo o el estadístico t de student, para analizar
el riesgo potencial de nuestro sistema, con un determinado % de
confianza
139
Para afinar el cálculo del beneficio de un sistema, habría que
tener en cuenta el Slippage (diferencia entre el precio previsto de
una transacción y el precio en el que la transacción tiene lugar,
especialmente en momentos de gran volatilidad) y las comisiones.
En un sistema que arroja buenos resultados a través de
innumerables operaciones con unos beneficios muy reducidos por
operación, si tuviéramos en cuenta el Slippage y las comisiones
derivadas de la operativa, probablemente las ganancias del
sistema no sólo se reducirían, sino que podrían incluso
convertirse en pérdidas. La solución para cubrir estos factores
sería incluir en la definición de los escenarios una fórmula que
defina un valor a restar al cálculo de la rentabilidad
Es conocido que, aunque una estrategia de trading pueda resultar
válida en un conjunto de datos, pudiera mostrarse desfavorable
en otro. Podríamos modificar el programa para que, una vez
seleccionados los n mejores escenarios, se prueben sobre un
segundo conjunto de datos históricos, diferente del inicial
De cara a la integración con otras herramientas, se podría liberar
una versión como librería, de manera que pudiera recibir
parámetros de entrada y devolviera los resultados como una
estructura en memoria, evitando en este caso el uso de ficheros
Revisar el código C de cara a la utilización de GPU y
procesamiento paralelo
Complementar la simulación por iteración con otros métodos de
inteligencia artificial, como las redes neuronales y los algoritmos
genéticos
141
9 Bibliografía
[1] Holland , Marcus (2013), “Issues related to Back Testing”,
http://www.financialtrading.com/issues-related-to-back-testing/
[2] Pichler, Roman (2010) Agile Product Management with SCRUM : Creating
products that customers love
[3] Rubin , Kenneth S. (2013) Essential SCRUM: A practical Guide to the
most popular Agile Process
[4] Murphy , John .J (1999) Análisis técnico de los mercados financieros
pag.49
[5] Murphy , John .J (1999) Análisis técnico de los mercados financieros
pag.27
[6] Murphy , John .J (1999) Análisis técnico de los mercados financieros
caps. 3,8,11,12
[7] Cagigas, Oscar (2012), Pruebas para confirmar la validez de los sistemas
de trading, recuperado de http://www.rankia.com/blog/oscar-
cagigas/1341589-pruebas-para-confirmar-validez-sistemas-trading
[8] Mateu Gordon, José Luis y Palomo Zurdo, Ricardo Javier Recogido de
http://www.expansion.com/diccionario-economico/mercado-financiero.html
[9] Mercados financieros, recogido de
http://www.enciclopediafinanciera.com/sistemafinanciero/mercadosfinanci
eros.htm
[10] Pressman , Roger S (2002) Ingeniería del Software: Un enfoque práctico
Págs 20-21
[11] Manifiesto por el Desarrollo Ágil de Software
http://agilemanifesto.org/iso/es/
[12] Beck, Kent (1999) Extreme Programming Explained: Embrace Change
[13] The Rules of Extreme Programming, recuperado de
http://www.extremeprogramming.org/rules.html
[14] Programación extrema, recuperado de
http://es.wikipedia.org/wiki/Programaci%C3%B3n_extrema
[15] SCRUM Alliance, https://www.scrumalliance.org/
142
[16] Sutherland, Jeff y Schwaber , Ken (2013) La Guía de ScrumTM (2013)
Disponible en http://www.scrumguides.org/ Páginas 4 a 13
[17] Rational Unified Process. Accesible en
https://www.ibm.com/developerworks/rational/
[18] Kanba https://kanbanflow.com/
[19] Kniberg, Henrik (2011) Lean from the Trenches: Managing Large-Scale
Projects with Kanban
[20] Garzás, Javier (2014) Gestión de proyectos ágil. Capítulo 5.6
[21] Web site de Javier Garzas http://www.javiergarzas.com/
[22] Web Site de Cygwin https://www.cygwin.com/
[23] Cygwin, recuperado de http://es.wikipedia.org/wiki/Cygwin
[24] Web Site de VMWare http://www.vmware.com/
[25] VMWare, recuperado de http://es.wikipedia.org/wiki/VMware
[26] Web Site de Eclipse https://eclipse.org/
[27] Eclipse, recuperado de http://es.wikipedia.org/wiki/Eclipse_software
[28] Web Site de subversión https://subversion.apache.org/
[29] Subversion, recuperado de
http://es.wikipedia.org/wiki/Subversion_software
[30] Web Site de Subversive http://eclipse.org/subversive/
[31] Programas para control de versiones. Recuperado de
http://es.wikipedia.org/wiki/Programas_para_control_de_versiones
[32] Web Site de Python https://www.python.org/
[33] Python, recuperado de http://es.wikipedia.org/wiki/Python
[34] Web Site de matplotlib http://matplotlib.org/
[35] Matplotlib, recuperado de http://es.wikipedia.org/wiki/Matplotlib
[36] Web Site de libconfig http://www.hyperrealm.com/libconfig/
[37] Web site de TA-Lib: Technical Analysis Library http://ta-lib.org/
[38] Web Site de Quantmod http://www.quantmod.com/
143
[39] Web Site del proyecto R http://www.r-project.org/
[40] Top Agile and SCRUM tools: http://agilescout.com/best-agile-scrum-tools/ [41] Web Site de kunai http://kunagi.org/
[42] Web Site de Apache Tomcat http://tomcat.apache.org/
145
10 Anexo I Diseño de la aplicación
Los requerimientos de funcionalidad marcados por el cliente han sido:
Prioridad en la velocidad de ejecución
Enfocado a entornos sin interface gráfica de usuario
Todo debe ser configurable, desde los datos de entrada hasta la
definición de los escenarios
Entrada y salida mediantes archivos de texto
Estos requisitos han guiado el diseño de la arquitectura de la aplicación,
destacando los siguientes aspectos:
Gestión dinámica de memoria: no sabemos a priori el volumen de
información a manejar
Uso de archivos de configuración que admitan secciones y
permitan definir listas
Creación dinámica de gráficos: vendrán definidos en los archivos
de configuración
Analizador sintáctico de fórmulas: el cliente quiere crear sus
propios escenarios
10.1 Gestión de memoria
10.1.1 Datos históricos
Los datos históricos se almacenan en la siguiente estructura en C:
typedef struct HistData {
/* NUMBER OF COLUMNS: number of input data fiedls + indicators + 1 for buy/sell operations */ unsigned int nbColumns;
/* NUMBER OF ROWS: number of elements in the arrays */
unsigned int nbData; unsigned int intervalSize; const char* intervalType; char** operationDate; char** operationTime; float** data; } HistData;
Los campos operationDate, operationTime y data definen una matriz que
podemos representar visualmente de la siguiente manera:
146
Cada vez que leemos un nuevo dato desde el archivo de entrada, o
desde la base de datos:
Incrementamos en 1 unidad el campo nbData
Hacemos un realloc de operationDate, operationTime y data, con
el tamaño actual + 1
Todas las funciones encargadas de operaciones con memoria se
encuentran definidas en memory.h
Tabla 44 Código para redimensionar arrays de float y char
Redimensionar array de float Redimensionar array de textos de tamaño
stringLength
int resizeArray(float** finalArray, int newsize) { float* tempArray = NULL; tempArray = (float*) realloc(*finalArray, newsize * sizeof(float)); if (tempArray!=NULL) { *finalArray = tempArray; return 1;//Success } else { free(finalArray); printf("Error allocating memory"); return 0; //Fails } }
int resizeTextArray(char ***finalTextArray, int newsize, int individualSize, int stringLenght) { char **tempTextArray = (char**) realloc(*finalTextArray, newsize * individualSize); if (tempTextArray!=NULL) { tempTextArray[newsize – 1]=(char*) malloc(stringLenght * sizeof(char*)); if (tempTextArray[ newsize - 1] != NULL) { *finalTextArray = tempTextArray; return 1; //success } } else { free(finalTextArray); printf("Error allocating memory"); } return 0; //Fails }
De esta forma añadimos una nueva línea.
10.1.2 Nuevos indicadores
Pero si, además, queremos añadir una columna para almacenar el
resultado del cálculo de un nuevo indicador técnico, hacemos un realloc de la
tabla completa con el nuevo número de columnas:
Figura 74 Matriz de almacenamiento de datos
147
dataTable->data = (float**)realloc(dataTable->data, (fileFormatTable->nbNumeric + technicalIndicators.nbNumeric + 1 ) *
sizeof(float*)); if (dataTable->data == NULL) { return RET_MEMORY_MANAGEMENT_ERROR; } for (i = fileFormatTable->nbNumeric;
i < (fileFormatTable->nbNumeric + technicalIndicators.nbNumeric + 1 ); i++)
{ dataTable->data[i] = (float*)malloc(1 * sizeof(float));
}
Consiguiendo así el nuevo espacio:
Nunca destruimos o eliminamos columnas. Si en el próximo escenario
se usan menos indicadores, ese espacio queda en desuso pero disponible para
próximos escenarios donde puedan haber más indicadores. De este manera no
desfragmentamos memoria.
Vemos en la siguiente figura cómo la estructura de datos (que
representa una matriz bidimensional), crece inicialmente con la incorporación
de los datos históricos y, durante el proceso de cálculos, cada vez que
necesitamos espacio para un nuevo indicador.
Figura 75 Espacio para un nuevo indicador
Figura 76 Crecimiento bidimensional de la tabla de datos
148
10.1.3 Datos de configuración y control del proceso
Con este mismo diseño, disponemos de estructuras donde
almacenamos la información que nos viene de los archivos de configuración y
de los escenarios. Mostramos a continuación las más relevantes:
Form
ato
de
l
fichero
de e
ntr
ad
a typedef struct FileFormat
{ unsigned int nbData; /* number of elements in the arrays */ unsigned int nbNumeric; /* number of numeric columns */ char** fieldName; /* char(20) */ char** fieldFormat; /* char(2) */ float* fieldIndex; /* float */ } FileFormat;
Form
ato
de
l grá
fico
typedef struct GraphFormat { unsigned int nbData; /* number of elements in the arrays */ unsigned int nbWindows; /* number of windows in the chart */ unsigned int width; /* image width */ unsigned int height; /* image height */ unsigned int fontSize;/* image height */ char** variableName; /* char(20) */ char** chartWindow; /* char(1) */ char** chartType; /* char(20) */ char** variableLabel; /* char(20) */ char** variableColor; /* char(20) */ int* chartWindowLevel2; float* variableIndex; /* Index in HistData */ } GraphFormat;
Form
ato
de las
venta
nas d
el grá
fico
typedef struct GraphWindows { int* relativeSize; /* % height of window */ char** axisLabelTitle; /* char(20) */ int* showGrid; int* showXlabels; int* pruneYlabels; } GraphWindows;
149
Lis
ta d
e ind
icdore
s y
sus p
ará
metr
os
typedef struct ParametersList { char* parameterName; /* char(20) */ unsigned int nbValues; /* Number of possible values for the parameter in the case of values list */ char** parameterValueList; /* char(20) (for input parameters) several values possible (but only one for output) */ float* inputParameterIndex; /* float (for input parameters). Each value has an index. Index of existing variable in table of data. */ float parameterIndex; /* float (for output parameters).Index of existing variable in table of data. */ char* parameterDirection; /* char(1) */ char* parameterFormat; /* char(2) */ float parameterRangeFrom; /* float (for input parameters). For loops. */ float parameterRangeTo; /* float (for input parameters). For loops. */ float parameterRangeStep; /* float (for input parameters). For loops. */ unsigned int nbSteps; /* Number of steps in the case of RangeFrom RangeTo RangeStep loop */ unsigned int parameterID; /* Unique ID used in the loop recursive algorithm */ } ParametersList; typedef struct IndicatorsList { unsigned int nbData; /* number of elements in the arrays */ unsigned int nbNumeric; /* number of numeric output parameters -> results will be saved in datatable */ unsigned int nbAll; /* number of all parameters */ char** indicatorName; /* char(20) */ char** functionName; /* char(20) */ float* nbParameters; /* number of params for each indicator */ ParametersList **parList; /* parameters for each indicator */ } IndicatorsList;
150
Regis
tro e
n m
em
oria
de
l re
sultad
o d
e c
ada
escenari
o,
el va
lor
de los p
ará
metr
os u
sados y
el h
istó
rico d
e o
pera
cio
nes d
e
entr
ad
a y
salid
a d
el m
erc
ado
typedef struct operationsHist { unsigned int operationTime; /* index in the big matrix */ unsigned int exitTime; /* index in the big matrix */ int closeReason; /* 0: rules 1: SL 2: TP */ int operationStatus; /* 0:open / 1:closed */ int operationType; /* 1:buy / 2:sell */ float operationVolume; /* Quantitative information regarding the operation */ float operationPrice; /* operation price */ float exitPrice; /* closure price */ float StopLoss; /* Stop Loss price */ float takeProfit; /* Take Profit price */ float profit; /* result of the operation */ float balance; /* current balance */ } operationsHist;
//------------------------------------------------------------------------------//Matrix to store the different parameter values in each execution loop together //with the result //------------------------------------------------------------------------------typedef struct histLoopParameterValues { unsigned int nbData; /* number of loops executed --> number of records */ parameterCurrentValues **loopHist; operationsHist **loopOperations; char** scenarioName; float* loopValues; /* number of parameterCurrentValues for each loop */ float* loopOperationValues; /* number of buy/sell operations for each loop */ float* loopResult; /* profit of the simulation, used to compare how good the scenario is */ float* loopDrawDown; /* profit of the simulation, used to compare how good the scenario is */ float* loopProfitFactor; /* profit of the simulation, used to compare how good the scenario is */ float* loopSharpe; /* profit of the simulation, used to compare how good the scenario is */ float* loopNofTrades; /* profit of the simulation, used to compare how good the scenario is */ float* loopRecFactor; /* profit of the simulation, used to compare how good the scenario is */ char** loopStartTime; char** loopEndTime; float* loopDuration; float* loopRetCode; float* loopOrder; /* Based on loopResult, indicates the sorted order */ } histLoopParameterValues;
151
10.2 Proceso
Una vez tenemos en memoria toda la información, el bucle de ejecución
consiste en un recorrido por los archivos de escenarios que se encuentran en
el directorio de la aplicación. En la siguiente imagen se recogen las 5 etapas
que lo componen:
Es en el paso 4 donde se identifican y deciden las operaciones de
entrada y salida del mercado, en función del valor que nos devuelven las
fórmulas de posición alcista/bajista o de alcance del umbral del Stop Loss /
Take Profit.
Figura 77 Bucle principal de la aplicación
152
10.3 Módulos
El software está compuesto por los siguientes módulos:
main:
o Lee los parámetros generales informados en config.cfg
(configuración general de la aplicación)
o Abre el archivo LOG en caso de ser necesario
o Lee el archivo functions.cfg
o Lee la estructura del fichero de entrada informado en
config.cfg
o Llama a la lectura de los datos históricos, bien desde un
archivo, o desde una base de datos MySQL
o Busca los archivos scenario___.cfg y efectúa una llamada
a la ejecución del escenario para cada uno de ellos
o Ordena todos los escenarios para mostrar los de mejor
resultado
o Libera memoria y cierra el programa
scripts:
o Lee la definición de constantes del fichero del escenario
o Lee los indicadores técnicos a usar del fichero del
escenario
o Lee las fórmulas que definen el algoritmo de trading
o Lee la definición de los gráficos
o Redimensiona la matriz de datos para poder acoger a
todos los indicadores especificados
o Llama al proceso de simulación
o Ejecuta una ordenación para mostrar los escenarios
ordenados de mayor a menor profit
o Genera un gráfico, un log de operaciones y un archivo csv
en el caso de que se solicitase para n escenarios
filesystem:
o Contiene las funciones de acceso a disco: crear archivos,
borrar archivos, escribir en archivos
153
o Contiene las funciones que leen los datos que vienen en
los archivos de configuración (mediante llamadas a
libconfig)
o Contiene las funciones que leen datos de archivos csv
o Contiene las funciones que leen los datos del archivo de
datos históricos desde MySQL
trading:
o Ejecuta la simulación
o Almacena durante el proceso los valores de los parámetros
usados, y el resultado obtenido con cada uno de ellos
o Genera un gráfico, un log de operaciones y un archivo csv
en el caso de que se solicite para todos los escenarios
parse:
o Ejecuta el análisis sintáctico de las fórmulas
o Sustituye las variables por los valores que tienen en cada
momento y calcula el resultado de las fórmulas
graph:
o Contiene la creación de sentencias para llamar a matplotlib
utils:
o Contiene el algoritmo de ordenación por el método de la
burbuja
o Contiene funciones de validación de tipos de datos, de
máximos y mínimos, y para concatenar cadenas de texto
o Contiene funciones que crean la información para el LOG
sobre los escenarios, en formato tabular
error:
o Contiene la función que relaciona un número de error con
su descripción
memory:
o Contiene las funciones que redimensionan arrays en
memoria
El proceso completo de trading, con las llamadas a los distintos módulos
está descrito en la siguiente imagen:
155
11 Anexo II Manual de Usuario
La aplicación “Trading” se ha diseñada para ejecutarse como un
proceso, sin interfaz de usuario, dando prioridad a la velocidad de ejecución.
Por tanto, tanto la entrada de datos como la salida se hacen a través de
ficheros de texto, con una determinada sintaxis que se describe en este
capítulo.
11.1 Introducción
En la siguiente imagen observamos los procesos implicados durante la
ejecución del software:
1. Partiendo de un conjunto de datos históricos (de un archivo csv o
de una base datos), se seleccionan las columnas que hayamos
especificado en un archivo de configuración.
2. Partiendo de estos datos, podemos realizar una selección
filtrando por fecha para quedarnos con el período de estudio que
interese.
Figura 79 Esquema general aplicación “Trading”
156
3. Sobre el conjunto de datos final se realizarán las estrategias de
trading que se describen en los archivos de configuración de
escenarios. Cada escenario trabaja usando indicadores técnicos
cuyos parámetros de cálculo pueden adoptar múltiples valores,
con lo que cada ejecución supone, en realidad, varias iteraciones.
4. Los resultados de cada escenario son almacenados, de manera
que se ofrece una lista ordenada en función de cualquier ratio
disponible
5. Se genera un LOG de ejecución, gráficos configurables y
documentos con las operaciones de entrada/salida del mercado
11.2 Preparando la ejecución
El control de la ejecución de la aplicación la gestiona un fichero de
configuración general. En este fichero se informa, por ejemplo, de la fuente de
los datos históricos sobre los que se realizará el backtesting de las estrategias
de trading.
A continuación podemos ver en detalle la información contenida en dicho
archivo:
Figura 80 Configuración general de la aplicación
157
Tabla 45 Parámetros aplicables en la configuración general
Parámetro
Descripción Ejemplo
logFile Nombre del fichero donde se almacenará
información sobre el proceso de ejecución:
tiempos consumidos, resultados obtenidos y
errores
logFile = "LOG.txt";
Si no se informa nombre de fichero, no se
generará el log
logFile = "";
outputFolder Directorio, a partir del directorio de la
aplicación, donde se generarán los gráficos y
el resto de outputs
outputFolder = "output";
outputGraphMode Especifica qué gráficos en formato png se
generarán. Puede tomar los siguientes
valores:
-1: no genera ningún gráfico
0: genera un gráficos para cada iteración
n: genera los gráficos de los n mejores
escenarios
outputGraphMode= -1;
outputCSVMode Especifica qué ficheros de datos en formato
csv (históricos e indicadores) se generarán.
Puede tomar los siguientes valores:
-1: no genera ningún archivo
0: genera un archivo para cada iteración
n: genera los archivos de los n mejores
escenarios
outputOpBookMode= -1;
outputOpBookMode Especifica qué ficheros de log de operaciones
de compra/venta se generarán en formato txt.
Puede tomar los siguientes valores:
-1: no genera ningún archivo
0: genera un archivo para cada iteración
n: genera los archivos de los n mejores
escenarios
En caso de seleccionar -1, tampoco se
mostrará información de las operaciones en
el archivo de LOG ni por consola
outputOpBookMode= -1;
maxRunningTime Especifica el número de segundos máximo de
ejecución del programa.
0 indica que no hay límite
maxRunningTime = 0;
maxLoopsNumber Especifica el número máximo de iteraciones
que ejecutará el programa
0 indica que no hay límite
maxLoopsNumber = 80;
maxNumData Especifica el número máximo de datos que se
leerán de un archivo o de una base de datos
0 indica que no hay límite
maxNumData = 0;
inputDataFile Especifica el nombre del fichero csv que
contiene los datos históricos
El fichero debe situarse en el directorio de la
aplicación
Si se informa en blanco, no se leerá ningún
archivo, y se deberá informar la base de
datos desde la que importar la información
histórica
inputDataFile= "EURUSD5.csv";
158
filterByColumn Este parámetro indica si se filtrará por alguna
columna (en el caso de haberse informado el
dato inputDataFile,)
-1 indica que no habrá filtros
filterByColumn = 1
filterFrom Si filterByColumn no es -1 y se ha informado
inputDataFile, este parámetro contiene el
valor “desde”
filterFrom = "2013.02.18";
filterTo Si filterByColumn no es -1 y se ha informado
inputDataFile, este parámetro contiene el
valor “hasta”
filterTo = "2013.02.19";
inputSQLServer Especifica el nombre del servidor MySQL inputSQLServer="192.168.1.34";
inputSQLDatabase Especifica la base de datos que contiene los
datos históricos
inputSQLDatabase = "trading";
inputSQLUser Especifica el usuario que tiene permisos para
ejecutar la consulta
inputSQLUser = "test";
inputSQLPassword Especifica la clave del usuario que tiene
permisos para ejecutar la consulta
inputSQLPassword = "test";
inputSQLQuery Consulta a ejecutar contra la base de datos select […] from
trading.indice_data where […]
columnsInDataFile Especifica las columnas de datos (nombre y
formato) que se esperan recibir en el fichero
csv o en la consulta contra la base de datos
El formato puede tomar estos valores:
d: fecha (date)
t: hora (time)
f: numérico (float)
columnsInDataFile = (
{columnName = "operationDate";
columnFormat="d" },
{columnName = "operationTime";
columnFormat="t" },
{columnName = "openPrice";
columnFormat="f" },
{columnName = "highPrice";
columnFormat="f" },
{columnName = "lowPrice";
columnFormat="f" },
{columnName = "closurePrice";
columnFormat="f" },
{columnName = "volume";
columnFormat="f" }
);
En la figura siguiente vemos un ejemplo del contenido de un archivo de
configuración típico:
159
Figura 81 Ejemplo de archivo de configuración general
A la hora de lanzar la aplicación, podemos añadir un argumento con el
nombre que hayamos dado al archivo de configuración. En caso de no añadir
este argumento, el programa usará el valor por defecto “config.cfg”.
El archivo de configuración debe estar localizado en el directorio de la
aplicación. En caso de no encontrarse, se informará del error.
11.3 Indicadores técnicos
La aplicación “trading” hace uso de la librería TA-Lib, que ofrece el
cálculo de hasta 200 indicadores técnicos y un interface para aplicaciones
desarrolladas en C/C++ y Java. Este interface, y toda la lista de funciones con
sus parámetros, pueden encontrarse en el archivo de cabecera ta_func.h, en el
directorio de instalación de TA-Lib.
Dado el gran número de indicadores disponibles, y con objeto de facilitar
su lectura, hemos creado un archivo donde recogeremos sólo los indicadores
que podremos usar en nuestra aplicación. Posteriormente, durante la
ejecución, se mapearán las llamadas a los indicadores contra las definiciones
incluidas en este archivo, cuyo nombre debe ser obligatoriamente
“functions.cfg”.
160
El contenido de este archivo tiene como raíz un parámetro functions
que contiene una lista de indicadores y sus parámetros, como se describe a
continuación:
Tabla 46 Parámetros aplicable a la lista de indicadores
Parámetro
Descripción Ejemplo
functionName Es el nombre de indicador técnico en
TALib
functionName = "MACD";
functionParameters Es, a su vez, una lista de elementos,
que serán los parámetros de llamada a
la función, con los siguientes campos:
Name, o nombre del parámetro functionParameters = (
{Name="startIdx";
Direction="i";
Type="i";
Optional=0;},
{Name="endIdx";
Direction="i";
Type="i";
Optional=0;},
…);
Direction, que puede tomar los
valores:
i: (input) parámetro de entrada
o: (output) parámetro de salida
Type, que puede tomar los valores:
i: (integer) un número entero
f (float) un número decimal
Mi: matriz de números enteros
Mf: matriz de números decimales
s: (string) un texto
Optional, que puede tomar los valores:
0: es obligatorio
1: es opcional
Podemos ver a continuación un ejemplo de archivo con dos indicadores:
Figura 82 Ejemplo de listado de indicadores
161
Para usar un nuevo indicador basta con incluirlo en este archivo,
copiando la definición que figura en la cabecera ta_func.h.
11.4 Definiendo los escenarios
El núcleo de esta aplicación radica en la ejecución de escenarios de
trading. Se pueden definir múltiples escenarios, cada uno de ellos descrito en
detalle en archivos de texto cuyos nombres tendrán la siguiente nomenclatura:
Por ejemplo, scenario1.cfg, scenario002.cfg, scenario1530.cfg
En estos archivos se reflejan los indicadores técnicos a utilizar en las
simulaciones, las reglas que determinan las entradas/salidas del mercado y el
tipo de gráficos que se generarán.
A continuación detallamos la información contenida en dichos archivos.
11.4.1 Indicadores técnicos
Debemos definir qué indicadores técnicos vamos a necesitar en cada
escenario. Estos indicadores los usaremos en nuestras fórmulas para decidir
los momentos alcistas y bajistas del mercado, y ayudarán a decidir los
momentos de entrada y salida. Se muestran a continuación los parámetros
necesarios para definirlos correctamente:
Tabla 47 Escenarios (1/5): indicadores técnicos
Parámetro
Descripción Ejemplo
scriptName Texto libre que describe el escenarios scriptName = "First";
technicalIndicators Lista que contendrá los indicadores
técnicos que son necesarios en este
escenario. Contiene los siguientes
campos:
indicatorName, texto libre que
describe el indicador
indicatorName = "MA90";
functionName, nombre de la función
en TA-Lib. Debe coincidir con algunos
de los parámetros functionName del
fichero functions.cfg
functionName = "MA";
indicatorParameters. Parámetros del
indicador. Contiene los siguientes
campos:
parameterName parameterName="startIdx";
162
parameterValue, indica un valor, o
una lista de valores separados por
comas
parameterValueRange, indica un
rango de valores, que se forman
usando el primer valor como
“desde”, el segundo como “hasta”
y el tercero como el “salto”
parameterValue=("26");
parameterValueRange=("2","3","1");
parameterDirection, que puede
tomar los valores:
i: (input) parámetro de entrada
o: (output) parámetro de salida
parameterDirection="i";
ParameterFormat que puede
tomar los valores:
i: (integer) un número entero
f (float) un número decimal
Mi: matriz de números enteros
Mf: matriz de números
decimales
s: (string) un texto
ParameterFormat="i";}
Es posible crear variables que, sin ser parámetros de indicadores
técnicos, adopten la ventaja de poder tomar valores múltiples. Para ello se
puede incluir un indicador con functionName = “KTE”, y se le añaden las
variables que necesitemos como parámetros de tipo “i” (input-entrada). A partir
de entonces ya podremos usar estas variables en nuestras fórmulas.
Vemos en esta imagen un ejemplo de definición de indicadores técnicos
para un escenario.
Figura 83 Escenarios (1/5): indicadores técnicos
Observamos el uso del indicador “KTE” para crear una variable
TakeProfit y otra StopLoss, adoptando éstas múltiples valores.
163
11.4.2 Gráficos
Definimos la configuración de los gráficos que se podrán generar
asociados a cada escenario. Podemos especificar las variables a representar
(correspondientes a un dato de entrada o a un valor calculado de un indicador)
y la apariencia del gráfico. Los parámetros necesarios son los siguientes:
Tabla 48 Escenarios (2/5): definición de gráficos
Parámetro
Descripción Ejemplo
graphicWidth Ancho en pixels del gráfico a generar graphicWidth = 1900;
graphicHeight Alto en pixels del gráfico a generar graphicHeight = 900;
graphicFontSize Tamaño de letra en el gráfico (para los
ejes, etiquetas, números)
graphicFontSize = 12;
graphicNbWindows Número de ventanas que compondrá el
gráfico que se genere
graphicNbWindows = 3;
graphicWindows Lista que contendrá el formato de cada
una de las ventanas que componen el
gráfico. Contiene los siguientes
campos:
Size Valor de 1 a 10 que indica el
tamaño relativo de la ventana. La suma
de los campos size de todas la
ventanas debe sumar 10, en caso
contrario se obtiene un error.
size=2;
AxisLabelTitle Título del eje Y de cada
ventana
AxisLabelTitle = "Test one ";
showGrid Indica si se debe mostrar la
cuadrícula en el gráfico
showGrid="true";
showXlabels Indica si se deben o no
mostrar los valores del eje X
showXlabels="false";
pruneYlabels Indica si se deben omitir
las etiquetas del eje X que solapan con
las de la ventana anexa
pruneYlabels="true"}
Figura 84 Especificación de los indicadores técnicos
164
graphicData Lista que contendrá los datos
(variables) que se mostrarán en el
gráfico. Contiene los siguientes
campos:
variableName Nombre del dato a
representar. Debe corresponder con un
nombre de campo del fichero de
entrada, o con un parámetro de salida
de un indicador técnico
variableName = "openPrice";
Window Número de la ventana donde
se mostrará la variable (la primera
ventana toma el valor 0, y es la que
muestra en la parte superior del gráfico)
window="1";
type Tipo de gráfico. Puede tomar
estos valores:
cO: precio de apertura en gráfico de
velas
cH: precio más alto en gráfico de velas
cL: precio más bajo en gráfico de velas
cC: precio de cierre en gráfico de velas
l: gráfico de línea
b: gráfico de barra
a: gráfico de área
type="b";
Label Etiqueta asociada a la variable label = "Volume";
color Color para la variable. Se puede
especificar de dos formas:
Usando el formato #aabbcc (con aa,
bb y cc números hexadecimales)
Usando un nombre de la lista
disponible en el apartado 13 de esta
memoria
color= "forestgreen"}
Vemos en esta imagen un ejemplo de definición de los gráficos
asociados a un escenario.
Figura 85 Escenarios (2/5): definición de gráficos
165
Observamos cómo la definición contenida en la sección de gráficos del
archivo de escenarios guía la búsqueda de información en el conjunto de datos
y genera un archivo csv que sirve de base para crear el gráfico:
11.4.3 Constantes
Podemos crear un número ilimitado de constantes que usaremos
posteriormente en las fórmulas, simplificando así la lectura de las mismas:
Tabla 49 Escenarios (3/5): definición de constantes
Parámetro
Descripción Ejemplo
constants Lista que contendrá constantes con un
valor que se podrán referenciar en las
fórmulas de cálculo de operaciones de
trading. Contiene los siguientes campos:
Name Nombre de la constante name = "factor";
Value Valor de la constante (debe ser
un valor float)
value=0.00001 }
Figura 87 Escenarios (3/5): definición de constantes
Hay cuatro constantes que se deben definir obligatoriamente:
Figura 86 Proceso de creación de un gráfico
166
Lots: Define el tamaño del lote (por ejemplo, 0.1)
LotsSize: Define el valor al que corresponde cada lote (por
ejemplo, un valor típico en operaciones FOREX podría ser
100000)
CloseOrders, indica si se puede cerrar una orden con tan sólo un
cambio de tendencia en el mercado:
o Un valor 0.0 (equivalente a false) indica que habrá que
esperar a una condición de StopLoss o TakeProfit para
cerrar las operaciones abiertas
o Un valor de 1.0 (equivalente a True) indica que se cerrarán
las operaciones abiertas al encontrar un cambio de
tendencia
Use_Closing_SL_TP:
o Un valor de 0.0 (equivalente a False) indica que el precio
que se usará como el de cierre de la operación será el
valor del precio de apertura de la vela del período en que
nos encontramos
o Un valor de 1.0 (equivalente a True) indica que el precio
que se usará como el de cierre de la operación será el
valor del Stop Loss o Take Profit, según el caso
11.4.4 Operaciones
Definimos las condiciones y fórmulas relacionadas con la identificación
de un momento alcista o bajista del mercado y las operaciones de entrada y
salida usando los siguientes parámetros:
Tabla 50 Escenarios (4/5): operaciones de trading
Parámetro
Descripción Ejemplo
buy Recoge toda la información relativa a
una operación alcista. Se compone de
los siguientes campos:
167
Condition Especifica la fórmula que,
de cumplirse, indica una situación
alcista del mercado. (ver siguiente
apartado para conocer más sobre el
uso de fórmulas)
condition = "(outmacd<0) & (outmacd >
outmacdsignal) &
(outmacd(1)<outmacdsignal(1)) & (
#outmacd > (3*factor)) &
(outma>outma(1))";
Formula Especifica la fórmula cuyo
resultado será el volumen invertido en
una operación “a largo”
formula="lots";
Stoploss Especifica una fórmula para
el Stop Loss
stoploss ="openprice-(StopLoss*factor)";
Takeprofit Especifica una fórmula
para el Tak Profit
takeprofit="openprice+(takeprofit*factor)";
Color Especifica un color para la
etiqueta que en el gráfico indica una
entrada en el mercado. Se puede
especificar de dos formas:
Usando el formato #aabbcc (con aa,
bb y cc números hexadecimales
Usando un nombre de la lista
disponible en el apartado 13 de esta
memoria
color="green"
sell Recoge toda la información relativa a
una operación bajista. Se compone de
los siguientes campos:
Condition Especifica la fórmula que,
de cumplirse, indica una situación
bajista del mercado. (ver siguiente
apartado para conocer más sobre las
fórmulas)
condition = "(outmacd>0) & (outmacd <
outmacdsignal) &
(outmacd(1)>outmacdsignal(1)) & (
outmacd > (3*factor)) &
(outma<outma(1))";
Formula Especifica la fórmula cuyo
resultado será el volumen invertido en
una operación “a corto”
formula="lots";
Stoploss Especifica una fórmula para
el Stop Loss
stoploss ="openprice+(StopLoss*factor)";
Takeprofit Especifica una fórmula
para el Tak Profit
takeprofit="openprice-
(TakeProfit*factor)";
Color Especifica un color para la
etiqueta que en el gráfico indica una
salida del mercado. Se puede
especificar de dos formas:
Usando el formato #aabbcc (con aa,
bb y cc números hexadecimales
Usando un nombre de la lista
disponible en el apartado 13
color="red"
Figura 88 Escenarios (4/5): operaciones de trading
168
11.4.5 Precios
Finalmente usaremos dos parámetros para especificar la variable que
contiene los precios de apertura y de cierre. Estos datos se usan habitualmente
como parámetro de entrada en el cálculo de los indicadores técnicos.
Tabla 51 Escenarios (5/5): asignación de precios
Parámetro
Descripción Ejemplo
openprice Variable que contiene el precio de
apertura
openprice = "openPrice";
closureprice Variable que contiene el precio de cierre closureprice = "openPrice";
En este último ejemplo, el programa de trading tomaría siempre como
valor del precio el de apertura de la vela (“openPrice”).
11.4.6 Uniéndolo todo
En la siguiente imagen se puede observar cómo el nombre de una
columna del archivo de datos (línea negra) declarada en config.cfg, se usa
posteriormente para calcular un indicador técnico declarado en un archivo de
escenarios, cuyo valor de salida (línea amarilla) se usa, a su vez, para
mostrarse en un gráfico o para ser parte de una fórmula que determina si el
mercado se encuentra en una situación alcista o bajista (declarada también en
un archivo de escenarios):
Figura 89 Ejemplo de relación entre variables
169
11.5 Escritura de fórmulas
Como hemos indicado en el apartado anterior, es posible especificar
fórmulas para calcular condiciones de entrada y salida del mercado, así como
el volumen de una operación, o el valor que tomarán las condiciones de Stop
Loss y Take Profit.
El analizador sintáctico incluido en el software admite las siguientes
operaciones:
Tabla 52 Operadores admitidos en fórmulas
+, -, *, / Operadores aritméticos
>, <, = Operadores lógicos
| OR
& AND
¡ NOT
# ABS
(, )
Tabla 53 Operandos admitidos en fórmulas
Números (enteros y float) Enteros y float
Nombres de variables:
parámetros de salida de indicadores técnicos
columnas del fichero (o base de datos) de entrada
constantes especificadas en los archivos de los
escenarios
Los nombre de las variables que hacen referencia a resultados del
cálculo de indicadores pueden llevar un índice, por ejemplo outmacd(n), para
hacer referencia a un dato de n períodos anteriores.
Por ejemplo, el bucle que realiza el backtesting de un juego de 200
datos, cuando evalúe la situación en el período 150, sustituirá la variable
outmacd por su valor en el momento 150. Sin embargo, cuando encuentre
outmacd(1) la sustituirá por su valor en el período 149, es decir, en el período
anterior. Cuando el período anterior se refiere a una fecha anterior a la inicial,
mantendrá el valor del período actual.
El analizador sintáctico desarrollado NO CONTEMPLA la precedencia
de operadores, por lo que cualquier orden en las operaciones que se quieran
ejecutar en primer lugar deberá ser especificado expresamente mediante el uso
de paréntesis.
170
Vemos a continuación algunos ejemplos de fórmulas válidas:
Tabla 54 Ejemplos de fórmulas
12+(34/28*2)
¡(4>2)
(precio*0.3)>(indicador-2)
Takeprofit>#variable
11.6 Ejecución
Para ejecutar la aplicación en Windows teclearemos:
trading [nombre_archivo_config]
Por ejemplo podríamos escribir trading myconfig.cfg para ejecutar
trading tomando como archivo de configuración myconfig.cfg
O podríamos escribir trading (sin argumentos) para ejecutar
tomando como entrada el archivo por defecto config.cfg
El contenido de myconfig.cfg o config.cfg debe ajustarse a lo descrito en
el apartado 11.1 de esta memoria.
Si el archivo de configuración especificado existe en el directorio de la
aplicación y contiene las secciones requeridas, comienza a buscar todos los
ficheros cuyos nombres son de la forma scenario____.cfg y procesa los
escenarios descritos en cada uno de ellos, mostrando por consola la operación
en curso:
Figura 90 Ejecución: información mostrada en la consola
171
y un resumen final con el tiempo total de ejecución y los mejores
escenarios ordenados por Profit:
Figura 91 Ejecución: resumen mostrado en la consola
A la vez crea varios ficheros, según se haya especificado así en el
archivo de configuración:
Parámetro en el fichero
de configuración
principal
Resultado Contenido
logFile=[nombre_de_archivo]
(no vacío)
Se crea el fichero [nombre_de_archivo].log
(en el directorio de la aplicación)
Informe sobre la
ejecución:
Tiempos de
ejecución
Etapas
completadas
Escenarios
completados
mejores
escenarios por
Profit
de los n mejores
escenarios
outputGraphMode = 0 Se crean los gráficos
[nombre_escenario]+[número_escenario].png
(en outputFolder)
Gráficos con la
información y
formato especificado
en el archivo del
escenario
de TODOS los
escenarios
outputGraphMode = n Se crean los gráficos
[nombre_escenario]+[número_escenario]+BEST+[orden].png
(en outputFolder)
Gráficos con la
información y
formato especificado
en el archivo del
escenario
outputCSVMode= 0 Se crean los ficheros
[nombre_escenario]+[número_escenario].csv
(en outputFolder)
Archivos CSV con:
información leída
del fichero de
datos históricos o
base de datos
valores
calculados de los
indicadores
de TODOS los
escenarios
172
Parámetro en el fichero
de configuración
principal
Resultado Contenido
outputCSVMode= n Se crean los ficheros
[nombre_escenario]+[número_escenario]+BEST+[orden].csv
(en outputFolder)
Archivos CSV con:
información leída
del fichero de
datos históricos o
base de datos
valores
calculados de los
indicadores
de los n mejores
escenarios
outputOpBookMode= 0 Se crean los ficheros
[nombre_escenario]+[número_escenario].txt
(en outputFolder)
Archivos txt con:
operaciones en
el mercado
(entradas y
salidas), con
fechas, precios y
profit
de TODOS los
escenarios
outputOpBookMode= n Se crean los ficheros
[nombre_escenario]+[número_escenario]+BEST+[orden].txt
(en outputFolder)
Archivos CSV con:
operaciones en
el mercado
(entradas y
salidas), con
fechas, precios y
profit
de los n mejores
escenarios
173
Vemos en las siguientes imágenes ejemplos de salidas del sistema.
Figura 92 Contenido del archivo LOG
Figura 93 Ficheros generados: gráficos y registro de operaciones
174
La información que figura en el archivo LOG referente a las operaciones
de entrada / salida del mercado sólo aparecerán en el caso de que el
parámetro outputOpBookMode no sea -1.
El proceso principal de “Trading” radica en la simulación de la realización
de operaciones de entrada/salida. El algoritmo usado es el siguiente:
Inicialmente se busca si se ha alcanzado el umbral de Stop Loss o Take
Profit, ejecutando en su caso la salida del mercado.
En caso contrario, se evalúan las fórmulas que determinan si nos
encontramos en mercado alcista o bajista y se toman decisiones.
En la siguiente imagen vemos en detalle el algoritmo encargado del
procesamiento del Stop Loss y el Take Profit:
Figura 94 Algoritmo de trading
175
11.7 Manejo de errores
Durante la ejecución se pueden producir errores. Normalmente, estos
errores se mostrarán por la consola y en el archivo LOG, y afectarán a la
iteración en curso, continuando con la ejecución del resto de escenarios. En
este caso, tanto en la consola como en el LOG, se podrá ver un mensaje
indicando que se han producido n errores.
Los errores más comunes son:
Errores de ejecución al asignar o reasignar memoria
Incongruencia o falta de información en los archivos de configuración
Formato incorrecto en los datos históricos
Fórmulas con errores
Error en las llamadas a la librería TA-Lib, generalmente por parámetros
incorrectos
Figura 95 Algoritmo para el procesamiento de SL y TP
177
12 Anexo III Manual de Instalación
El sistema operativo que se ha seleccionado para ejecutar en
producción la aplicación “Trading” es Linux (consultar “apartado 2.3.4 Selección
de la solución” en esta memoria para más detalles). Sin embargo, durante el
desarrollo de la misma se han seleccionado librerías y herramientas
disponibles tanto para Linux como para Microsoft Windows, de manera que sea
fácil preparar su ejecución en ambos entornos.
En esta sección de la memoria vamos a detallar los pasos a seguir para
instalar los componentes necesarios de la aplicación.
Para independizar la compilación del entorno de desarrollo
seleccionado, se proporciona un fichero MAKE estándar que asegura la
portabilidad.
Lo hemos dividido en dos secciones:
Instalación en Linux
Instalación en Windows
12.1 Instalación en Linux
12.1.1 Linux como máquina virtual sobre Windows (opcional)
En el caso de no disponer de un sistema ejecutando Linux, y se quiera
probar la aplicación, se puede preparar un entorno virtual donde instalar Linux
sobre un sistema operativo Windows. Evidentemente la velocidad de ejecución
será muy inferior a la que se conseguirá en un entorno real.
Para ello se puede seguir las siguientes acciones, que incluye la
instalación de VMWare, Ubuntu y el resto de componentes.
Accedemos a la página de descargas de VMWare:
https://my.vmware.com/web/vmware/downloads
178
Figura 96 Descargas del Web Site de VMWare
Buscamos el Player, según vemos en la siguiente imagen:
Figura 97 Enlace para descarga de VMWare Player
Para nuestro proyecto hemos usado la versión 4.0.2 por ser una versión
estable y de gran uso en el momento de inicio del trabajo.
Una vez hayamos descargado el instalador procedemos a su ejecución.
179
Figura 98 instalación de VMWare Player
Ahora ya podemos crear una máquina virtual Linux para lo que
necesitaremos una distribución, preferiblemente en formato .iso. Vamos a
mostrar un ejemplo de instalación de Ubuntu.
http://www.ubuntu.com/
180
Figura 99 Web Site de Ubuntu
En el momento de inicio de este TFG, la versión en uso es la 12.0.4.
Para descarga de versiones anteriores, podemos acceder directamente a la
página de releases, añadiendo la extensión que buscamos
http://releases.ubuntu.com/12.04/
Seleccionamos el formato iso y procedemos a su descarga a un
directorio local para usarlo después en la instalación de la máquina virtual:
Figura 100 Selección distribución Ubuntu iso
181
Ya podemos comenzar a crear la máquina virtual y para ello lanzamos
VMWare:
Figura 101 Creación de una máquina virtual
Introducimos el nombre que le daremos a la máquina virtual y el usuario
y contraseña de root
182
Figura 102 Credenciales de la máquina virtual
Elegimos ahora el directorio donde instalaremos los archivos de la
máquina virtual:
Figura 103 Directorio de instalación del disco virtual
Y asignamos un espacio en disco:
183
Figura 104 Tamaño en disco de la máquina virtual
Figura 105 Valores hardware para la máquina virtual
Podemos modificar los valores de emulación de hardware, aunque
dejaremos los valores por defecto, entre otros, 1 Gb de RAM:
184
Figura 106 Memoria asignada a la máquina virtual
Si la instalación nos solicitara permiso para instalar componentes
adicionales, aceptaremos:
185
Figura 107 Componentes adicionales para Linux
Los componentes utilizados (setup de VMWare y la distribución Ubuntu
en formato iso están disponibles en el DVD adjunto a la memoria de este TFG)
Se procede a la creación de la máquina virtual Linux (el proceso puede
tomar algún tiempo dependiendo del hardware de la máquina anfitriona). La
instalación ofrece mensajes del estado de la misma:
Figura 108 Instalación de Ubuntu
186
Figura 109 Instalación de componentes adicionales
Ya estamos preparados para trabajar en nuestra máquina virtual Ubuntu.
Iniciamos nuestra sesión con el usuario y contraseña que introdujimos en el
proceso de instalación, o bien como invitado
Figura 110 Inicio de sesión en Ubuntu
Pudiera ser necesario configurar la resolución, pero también añadir el
idioma y el teclado. Veremos a continuación un ejemplo de cómo añadir el
idioma castellano.
187
Figura 111 Añadir idioma en Ubuntu
Y ahora indicamos cómo añadir el layout del teclado para español:
188
Figura 112 Añadir teclado en Ubuntu
Una vez finalizado, ya podemos seleccionar el teclado en castellano,
que nos aparecerá en la lista de los disponibles:
Figura 113 Selección de teclado en Ubuntu
12.1.2 Instalación del IDE Eclipse (opcional)
Si quisiéramos instalar el entorno de desarrollo Eclipse, podemos utilizar
el entorno gráfico y abrir el Ubuntu Software Center, seleccionando developer
tools, IDEs y Eclipse y pulsando a continuación sobre “Instalar”:
189
Figura 114 Instalación de Eclipse IDE en Ubuntu
A continuación vamos a instalar el plug-in para desarrollo en C/C++ en
eclipse. Buscando, en el software center, por eclipse-cdt:
Figura 115 Instalación de C/C++ en Ubuntu
190
Ya podemos iniciar Eclipse y confirmar el directorio por defecto donde
Eclipse administrará los proyectos (el workspace).
Figura 116 Directorio de trabajo en Eclipse IDE
Figura 117 Pantalla principal de Eclipse IDE
191
12.1.3 Instalación de TA-Lib
Para instalar la librería de indicadores técnicos, accedemos al Site del
proyecto TA-Lib Technical Analysis Library
http://ta-lib.org/
Seleccionemos en “downloads”, buscamos el paquete para UNIX/Linux y
lo descargamos:
Figura 118 TA-Lib, selección de distribución
192
Figura 119 TA-Lib descarga de distribución
Ahora ya lo tenemos disponible en la carpeta de downloads para su
posterior pegado en nuestro directorio de trabajo, junto con el resto de
proyectos:
Figura 120 Mover TA-lib junto al resto de componentes
Ahora necesitamos compilar los fuentes para obtener las librerías.
Seguimos los siguientes pasos:
Desde un terminal de Linux debemos acceder a la carpeta donde hemos
copiado la carpeta ta-lib:
193
usuario@ubuntu:~$ cd workspace
usuario@ubuntu:~/workspace$ cd ta-lib
usuario@ubuntu:~/workspace/ ta-lib$ ./configure
usuario@ubuntu:~/workspace/ ta-lib$ ./configure
usuario@ubuntu:~/workspace/ ta-lib$ make clean
usuario@ubuntu:~/workspace/ ta-lib$ make
Una vez terminado el proceso, podremos encontrar las librerías
libta_abstract_csd.a, libta_common_csd.a, libta_func_csd.a y libta_libc_csd.a,
dentro de los directorios del mismo nombre y subdirectorio .libs, listas para ser
enlazadas en nuestro proyecto.
La instalación ofrece un ejecutable que permite realizar un test, llamando
a las funciones recién compiladas para verificar su funcionamiento. Podemos
ejecutarlo siguiendo las siguientes instrucciones:
usuario@ubuntu:~/workspace$ cd ta-lib
usuario@ubuntu:~/workspace/ta-lib$ cd src
usuario@ubuntu:~/workspace/ta-lib/src$ cd tools
usuario@ubuntu:~/workspace/ta-lib/src/tools$ cd ta_regtest
usuario@ubuntu:~/workspace/ta-lib/src/tools/ta_regtest$ ./ta_regtest
Figura 121 Test de TA-Lib en Ubuntu
12.1.4 Instalación de libconfig
Ahora procedemos a instalar libconfig (C/C++ Configuration file library),
componente necesario para la lectura de los archivos de configuración que
usaremos en este proyecto.
194
Accedemos al Site del proyecto http://www.hyperrealm.com/libconfig/ y
procedemos a su descarga:
Figura 122 Descarga de libconfig
Ahora lo movemos a la carpeta workspace, junto con el resto de
proyectos:
Figura 123 Mover libconfig junto al resto de componentes
Desde un terminal de Linux debemos acceder a la carpeta donde hemos
copiado la carpeta lib-config:
usuario@ubuntu:~$ Cd workspace
usuario@ubuntu:~/workspace$ cd libconfig-1.4.9
usuario@ubuntu:~/workspace/libconfig-1.4.9$ ./configure –disable-cxx
usuario@ubuntu:~/workspace/ libconfig-1.4.9$ make clean
usuario@ubuntu:~/workspace/ libconfig-1.4.9$ make
195
usuario@ubuntu:~/workspace/ libconfig-1.4.9$ make install
La librería libconfig.a ya se puede encontrar en el directorio lib/.libs
usuario@ubuntu:~/workspace/ libconfig-1.4.9$ cd lib
usuario@ubuntu:~/workspace/ libconfig-1.4.9/lib$ cd .libs
usuario@ubuntu:~/workspace/ libconfig-1.4.9/lib/.libs$ cp ./libconfig.a ../
(en este caso, para copiarlo al directorio lib)
12.1.5 Instalación de Python
(python2.7 en el momento de realización del presente TFG)
Accedemos a un terminal:
usuario@ubuntu:~$
Actualizamos los repositorios, es decir , la lista de todos los paquetes
usuario@ubuntu:~$ sudo apt-get update
usuario@ubuntu:~$ sudo apt-get install python-dev
Tras comprobar las dependencias con otros paquetes tendremos que
responder “y” al requerimiento adicional de espacio necesario para instalar este
paquete y sus dependencias:
Figura 124 Instalación de Python en Ubuntu
A partir de este momento ya tenemos el fichero “python.h” disponible
para usarlo en nuestro desarrollo en C (estará en /usr/include/python2.7)
196
Debemos tener en cuenta que los ficheros include no están por defecto en el path de include, ni la librería de Python está enlazada con el ejecutable por defecto. Necesitamos añadir los siguientes flags:
-I/usr/include/python2.7 -lpython2.7
12.1.6 Instalación de matplotlib
Es el componente necesario para crear los gráficos de velas, que forman
parte de la funcionalidad de la aplicación desarrollada.
Accedemos a un terminal:
usuario@ubuntu:~$
Actualizamos los repositorios, es decir, la lista de todos los paquetes de
software:
usuario@ubuntu:~$ sudo apt-get update
usuario@ubuntu:~$ sudo apt-get install python-matplotlib
Tras comprobar las dependencias con otros paquetes tendremos que
responder “y” al requerimiento adicional de espacio necesario para instalar este
paquete y sus dependencias:
Figura 125 Instalación de matplotlib en Ubuntu
197
12.1.7 Instalación de MySQL
Para poder acceder a extraer datos de una base de datos en MySQL
necesitamos instalar la librería de esta popular base de datos.
Accedemos al Ubuntu Software Center y filtrando por “MySQL”
obtendremos una lista de software similar a la que aparece en la siguiente
imagen. Seleccionaremos las utilidades para desarrolladores:
Figura 126 Instalación de MySQL dev tools en Ubuntu
12.2 Instalación en Windows
12.2.1 Instalación del compilador
El primer paso es instalar los siguientes componentes en nuestro
sistema Windows:
GCC, el compilador GNU C
MAKE: una utilidad para compilar y enlazar proyectos de software que
se componga de varios ficheros
Detallamos los pasos para instalar estos componentes desde CYGWIN:
A través de nuestro navegador visitamos el Site de CYGWIN
https://www.cygwin.com/
198
Figura 127 Web Site de Cygwin
Una vez aquí, seleccionamos el instalable adecuado a nuestro sistema
(32 o 64 bits):
Figura 128 Selección de la versión de Cygwin
y procedemos a la descarga sobre nuestro directorio preferido. Nos
creará el siguiente icono en el escritorio:
199
Ahora lo pinchamos dos veces con el ratón para lanzar la utilidad de
instalación:
Figura 129 Instalación de Cygwin (1)
A continuación nos aparecerá una segunda pantalla donde no debemos
olvidar seleccionar “Instalar desde Internet”:
Figura 130 Instalación de Cygwin (2)
200
Una tercera pantalla nos pide en qué directorio instalar los archivos de
Cygwin. Dejar el directorio C:\cygwin propuesto :
Figura 131 Instalación de Cygwin (3)
Una cuarta pantalla nos preguntará por el directorio donde el programa
de instalación guardará los archivos que descargue durante la instalación (en la
imagen adjunta seleccionamos el Escritorio):
Figura 132 Instalación de Cygwin (4)
201
La quinta pantalla en el proceso de instalación nos pregunta sobre
nuestra conexión a internet. Debemos seleccionar Direct Connection:
Figura 133 Instalación de Cygwin (5)
La sexta pantalla nos pregunta por el Site específico del que queremos
descargar Cygwin. En este punto podemos seleccionar el más cercano a
nuestra localización:
Figura 134 Instalación de Cygwin (6)
202
Pulsamos en siguiente:
Figura 135 Instalación de Cygwin (7)
Y después de un breve momento, nos aparecerá la séptima pantalla,
donde debemos elegir cuidadosamente los paquetes a instalar:
Figura 136 Instalación de Cygwin. Selección de paquetes
203
Empezamos expandiendo el nodo Devel, para ver los paquetes
relacionados con herramientas de desarrollo:
Figura 137 Instalación de Cygwin. Paquetes de desarrollo
Debemos seleccionar binutils, gcc-core, gcc GNU compiler, GNU
debugger, libtdl7, make, gcc pre-processor y pkg-config. Además marcaremos
subversion (usado durante este proyecto como repositorio para almacenar las
diferentes versiones del software).
Vemos a continuación el árbol completo de paquetes a seleccionar para
una instalación adecuada para nuestro proyecto:
204
Figura 138 Instalación de Cygwin. Paquetes a instalar
Tras ello, pulsamos en Siguiente y accedemos a incorporar en la
descarga los ficheros dependientes de las opciones que hemos elegido:
Figura 139 Instalación de Cygwin. Aceptar dependencias
Y esperamos a que acabe el proceso de descarga e instalación:
205
Figura 140 Instalación de Cygwin. Proceso
Figura 141 Instalación de Cygwin. Fin del proceso
12.2.2 Instalación de TA-lib
Para instalar la librería de indicadores técnicos, accedemos al Site del
proyecto TA-Lib Technical Analysis Library
http://ta-lib.org/
206
Seleccionemos en “downloads”, buscamos el paquete para UNIX/Linux y
lo descargamos:
Figura 142 TA-Lib, selección de distribución
Lo guardamos en nuestra carpeta eclipseworkspace, para tenerla junto
al resto de componentes:
Figura 143 TA-Lib, descarga de la distribución
A continuación descomprimimos el archivo tar-gz y extraemos la carpeta
ta-lib en el mismo directorio eclipseworkspace.
Ahora debemos compilar el código fuente para obtener las librerías
estáticas.
207
Para ello iniciamos el terminal de Cygwin:
usuario@ordenador~
Nos dirigimos al directorio eclipseworkspace:
usuario@ordenador~ $ cd /
usuario@ordenador $ cd cygdrive
(emula el disco de nuestro ordenador dentro del entorno Linux que ofrece Cygwin)
usuario@ordenador/cygdrive $ cd c
usuario@ordenador/cygdrive /c $ cd users
usuario@ordenador/cygdrive/c/users $ cd jcanolo
(nuestro usuario de Windows)
usuario@ordenador/cygdrive/c/users/jcanolo $ cd eclipseworkspace
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace $ cd ta-
lib
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib $
./configure
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib $
make clean
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib $
make
Una vez terminado el proceso, podremos encontrar las librerías
libta_abstract.a, libta_common.a, libta_func.a y libta_libc.a, dentro de los
directorios del mismo nombre y subdirectorio .libs, listas para ser enlazadas en
nuestro proyecto:
208
Figura 144 TA-Lib, árbol de directorios
La instalación ofrece un ejecutable que permite realizar un test llamando
a las funciones. Para ejecutarlo procedemos de la siguiente manera:
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib $
cd src
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib
/src$ cd tools
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib
/src /tools$ cd ta_regtest
usuario@ordenador/cygdrive/c/users/jcanolo/eclipseworkspace/ta-lib
/src /tools /ta_regtest$ ./ta_regtest
Figura 145 Test de TA-Lib en Cygwin
209
12.2.3 Instalación de libconfig
Accedemos al Site del proyecto http://www.hyperrealm.com/libconfig/
Figura 146 Web Site de libconfig
Lo descargamos y copiamos a nuestro directorio eclipseworkspace.
Accedemos al terminal Cgywin donde, una vez situados en el directorio
libconfig, ejecutaremos los comandos:
usuario@ordenador/cygdrive/c/users/usuario/eclipseworkspace/libconf
ig$./configure –disable-cxx
Figura 147 Preparación de libconfig en Cygwin
usuario@ordenador/cygdrive/c/users/usuario/eclipseworkspace/libconf
ig$Make clean
210
usuario@ordenador/cygdrive/c/users/usuario/eclipseworkspace/libconf
ig$Make
usuario@ordenador/cygdrive/c/users/usuario/eclipseworkspace/libconf
ig$Make install
Una vez ejecutados todos estos pasos, la librería libconfig.a está
ubicada en libconfig/lib/.libs y la podemos copiar donde queramos tenerla para
enlazarla posteriormente en nuestro proyecto.
12.2.4 Instalación de python
(python2.7 en el momento de realización del presente TFG)
Dado que en Cygwin no disponemos de apt-get, usaremos el instalador
‘pip’. Al no venir por defecto en la instalación de Cygwin, accedemos al link del
archivo en https://raw.github.com/pypa/pip/master/contrib/get-pip.py y lo
descargamos en C:\cygwin\bin:
Figura 148 Descarga de get-pip.py en Cygwin
Ahora, desde el terminal de Cygwin, situados en C:\cygwin\bin,
ejecutamos:
usuario@ordenador/bin$ python get-pip.py install (debemos tener acceso a
internet)
Figura 149 Ejecutar get-pip en Cygwin
211
12.2.5 Instalación de matplotlib
Desde el terminal de Cygwin, situados en C:\cygwin\bin, ejecutamos:
usuario@ordenador/bin$ pip install matplotlib
Figura 150 Instalación de matplotlib en Cygwin
usuario@ordenador/bin$ pip install –upgrade numpy (doble guión)
Figura 151 Actualizar numpy en Cygwin
No olvidar incluir c:\cygwin\bin en la variable de entorno PATH de
Windows (necesario para ejecutar el compilador gcc desde la línea de
comandos de Windows)
12.2.6 Instalación de subversion
Primero debemos instalar el paquete de subversión en Cygwin. Para
ello, ejecutando el archivo setup-x86.exe que obtuvimos durante la instalación,
desplegaremos el grupo Devel, o bien tecleamos subversion directamente en el
campo de búsqueda:
212
Figura 152 Instalar subversion en Cygwin
El siguiente paso consiste en instalar el plug-in en Eclipse que nos
permitirá sincronizar nuestro código fuente con el repositorio desde nuestro
IDE.
Para ello, accederemos al menú Help y, desde ahí, a Install New
Software. En el campo Work with introducimos la dirección de Subversive
(nombre del proyecto que permite trabajar con subversion).
Podemos observar esta opción de Eclipse en la siguiente imagen:
Figura 153 Instalar plug-in de subversion en Eclipse IDE
213
12.2.7 Instalación del cliente MySql
Al igual que hicimos con subversion, accederemos al setup de Cygwin, y
buscaremos el texto mysql en el campo destinado a tal efecto (recuadro en rojo
en la siguiente imagen) y seleccionaremos entonces los componentes
remarcados:
Figura 154 Instalación del cliente de MySQL en Cygwin
12.3 Instalación de la aplicación “Trading”
Para ejecutar la aplicación podríamos copiar el ejecutable trading.exe
previamente compilado en un sistema compatible con el de destino, o bien
instalar Eclipse e importar el proyecto para poder compilar una versión
específica para el entorno (opción preferida).
12.3.1 Instalación de un ejecutable
En el DVD que acompaña a esta memoria, podemos encontrar una
carpeta llamada “ejecutables” que contiene una subcarpeta para Windows y
otra para Linux.
12.3.1.1 Ejecutable en Windows
Copiaremos el contenido de la carpeta \ejecutables\windows en el
directorio del ordenador que va a ejecutar la aplicación:
Figura 155 Fichero ejecutable para Windows en el DVD
214
En este caso se incluyen los archivos trading.exe (la aplicación) y
cygconfig-9.dll (librería que emula el entorno Linux en sistemas basados en
Windows).
12.3.1.2 Ejecutable en Linux
En el DVD se puede encontrar una versión compilada para Ubuntu en la
carpeta \ejecutables\linux.
Recordemos que, adicionalmente, la aplicación necesita ficheros de
configuración para ser ejecutada (ver Anexo II Manual de Usuario).
12.3.2 Instalación del código fuente
En el DVD que acompaña a esta memoria, podemos encontrar una
carpeta llamada “desarrollo” que contiene una subcarpeta ProyectoEclipse con
los códigos fuentes y otras dos carpetas (Windows y Linux) que contiene las
librerías adicionales que se deben instalar siguiente las instrucciones del Anexo
II Manual de Instalación.
Desde el menú de Eclipse podemos importar el proyecto que
encontramos en \desarrollo\ProyectoEclipse, seleccionando Import -> Existing
Project Into Workspace:
Figura 156 Fichero ejecutable para Linux en el DVD
215
Dependiendo del sistema operativo, debemos especificar el conjunto de
herramientas necesarias para construir el proyecto (toolchain).
En Linux debemos seleccionar Linux GCC y en Cygwin (sobre Windows)
seleccionaremos Cygwin GCC:
Figura 158 Toolchain en Linux
Figura 157 Incorporar proyecto Trading en Eclipse
216
Una vez importado, antes de compilar la aplicación, se debe limpiar el
proyecto e incluso eliminar los archivos objeto resultado de una compilación
anterior (basta con seleccionarlos y pulsar sobre el botón derecho y Delete:
Si, al ejecutar dentro del entorno Eclipse en Linux, obtuviéramos el
siguiente mensaje "error while loading shared libraries: libconfig.so.9: cannot open
shared object file: No such file or directory” tendríamos que especificar la ruta de las
librerías dinámicas:
Figura 159 Toolchain en Cygwin (Windows)
Figura 160 Eliminar ficheros objeto
219
13 Lista de colores definidos en matplotlib
Nombre Código Nombre Código
"aliceblue" #F0F8FF" "darkturquoise" #00CED1"
"antiquewhite" #FAEBD7" "darkviolet" #9400D3"
"aqua" #00FFFF" "deeppink" #FF1493"
"aquamarine" #7FFFD4" "deepskyblue" #00BFFF"
"azure" #F0FFFF" "dimgray" #696969"
"beige" #F5F5DC" "dodgerblue" #1E90FF"
"bisque" #FFE4C4" "firebrick" #B22222"
"black" #000000" "floralwhite" #FFFAF0"
"blanchedalmond" #FFEBCD" "forestgreen" #228B22"
"blue" #0000FF" "fuchsia" #FF00FF"
"blueviolet" #8A2BE2" "gainsboro" #DCDCDC"
"brown" #A52A2A" "ghostwhite" #F8F8FF"
"burlywood" #DEB887" "gold" #FFD700"
"cadetblue" #5F9EA0" "goldenrod" #DAA520"
"chartreuse" #7FFF00" "gray" #808080"
"chocolate" #D2691E" "green" #008000"
"coral" #FF7F50" "greenyellow" #ADFF2F"
"cornflowerblue" #6495ED" "honeydew" #F0FFF0"
"cornsilk" #FFF8DC" "hotpink" #FF69B4"
"crimson" #DC143C" "indianred" #CD5C5C"
"cyan" #00FFFF" "indigo" #4B0082"
"darkblue" #00008B" "ivory" #FFFFF0"
"darkcyan" #008B8B" "khaki" #F0E68C"
"darkgoldenrod" #B8860B" "lavender" #E6E6FA"
"darkgray" #A9A9A9" "lavenderblush" #FFF0F5"
"darkgreen" #006400" "lawngreen" #7CFC00"
"darkkhaki" #BDB76B" "lemonchiffon" #FFFACD"
"darkmagenta" #8B008B" "lightblue" #ADD8E6"
"darkolivegreen" #556B2F" "lightcoral" #F08080"
"darkorange" #FF8C00" "lightcyan" #E0FFFF"
"darkorchid" #9932CC" "lightgoldenrodyellow" #FAFAD2"
"darkred" #8B0000" "lightgreen" #90EE90"
"darksalmon" #E9967A" "lightgray" #D3D3D3"
"darkseagreen" #8FBC8F" "lightpink" #FFB6C1"
"darkslateblue" #483D8B" "lightsalmon" #FFA07A"
"darkslategray" #2F4F4F" "lightseagreen" #20B2AA"
220
Nombre Código Nombre Código
"lightskyblue" #87CEFA" "peru" #CD853F"
"lightslategray" #778899" "pink" #FFC0CB"
"lightsteelblue" #B0C4DE" "plum" #DDA0DD"
"lightyellow" #FFFFE0" "powderblue" #B0E0E6"
"lime" #00FF00" "purple" #800080"
"limegreen" #32CD32" "red" #FF0000"
"linen" #FAF0E6" "rosybrown" #BC8F8F"
"magenta" #FF00FF" "royalblue" #4169E1"
"maroon" #800000" "saddlebrown" #8B4513"
"mediumaquamarine" #66CDAA" "salmon" #FA8072"
"mediumblue" #0000CD" "sandybrown" #FAA460"
"mediumorchid" #BA55D3" "seagreen" #2E8B57"
"mediumpurple" #9370DB" "seashell" #FFF5EE"
"mediumseagreen" #3CB371" "sienna" #A0522D"
"mediumslateblue" #7B68EE" "silver" #C0C0C0"
"mediumspringgreen" #00FA9A" "skyblue" #87CEEB"
"mediumturquoise" #48D1CC" "slateblue" #6A5ACD"
"mediumvioletred" #C71585" "slategray" #708090"
"midnightblue" #191970" "snow" #FFFAFA"
"mintcream" #F5FFFA" "springgreen" #00FF7F"
"mistyrose" #FFE4E1" "steelblue" #4682B4"
"moccasin" #FFE4B5" "tan" #D2B48C"
"navajowhite" #FFDEAD" "teal" #008080"
"navy" #000080" "thistle" #D8BFD8"
"oldlace" #FDF5E6" "tomato" #FF6347"
"olive" #808000" "turquoise" #40E0D0"
"olivedrab" #6B8E23" "violet" #EE82EE"
"orange" #FFA500" "wheat" #F5DEB3"
"orangered" #FF4500" "white" #FFFFFF"
"orchid" #DA70D6" "whitesmoke" #F5F5F5"
"palegoldenrod" #EEE8AA" "yellow" #FFFF00"
"palegreen" #98FB98" "yellowgreen" "#9ACD32
"paleturquoise" #AFEEEE"
"palevioletred" #DB7093"
"papayawhip" #FFEFD5"
"peachpuff" #FFDAB9"
221
14 Lista de errores de ejecución
Id Descripción
0 "No error"
1 "Section 'columnsInDataFile' not found in config file"
2 "Historical data file not found in specified path"
3 "Historical data file contains more columns than expected according to 'columnsInDataFile' section"
4 "One of the columns in historical does not match expected format according to 'columnsInDataFile' section"
5 "Saving information in data table not possible due to out of range index"
6 "Date & Time fields does not compound a valid datetime information"
7 "Error allocating or reallocating memory"
8 "An error has been found when sending information to graphic csv file"
9 "Destination window according to 'graphicData.window' is bigger than 'graphicNbWindows'"
10 "Missing window definition in 'graphicWindows' section (expected 'graphicNbWindows')"
11 "Relative sizes of windows must sum up 10"
12 "Section 'graphicData' not found in config file"
13 "Section 'graphicWindows' not found in config file"
14 "There are no enough variables to draw a candlestick chart"
15 "Non integer values in windows definition"
16 "Valid chart types are l, a, cC, cL, cH, cO"
17 "Variable color not existing or with wrong format"
18 "The format or direction in one of the indicators is not correct"
19 "Output parameters can have only one value"
20 "Ranges for input parameters must have three numeric values"
21 "Indicator parameters need values or ranges to be declared"
22 "All indicators need to have informed parameters"
23 "It is not possible to inform both 'values' and 'ranges' for parameters in indicators"
24 "functions.cfg doens't exist"
25 "functions.cfg has not information about parameters"
26 "functions.cfg has not correct information"
27 "functions.cfg has format, type or optional type not allowed"
28 "Invalid data format specified in 'columnsInDataFile' section. Only f, d and t are allowed"
29 "A matrix input parameter has a value that does not match with any existing variable"
30 "A float value was expected as parameter value"
31 "An integer value was expected as parameter value"
32 "An indicators has been declare more than once in config file"
33 "Output parameters names must be unique"
34 "At least one indicator in config file does not match with function definition"
50 "invalid character in the formula to be calculated"
51 "The variable specified in the formula is not an output matrix indicator parameter"
222
Id Descripción
52 "Expected script file does not exist"
53 "Script file has incorrect syntax"
54 "No information about indicators have been found in the script file or is not correct"
55 "No information about graphics have been found in the script file or is not correct"
56 "No information about graphic windows have been found in the script file or is not correct"
57 "Cannot open output file for graphic information"
58 "Script file does not contain required parameters for buy formula"
59 "Script file does not contain required parameters for sell formula"
60 "No information about formulae have been found in the script file or is not correct"
61 "No information about colors for plotting buy/sell have been informed or is not correct"
62 "It is not possible to find the best scenario to plot"
63 "An error has been found in the buy condition formula"
64 "An error has been found in the buy formula"
65 "An error has been found in the sell condition formula"
66 "An error has been found in the sell formula"
67 "No information about constants have been found in the script file or is not correct"
68 "Open or closure price is not informed or found in script file"
69 "Error closing and order: lots, lotssize not informed"
70 "An error has been found in the take profit formula"
71 "An error has been found in the stop loss formula"
72 "Cannot open output file for operations information"
73 "An error has been found when sending information to txt operations file"
100 "Not possible to initialize TA-Lib library"
101 "TA-Lib library has raised an error when calculating an indicator"
150 "An error has been found connecting to database"
151 "An error has been found executing a query"
160 "An error has been found deleting a file"
170 "The maximum number of rows have been found in csv file or database"
180 "The maximum number of iterations has been reached"
190 "The maximum execution time has been reached"
0xF "Unknown error
223
15 Índice de figuras
Figura 1 Gráfico de velas. Descripción ........................................................ 31
Figura 2 Gráfico de velas. Evolución de los precios ..................................... 31
Figura 3 Web Site de MetaTrader ................................................................ 36
Figura 4 Web Site de TradeStation .............................................................. 36
Figura 5 Web Site de Wealth-Lab Web ........................................................ 36
Figura 6 Web Site de QuantConnect ........................................................... 36
Figura 7 Web Site de MultiCharts ................................................................ 36
Figura 8 Web Site de NinjaTrader ................................................................ 36
Figura 9 El Proceso en Scrum ..................................................................... 45
Figura 10 Tablero Kanban ........................................................................... 49
Figura 11 Burn Down Chart ......................................................................... 50
Figura 12 Fichero de ejemplo para uso con libconfig ................................... 54
Figura 13 Trading en Kunagi: Roles ............................................................. 70
Figura 14 Trading en Kunagi: Historias de Usuario ...................................... 71
Figura 15 Sprint 1 Backlog ........................................................................... 72
Figura 16 Sprint 1 Historias de Usuario ....................................................... 73
Figura 17 Sprint 1 Tablero al inicio del Sprint............................................... 74
Figura 18 Sprint 1 Burndown Chart .............................................................. 75
Figura 19 Sprint 1 Tablero a falta de las pruebas de la Historia STO004 .... 76
Figura 20 Sprint 1 Release Burndown Chart ................................................ 76
Figura 21 Sprint 1 Demo: fichero CSV de entrada ....................................... 77
Figura 22 Sprint 1 Demo: lectura de fichero csv .......................................... 77
Figura 23 Sprint 1 Demo: fichero de configuración ejemplo ......................... 78
Figura 24 Sprint 1 Demo: lectura fichero de configuración .......................... 78
224
Figura 25 Sprint 1 Demo: error en lectura del fichero csv ............................ 78
Figura 26 Sprint 2 Backlog ........................................................................... 79
Figura 27 Sprint 2 Historias de Usuario ....................................................... 81
Figura 28 Sprint 2 Tablero al inicio del Sprint............................................... 83
Figura 29 Sprint 2 Burndown Chart .............................................................. 84
Figura 30 Sprint 2 Tablero al finalizar la Historia de Usuario STO010 ......... 85
Figura 31 Sprint 2 Release Burndown Chart ................................................ 85
Figura 32 Sprint 2 Demo: script de matplotlib .............................................. 86
Figura 33 Sprint 2 Demo: gráficos de velas con matplotlib .......................... 86
Figura 34 Sprint 2 Demo: fichero CSV de entrada ....................................... 87
Figura 35 Sprint 2 Demo: estructura para almacenar datos históricos ......... 87
Figura 36 Sprint 2 Demo: información almacenada en la estructura ............ 88
Figura 37 Sprint 2 Demo: fichero de salida generado .................................. 88
Figura 38 Sprint 3 Backlog ........................................................................... 89
Figura 39 Sprint 3 Historias de Usuario ....................................................... 90
Figura 40 Sprint 3: incluir Historias de Usuario en un Sprint ........................ 91
Figura 41 Sprint 3: Tablero a falta de incluir las tareas ................................ 91
Figura 42 Sprint 3 Tablero al inicio del Sprint............................................... 92
Figura 43 Sprint 3 Burndown Chart .............................................................. 93
Figura 44 Sprint 3 Release Burndown Chart ................................................ 93
Figura 45 Sprint 3 Demo: configuración del formato de los gráficos ............ 94
Figura 46 Sprint 3 Demo: salida por consola de la información leída .......... 94
Figura 47 Sprint 3 Demo: gráfico creado dinámicamente ............................ 95
Figura 48 Sprint 4 Backlog ........................................................................... 96
Figura 49 Sprint 4: Reducción del Product Backlog tras asignar al Sprint ... 99
Figura 50 Sprint 4 Tablero al inicio del Sprint............................................. 100
225
Figura 51 Sprint 4 Tablero con dos tareas finalizadas y una en curso ....... 101
Figura 52 Sprint 4 Burndown Chart ............................................................ 101
Figura 53 Sprint 4 Release Burndown Chart .............................................. 102
Figura 54 Sprint 4 Demo: analizador sintáctico de expresiones ................ 102
Figura 55 Sprint 4 Demo: parámetros con varios valores .......................... 103
Figura 56 Sprint 4 Demo: fichero LOG ....................................................... 103
Figura 57 Sprint 4 Demo: indicadores de entrada/salida del mercado ....... 104
Figura 58 Sprint 5 Backlog ......................................................................... 105
Figura 59 Sprint 5 Tablero al inicio del Sprint............................................. 109
Figura 60 Sprint 5 Burndown Chart ............................................................ 110
Figura 61 Sprint 5 Release Burndown Chart .............................................. 111
Figura 62 Sprint 5 Demo: Tabla de resultados ........................................... 111
Figura 63 Sprint 5 Demo: Resultados ordenados ...................................... 112
Figura 64 Sprint 5 Demo: constantes en los archivos de configuración ..... 112
Figura 65 Sprint 5 Demo: constantes almacenadas en la aplicación ......... 112
Figura 66 Sprint 6 Backlog ......................................................................... 114
Figura 67 Sprint 6 Tablero al inicio del Sprint............................................. 117
Figura 68 Sprint 6 Burndown Chart ............................................................ 118
Figura 69 Sprint 6 Release Burndown Chart .............................................. 118
Figura 70 Sprint 6 Demo: Variables para cálculo de TP y SL .................... 119
Figura 71 Sprint 6 Demo: Uso del parámetro en el cálculo del SoptLoss .. 119
Figura 72 Sprint 6 Demo: Ejecuciones de Stop Loss y Take Profit ............ 120
Figura 73 Sprint 6 Demo: Indicadores de rendimiento ............................... 120
Figura 74 Matriz de almacenamiento de datos .......................................... 146
Figura 75 Espacio para un nuevo indicador ............................................... 147
Figura 76 Crecimiento bidimensional de la tabla de datos ......................... 147
226
Figura 77 Bucle principal de la aplicación .................................................. 151
Figura 78 Módulos de la aplicación ............................................................ 154
Figura 79 Esquema general aplicación “Trading”....................................... 155
Figura 80 Configuración general de la aplicación ...................................... 156
Figura 81 Ejemplo de archivo de configuración general ............................ 159
Figura 82 Ejemplo de listado de indicadores ............................................. 160
Figura 83 Escenarios (1/5): indicadores técnicos ....................................... 162
Figura 84 Especificación de los indicadores técnicos ................................ 163
Figura 85 Escenarios (2/5): definición de gráficos ..................................... 164
Figura 86 Proceso de creación de un gráfico ............................................. 165
Figura 87 Escenarios (3/5): definición de constantes ................................. 165
Figura 88 Escenarios (4/5): operaciones de trading ................................... 167
Figura 89 Ejemplo de relación entre variables ........................................... 168
Figura 90 Ejecución: información mostrada en la consola ......................... 170
Figura 91 Ejecución: resumen mostrado en la consola .............................. 171
Figura 92 Contenido del archivo LOG ........................................................ 173
Figura 93 Ficheros generados: gráficos y registro de operaciones ............ 173
Figura 94 Algoritmo de trading ................................................................... 174
Figura 95 Algoritmo para el procesamiento de SL y TP ............................. 175
Figura 96 Descargas del Web Site de VMWare ......................................... 178
Figura 97 Enlace para descarga de VMWare Player ................................. 178
Figura 98 instalación de VMWare Player ................................................... 179
Figura 99 Web Site de Ubuntu ................................................................... 180
Figura 100 Selección distribución Ubuntu iso ............................................ 180
Figura 101 Creación de una máquina virtual ............................................. 181
Figura 102 Credenciales de la máquina virtual .......................................... 182
227
Figura 103 Directorio de instalación del disco virtual ................................. 182
Figura 104 Tamaño en disco de la máquina virtual .................................... 183
Figura 105 Valores hardware para la máquina virtual ................................ 183
Figura 106 Memoria asignada a la máquina virtual .................................... 184
Figura 107 Componentes adicionales para Linux ...................................... 185
Figura 108 Instalación de Ubuntu .............................................................. 185
Figura 109 Instalación de componentes adicionales .................................. 186
Figura 110 Inicio de sesión en Ubuntu ....................................................... 186
Figura 111 Añadir idioma en Ubuntu .......................................................... 187
Figura 112 Añadir teclado en Ubuntu ......................................................... 188
Figura 113 Selección de teclado en Ubuntu .............................................. 188
Figura 114 Instalación de Eclipse IDE en Ubuntu ...................................... 189
Figura 115 Instalación de C/C++ en Ubuntu .............................................. 189
Figura 116 Directorio de trabajo en Eclipse IDE ........................................ 190
Figura 117 Pantalla principal de Eclipse IDE ............................................. 190
Figura 118 TA-Lib, selección de distribución ............................................. 191
Figura 119 TA-Lib descarga de distribución ............................................... 192
Figura 120 Mover TA-lib junto al resto de componentes ............................ 192
Figura 121 Test de TA-Lib en Ubuntu ........................................................ 193
Figura 122 Descarga de libconfig ............................................................... 194
Figura 123 Mover libconfig junto al resto de componentes ........................ 194
Figura 124 Instalación de Python en Ubuntu ............................................. 195
Figura 125 Instalación de matplotlib en Ubuntu ......................................... 196
Figura 126 Instalación de MySQL dev tools en Ubuntu ............................. 197
Figura 127 Web Site de Cygwin ................................................................. 198
Figura 128 Selección de la versión de Cygwin........................................... 198
228
Figura 129 Instalación de Cygwin (1) ......................................................... 199
Figura 130 Instalación de Cygwin (2) ......................................................... 199
Figura 131 Instalación de Cygwin (3) ......................................................... 200
Figura 132 Instalación de Cygwin (4) ......................................................... 200
Figura 133 Instalación de Cygwin (5) ......................................................... 201
Figura 134 Instalación de Cygwin (6) ......................................................... 201
Figura 135 Instalación de Cygwin (7) ......................................................... 202
Figura 136 Instalación de Cygwin. Selección de paquetes ........................ 202
Figura 137 Instalación de Cygwin. Paquetes de desarrollo ....................... 203
Figura 138 Instalación de Cygwin. Paquetes a instalar .............................. 204
Figura 139 Instalación de Cygwin. Aceptar dependencias ......................... 204
Figura 140 Instalación de Cygwin. Proceso ............................................... 205
Figura 141 Instalación de Cygwin. Fin del proceso .................................... 205
Figura 142 TA-Lib, selección de distribución ............................................. 206
Figura 143 TA-Lib, descarga de la distribución .......................................... 206
Figura 144 TA-Lib, árbol de directorios ...................................................... 208
Figura 145 Test de TA-Lib en Cygwin ........................................................ 208
Figura 146 Web Site de libconfig ............................................................... 209
Figura 147 Preparación de libconfig en Cygwin ......................................... 209
Figura 148 Descarga de get-pip.py en Cygwin .......................................... 210
Figura 149 Ejecutar get-pip en Cygwin ...................................................... 210
Figura 150 Instalación de matplotlib en Cygwin ......................................... 211
Figura 151 Actualizar numpy en Cygwin .................................................... 211
Figura 152 Instalar subversion en Cygwin ................................................. 212
Figura 153 Instalar plug-in de subversion en Eclipse IDE .......................... 212
Figura 154 Instalación del cliente de MySQL en Cygwin ........................... 213
229
Figura 155 Fichero ejecutable para Windows en el DVD ........................... 213
Figura 156 Fichero ejecutable para Linux en el DVD ................................. 214
Figura 157 Incorporar proyecto Trading en Eclipse ................................... 215
Figura 158 Toolchain en Linux ................................................................... 215
Figura 159 Toolchain en Cygwin (Windows) .............................................. 216
Figura 160 Eliminar ficheros objeto ............................................................ 216
Figura 161 Especificar ruta de librerías en Linux ....................................... 217
Figura 9 (proceso SCRUM) recuperada de http://commons.wikimedia.org/wiki/File:Scrum_process.svg
Figura 10 (Tablero kanban) recuperada de http://en.wikipedia.org/wiki/Kanban_board
Fgura 11 (Burn down chart) recuperada de http://en.wikipedia.org/wiki/Burn_down_chart
Figura 12 (Fichero de ejemplo para uso con libconfig) recuperada http://www.hyperrealm.com/libconfig
231
16 Índice de tablas
Tabla 1 Filosofía de desarrollo Ágil .............................................................. 42
Tabla 2 Roles en SCRUM ............................................................................ 46
Tabla 3 Asignación de roles en proyecto Trading ........................................ 48
Tabla 4 Historias de usuario identificadas al inicio del proyecto .................. 63
Tabla 5 Costes de material no facturables ................................................... 65
Tabla 6 Estimación de costes iniciales facturables al cliente ....................... 66
Tabla 7 Fase inicial: Objetivos del cliente .................................................... 68
Tabla 8 Fase inicial. Traducción a Historias de Usuario .............................. 68
Tabla 9 Sprint 1 Tareas ................................................................................ 73
Tabla 10 Sprint 2 Tareas .............................................................................. 81
Tabla 11 Sprint 3 Tareas .............................................................................. 90
Tabla 12 Sprint 4 Tareas .............................................................................. 98
Tabla 13 Sprint 5 Tareas ............................................................................ 108
Tabla 14 Sprint 6 Tareas ............................................................................ 115
Tabla 15 Caso de prueba 001 .................................................................... 121
Tabla 16 Caso de prueba 002 .................................................................... 122
Tabla 17 Caso de prueba 003 .................................................................... 122
Tabla 18 Caso de prueba 004 .................................................................... 123
Tabla 19 Caso de prueba 005 .................................................................... 123
Tabla 20 Caso de prueba 006 .................................................................... 124
Tabla 21 Caso de prueba 007 .................................................................... 124
Tabla 22 Caso de prueba 008 .................................................................... 125
Tabla 23 Caso de prueba 009 .................................................................... 125
Tabla 24 Caso de prueba 010 .................................................................... 126
232
Tabla 25 Caso de prueba 011 .................................................................... 126
Tabla 26 Caso de prueba 012 .................................................................... 127
Tabla 27 Caso de prueba 013 .................................................................... 127
Tabla 28 Caso de prueba 014 .................................................................... 128
Tabla 29 Caso de prueba 015 .................................................................... 128
Tabla 30 Caso de prueba 016 .................................................................... 129
Tabla 31 Caso de prueba 017 .................................................................... 129
Tabla 32 Caso de prueba 018 .................................................................... 130
Tabla 33 Caso de prueba 019 .................................................................... 130
Tabla 34 Caso de prueba 020 .................................................................... 131
Tabla 35 Caso de prueba 021 .................................................................... 131
Tabla 36 Caso de prueba 022 .................................................................... 132
Tabla 37 Caso de prueba 023 .................................................................... 133
Tabla 38 Caso de prueba 024 .................................................................... 133
Tabla 39 Caso de prueba 025 .................................................................... 134
Tabla 40 Caso de prueba 026 .................................................................... 134
Tabla 41 Caso de prueba 027 .................................................................... 135
Tabla 42 Caso de prueba 028 .................................................................... 135
Tabla 43 Objetivos alcanzados .................................................................. 137
Tabla 44 Código para redimensionar arrays de float y char ....................... 146
Tabla 45 Parámetros aplicables en la configuración general ..................... 157
Tabla 46 Parámetros aplicable a la lista de indicadores ............................ 160
Tabla 47 Escenarios (1/5): indicadores técnicos ........................................ 161
Tabla 48 Escenarios (2/5): definición de gráficos....................................... 163
Tabla 49 Escenarios (3/5): definición de constantes .................................. 165
Tabla 50 Escenarios (4/5): operaciones de trading .................................... 166
233
Tabla 51 Escenarios (5/5): asignación de precios ...................................... 168
Tabla 52 Operadores admitidos en fórmulas ............................................. 169
Tabla 53 Operandos admitidos en fórmulas .............................................. 169
Tabla 54 Ejemplos de fórmulas .................................................................. 170
235
17 Glosario de términos
Trading: consiste en comprar o vender un valor en un mercado
financiero con la intención de obtener un beneficio especulativo
Trader: es una persona o entidad que compra o vende
instrumentos financieros (acciones, bonos, materias primas,
derivados financieros, etc.)
FOREX: es una abreviatura de uso general para “foreign
exchange” o "cambio de divisas" y se suele utilizar para describir
el trading en el mercado de divisas por inversionistas y
especuladores
Profit: hace referencia al beneficio de las operaciones y se calcula
como diferencia entre las cantidades obtenidas y las invertidas
Stop Loss: es una orden de venta que sólo se ejecutará si el
precio cae lo suficiente como para causarte tu pérdida máxima
admisible
Take Profit: es una orden de cierre cuando se llega a un precio
objetivo (nuestra meta para esa operación), que le hemos dicho
con anterioridad
Movimiento lateral: Es un movimiento de la curva de cotizaciones,
que se mueve en un estrecho rango de fluctuación, prácticamente
horizontal
Drawdown: es el nivel de descenso de la curva de resultados
respecto a un máximo anterior. Es una forma de evaluar el riesgo
del sistema de trading, ya sea automático o no. Influye de manera
directa en el capital mínimo con el que hemos de contar para
invertir.
Backtesting: Es el proceso de probar una estrategia de operación
en períodos anteriores. En lugar de aplicar una estrategia para el
período de tiempo hacia delante, lo que podría llevar años, un
operador puede hacer una simulación de la estrategia de
operación con los datos del pasado con el fin de medir la eficacia.
Tablero Kanban: Es una herramienta de trabajo que consiste en
una tabla que tendrá tantas columnas como etapas compongan
nuestro proceso, de forma que los elementos de trabajo vayan
236
pasando etapas de izquierda a derecha. En nuestro caso, por
ejemplo, los elementos de trabajo son tareas, y comienzan en el
estado “To Do”, pasando a “Doing” en el momento en el que
alguien que tiene disponibilidad se asigna esa tarea. La última
etapa será “Done” (finalizada).
Burndown chart: es una representación gráfica del trabajo que
queda por hacer en un proyecto en el tiempo. Usualmente el
trabajo remanente se muestra en el eje vertical y el tiempo en el
eje horizontal.
Site (o Web Site): es una colección de páginas de Internet
relacionadas y comunes a alguna temática.