Festival de Indicadores

Los indicadores son como lupas cuyo poder de aumento nos permite fijarnos en aspectos concretos de unos mercados financieros complejos y continuamente cambiantes con la esperanza de de durante el proceso no aislaremos en exceso la perspectiva, forzosamente sesgada, ni distorsionaremos demasiado la realidad. Para ello conviene contar con un buen arsenal de lentes que nos puedan funcionar bajo condiciones muy diversas.

Ya hemos visto que nuestro entorno de backtesting no sólo cuenta con la mayoría de los indicadores más comunes en el análisis técnico, sino que permite extender dichas clases para crear cualquier indicador que podamos necesitar, como por ejemplo nuestros organizadores de análisis fundamental. Por si fuera poco, también podemos integrar otras librerías que ponen a nuestra disposición, literalmente, cientos de indicadores con muy poco esfuerzo. Veamos cómo hacerlo.

Librería de Análisis Técnico

Entre los indicadores que PyAlgoTrade nos proporciona en el módulo pyalgotrade/technical podemos encontrar cruces de líneas, ratios, acumuladores, medias móviles, tasas de cambio (ROC), de cenit y nadir, ATRs, RSIs, MACDs, indicadores de Bollinger, Hurst y estocásticos entre otros. ¿Pero qué sucede si, por ejemplo, nos apetece experimentar con martillos? ¿O con patrones de tipo Harami?

Gracias al genio de su autor Gabriel Martín Becedillas, PyAlgoTrade también contiene el módulo pyalgotrade/talibext que nos permite integrar en nuestro entorno de backtesting TA-Lib, una de las más populares “librerías” (bien, la traducción correcta del inglés library sería “biblioteca”, pero no nos pongamos a luchar contra molinos de viento) de indicadores técnicos del mundo, utilizada en múltiples aplicaciones como EclipseTrader, MATLAB y Trade Strategist.

El catálogo de 200 indicadores implementado en su última versión 0.4.9 es realmente impresionante: aquí tiene la lista completa para abrir boca. Y lo mejor: una licencia gratuita de código abierto. Vea y compare con la plataforma cerrada que le proporciona su broker. ¡Difícilmente se puede pedir más!

magnifier

Instalación

El proceso de instalación implica primero instalar la librería TA-Lib, y a continuación un adaptador específico para Python. Por desgracia este proceso no es simple y nos puede dar bastantes quebraderos de cabeza, así que le aconsejo encarecidamente que se ciña a las recomendaciones siguientes.

Si usted es el afortunado propietario de un Mac, lo mejor que puede hacer es utilizar el instalador de paquetes brew para la librería:

> brew install ta-lib

Y a continuación el propio instalador de Python para el adaptador:

> pip install TA-Lib

Sin embargo nuestra serie de artículos está orientada a usuarios de Windows y no nos vamos a olvidar de ustedes. En su caso la mejor solución es usar el instalador de Python para todo, pero usando una distribución binaria empaquetada mediante el sistema Wheel específica para su sistema. Las puede encontrar aquí:

http://www.lfd.uci.edu/~gohlke/pythonlibs/#ta-lib

Lo más probable es que necesite TA_Lib-0.4.9-cp27-none-win32.whlTA_Lib-0.4.9-cp27-none-win_amd64.whl dependiendo si su sistema es de 32 o (lo más común hoy en día) 64 bits. Abra una intérprete de comandos, vaya a la carpeta donde lo ha descargado y ejecute:

> pip install TA_Lib-0.4.9-cp27-none-win_amd64.whl

¡Todo listo para trabajar! Ahora tiene a su disposición en Python el nuevo módulo talib. Si quisiera utilizarlo directamente escribiría algo como lo siguiente:

import numpy
import talib

data = numpy.random.random(100)
upper, middle, lower = talib.BBANDS(data, matype=talib.MA_T3)

Pero en nuestro caso lo vamos a integrar con nuestro entorno de backtesting de una forma mucho más productiva.

Aroon

Para nuestro ejemplo vamos a trabajar con el Oscilador Aroon, desarrollado por Tushar Chande en 1995; un sistema que determina si un activo está en tendencia o no y cuán fuerte es (“Aroon” significa “Luz del Amanecer” en Sánscrito). Hay dos indicadores separados: Aroon-Up y Aroon-Down que miden el número de periodos desde que se consiguió un cenit o un nadir, respectivamente, dentro de un rango tradicionalmente de 25 sesiones. El oscilador combina ambos indicadores normalizados para facilitar comparativas y es diferente de los osciladores típicos de momento, que se centran en precio relativo al tiempo, ya que trabaja en tiempo relativo al precio, con lo que puede resultar bastante complementario.

Seguiremos trabajando con activos del IBEX 35 tal y como hicimos en nuestra introducción a la metodología Fusión pero en esta ocasión dejaremos de lado los fundamentales y nos concentraremos en un sólo título en lugar de una cartera multiactivo para trazar mejor los efectos de los indicadores técnicos. Aleatoriamente hemos elegido Gas Natural (GAS.MC) aunque luego usted podría (y debería) continuar sus experimentos con otros activos.

Descargue este archivo https://github.com/isaacdlp/pyalgosamples/blob/master/talib/TaLibStrategy.py que contiene los sistemas que vamos a utilizar. Al igual que en otros ejemplos previos encontrará en la primera línea una variable que le permitirá cambiar fácilmente de escenario.

SCENARIO = 1

Por su parte la información está disponible en la base de datos del IBEX 35 que creamos con anterioridad (en cuyo caso presuponemos que cuenta con la extensión dbfeed.py con el fin de conectar con dicha almacén). Pero para facilitarle el trabajo a los que se acaban de incorporar también he extraído la información específica de Gas Natural en un archivo separado por comas GAS.MC.csv con formato de Yahoo Finance. En caso de que quiera trabajar con esta opción colóquelo en la misma carpeta que el fichero de las estrategias. Para cambiar entre una y otra sólo debe modificar la variable:

DBFEED = False

Con True usaremos la base de datos, con False usaremos el archivo separado por comas. ¿Sencillo, verdad? ¡Vamos allá!

1: Benchmark

Nuestro primer sistema va a determinar el Benchmark mediante, como ya es habitual entre nosotros, una estrategia meramente pasiva: comprar al inicio del periodo (Marzo del 2002) y aguantar el valor contra viento y marea (Enero del 2016). Los indicadores no pintan nada en este contexto. Ejecute el Escenario 1 para obtener los siguientes resultados.

Escenario 1
Ratio de Sharpe 25.86
Rentabilidad Anualizada 3.75%
Rentabilidad Acumulada 71.32%
Volatilidad 25.21%
Pérdida Máxima 75.43%

Buena suerte viendo esfumarse tres cuartas partes de su capital a cambio de un magro 3.75% anual. Que le reserven una habitación en urgencias.

2: Técnico Básico

En este escenario aplicaremos una de nuestras estrategias anteriores que combina medias móviles y MACDs sobre precio y volumen para alternar tanto posiciones largas como cortas según surjan oportunidades. No introducimos nada nuevo, simplemente lo aplicamos a GAS.MC de forma aislada. Ejecute el Escenario 2.

Escenario 2
Ratio de Sharpe 44.40
Rentabilidad Anualizada 6.29%
Rentabilidad Acumulada 143.76%
Volatilidad 15.81%
Pérdida Máxima 29.15%

Prácticamente hemos duplicado nuestra rentabilidad anual, reducido la volatilidad a la mitad, y la pérdida máxima a un tercio con nuestra estrategia. No está mal.

Screen Shot 2016-08-06 at 9.42.38 AM

Fíjese también en el detallado informe que obtenemos en pantalla. Aunque cuando estemos operando en el mercado real es altamente recomendable utilizar estrategias multiactivo, realizar experimentos en el laboratorio con sólo un título nos permite aislar efectos y entender mejor las interacciones entre los diferentes indicadores.

3: Técnico Avanzado

A continuación vamos a introducir el oscilador Aroon. Para ello tendremos que entender antes qué es lo que TA-Lib espera de nosotros. Mientras que que PyAlgoTrade guarda internamente los datos en series (las clases SequenceDataSeries que componen la mayoría de sus indicadores), TA-Lib los manipula externamente mediante matrices numéricas. No hay nada erróneo en ello, son escuelas de programación diferentes: TA-Lib está más cercano a un estilo funcional mientras que PyAlgoTrade se encuentra más orientado a objetos (lo cual personalmente prefiero). Así escribiremos:

barDs = self.getFeed().getDataSeries(instrument)
aroon = indicator.AROONOSC(barDs, 10, 5)
print aroon

Es decir, pasamos una serie de barras al oscilador, indicando que de ellas extraiga una matriz con las 10 últimas jornadas y calcule el Aroon de 5 sesiones. Visualizaremos este resultado que puede resultar un tanto confuso:

[  nan   nan   nan   nan   nan -100.  -80.  -40.  -40.   80.]

Como pasamos 10 sesiones y se precisan 5 para calcular el Aroon, sólo podremos obtenerlo para los últimos 5 días (por ejemplo, el día -6 precisa de los valores -7 a -11, lo cual se sale del rango disponible) y es por eso que vemos cinco resultados nan. Del resto, el que realmente nos interesa es el resultado de la última jornada:

print aroon[-1]

Es decir, el número 80, alcista (Aroon oscila entre 100 y -100).

Conviene tener cuidad cuando creamos nuestras SequenceDataSeries para inicializarlas con una longitud de cola suficiente, tal y como explicamos en este artículo. Si la cola es menor que el tamaño de la matriz no habrá suficientes datos para computar y sólo obtendremos nan.

Por último es importante fijarse en la firma del método TA-Lib que estamos usando. Si el parámetro se llama barDs necesitamos una secuencia de barras completas (como con AROONOSC), pero si se llama ds (como con LINEARREG_SLOPE) precisamos una secuencia de datos simples (precios, volúmenes, u otros), en cuyo caso escribiremos (usando como ejemplo la serie de datos de cierre):

closeDs = barDs.getCloseDataSeries()
linreg = indicator.LINEARREG_SLOPE(closeDs, 10, 5)
print linreg

No se preocupe si todos estos temas avanzados le suenan a chino, manejarlos con maestría requiere su práctica y tampoco lo necesita ahora para completar este ejemplo. Ejecute el Escenario 3 y evaluemos sus resultados:

Escenario 3
Ratio de Sharpe 74.42
Rentabilidad Anualizada 11.29%
Rentabilidad Acumulada 407.62%
Volatilidad 16.30%
Pérdida Máxima 24.21%

Explotando las sinergias entre indicadores conseguimos prácticamente duplicar de nuevo el retorno anual sin impacto negativo en las demás métricas, lo cual nos lleva a convertir ese magro 71.32% en un 407.62% de rentabilidad acumulada al final del periodo, teniendo por supuesto en cuenta las comisiones por el mayor número de operaciones como es habitual.

Sin duda un factor importante en nuestros logros se debe al hecho de que nuestras lentes están incorporando nueva información: las medias móviles trabajan sobre el precio de cierre, nuestros MACDs incluyen el volumen y finalmente el oscilador se encarga de extraer señales del cenit y el nadir, matices de la realidad que habíamos descartado previamente.

Con demasiada frecuencia los analistas técnicos componen intrincadas pócimas de amor financiero sin darse cuenta de que toda su alquimia no son sino diferente refritos de un único ingrediente primario (el precio de cierre, por ejemplo). Volveremos a hablar más adelante acerca de este importante punto frecuentemente ignorado.

¡Por último, fíjese que el informe que obtenemos también incluye el oscilador Aroon! ¿Cómo hemos conseguido esto? Aunque TA-Lib no utilice el mismo formato que PyAlgoTrade, podemos envolver sus matrices en una SequenceDataSeries personalizada con el propósito de incorporarla a nuestros gráficos, de la manera siguiente:

# Al iniciar la estrategia
self._aroon = dataseries.SequenceDataSeries()
# Con cada barra de la secuencia
self._aroon.appendWithDateTime(self.getCurrentDateTime(), aroon[-1])
# Una vez la estrategia ha acabado
if hasattr(myStrategy, '_aroon'):
 subPlot = plt.getOrCreateSubplot("Aroon")
 subPlot.addDataSeries("Aroon", myStrategy._aroon)

Les ruego que me disculpen, en esta ocasión la longitud del artículo se me ha ido de la mano pero había que tocar muchos temas complejos y, espero, interesantes en nuestro aprendizaje de backtesting financiero. ¡Les agradezco la paciencia y si les ha gustado, por favor no olviden compartirlo en sus redes sociales!

Anuncios

Un comentario en “Festival de Indicadores

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s