El 2017 fue el del rally de las criptomonedas. La capitalización de mercado de todas
las criptomonedas ha pasado de 17,000 millones de dólares hasta más de 760,000
millones en solo un año.
El Bitcoin estaba valorado en 963.74 dólares a principios de 2017, pero se disparó y llegó a cotizar cerca de los 20,000 dólares para cerrar el año en 13,685. Aunque inicialmente se perfilara como una “reserva estable de valor” similar al oro, más allá del alcance de las políticas de los gobiernos, la ausencia de fundamentales y las contrastadas expectativas de los diferentes agentes de mercado han provocado que Bitcoin sea en estos momentos uno de los activos más especulativos del mundo.
Ante esta situación cabe la pregunta: ¿podemos utilizar los recursos del análisis técnico y del trading en tendencia para optimizar nuestras inversiones en criptodivisas? El objetivo de este artículo es mostrar, utilizando un entorno tan realista como nos sea factible, como un sistema muy sencillo de trading basado en indicadores de análisis técnico puede batir a una inversión pasiva en Bitcoin.
Todo el código y otros recursos de este artículo se encuentran disponibles en: https://github.com/isaacdlp/bitcoin
Preparación del Sistema
Contenido del Artículo
Para nuestro backtesting utilizaremos la plataforma backtrader, que es gratuita y de código abierto, lo que una vez nos sintamos cómodos con dicho entorno nos va a permitir modificarlo, extenderlo y adaptarlo a nuestras necesidades de testeo. Además, ya que backtrader está escrito en el lenguaje de programación Python, muy popular entre las comunidades de expertos en el análisis contaremos con otras librerías para poder realizar ciencia de datos avanzada e incluso añadir inteligencia artificial a nuestros sistemas con relativamente poco esfuerzo. Puede conseguir backtrader desde el sitio web https://www.backtrader.com donde también podrá encontrar plenamente documentados el proceso de instalación y primeras pruebas.
El siguiente paso será encontrar información de precios, ya que nuestros resultados solamente serán tan buenos como la calidad de los datos que los sustentan. Un dicho popular en este entorno es: garbage in, garbage out. Si le metes basura, sacarás basura. Por suerte no hemos de desembolsar grandes sumas de dinero para obtener dichas fuentes. Sin ir más lejos el sitio web de Bitcoincharts ofrece todos las datos históricos de trading de Bitcoin para descarga de forma completamente libre. Basta con acudir al enlace http://api.bitcoincharts.com/v1/csv y seleccionar el archivo correspondiente al mercado que se desee utilizar.
Para esta prueba he decidido centrarme en el popular mercado Kraken por su largo histórico (la andadura de este servicio se remonta al 2014). Vamos a proceder a descargar el archivo krakenUSD.csv, lo cual nos llevará un rato porque ocupa casi 500 MB, no en vano contiene todos los trades individuales de Bitcoin desde el inicio del servicio. Si abrimos el archivo veremos que se trata de una serie de hileras con el siguiente aspecto:
1389118697,874.670400000000,0.010690590000
1389118703,883.326140000000,0.010638230000
1389118711,892.067530000000,0.010586140000
Cada hilera corresponde a un tick o transacción y contiene tres valores separados por comas, que de derecha a izquierda significan 1) la fecha del trade, en formato UNIX expresado en milisegundos (por ejemplo 1389118697 corresponde al 7 de Enero del 2014), al precio expresado en dólares estadounidenses (874.670400000000 USD), y finalmente al volumen intercambiado (0.010690590000 Bitcoins o, lo que es lo mismo, 1,069,059 Satoshis).
La parte positiva es que el archivo está ordenado en orden cronológico creciente, es decir, de las transacciones más antiguas a las más recientes según descendemos por el documento, que es el orden con el que backtrader puede trabajar. La parte negativa es que backtrader no puede entender fechas en milisegundos, y además espera un formato de línea con los siguientes campos:
Fecha, Open, High, Low, Close, Volumen, Interés Abierto
Si hay algo que caracteriza a backtrader es su flexibilidad, por lo que con unas pocas líneas de programación podremos adaptar el cargador de datos estándar, llamado GenericCSVData, para adaptarse a esta situación sin necesidad de reescribir los archivos originales. Podrá encontrar dicha adaptación en la clase BitcoinFeed del archivo Resample.py. Sin embargo, hacer un backtest tick a tick puede no ser idóneo por dos razones, una práctica y la otra teórica.
La práctica se debe al volumen de la información que manejamos, que nos va a enlentecer en exceso el mecanismo de testeo. Los recursos exigidos para procesar los datos van a convertir una rutina de minutos en una espera de horas, y eso va a impactar en nuestra capacidad de experimentación.
La teórica es que si analizamos en base a ticks estamos suponiendo que una vez encontremos un sistema viable y queramos operar sobre él, vamos a disponer de la misma resolución de datos cuando nos conectemos al mercado a tiempo real, y eso es mucho suponer: lo más común es que ni dispongamos de dicha granularidad ni seamos capaces de actuar sobre ella para capturar el siguiente tick.
Así que será mucho mejor para nosotros reconvertir la información de ticks en un formato tradicional de velas, con precios Open, High, Low, Close que resumen la actividad en un determinado intervalo de tiempo, así como un Volumen agregado.
Esta operación se conoce como resampling (o, para ser exactos, upsampling ya que pasamos de mayor a menor granularidad temporal) y backtrader cuenta con recursos propios para manejar la tarea sin ningún problema, basta con cargar los datos mediante la función resampledata en lugar de adddata y proporcionar unos pocos parámetros adicionales acerca de cómo queremos que se realice el proceso.
Por nuestra parte, como vamos a estar iterativamente ejecutando una serie de backtests sobre los mismos datos preferimos guardar previamente los datos resumidos en disco para acelerar significativamente el trabajo; esa es la función de nuestro archivo Resample.py. Para nuestro artículo hemos elegido una resolución de 15 minutos – un tiempo razonable para operar, además del hecho de que muchas fuentes de información están retrasadas 15 minutos en su versión de acceso libre – obteniendo pero si lo desea puede modificar la propiedad mins por otro valor en minutos para obtener una granularidad diferente.
El archivo resultante, krakenUSD_15m.csv, además de ser muchísimo más compacto y manejable (6 MB en lugar de 500), cuenta ya con un formato directamente legible por backtrader – con la salvedad de que deberemos rellenar el Open Interest con valores nulos porque carecemos de dicha información.
Benchmark: Escenario Base
Es importante resaltar que para mantener todos nuestros tests ceteris paribus operaremos siempre una cuenta de apenas 1,000 EUR, entrando o saliendo del mercado prácticamente con todo el capital disponible en cuenta (menos un margen de seguridad del 5%). Para acercar nuestro entorno lo más posible a las condiciones reales del mercado, aplicaremos una comisión del 0.3% tanto a las entradas como a las salidas, y tendremos en cuenta el volumen de la barra actual, suponiendo que, debido a la presencia de otros operadores, sólo podemos aspirar a un 25% del volumen de cada barra para llenar nuestras órdenes.
También incluiremos en nuestro sistema un leve apalancamiento de 2. Dicho apalancamiento no es fundamental para que el sistema opere, pero nos permite extraer un plus de rentabilidad en los momentos de subida libre – aunque por otro lado hará más peligrosos los momentos de caída libre, ya que el efecto multiplicador del apalancamiento opera tanto para las pérdidas como para las ganancias. Por supuesto, este apalancamiento no implica que nuestro bróker nos posibilite operar con cuentas apalancadas o comprar con margen, puede ser tan sencillo como pedir prestado otros 10,000 EUR a nuestro tío rico con el acuerdo de devolverle dicho capital inicial al final de nuestro periodo de inversión.
Finalmente, para evaluar si nuestro sistema es bueno o no, hemos de compararlo siempre con un escenario base o benchmark. Ya que en el fondo queremos evaluar si nuestra acción sobre la criptodivisa produce un resultado positivo, lo más sensato será compararlo con… no actuar. Es decir, una estrategia pasiva consistente simplemente en comprar y mantener el valor durante el periodo de inversión, lo que se conoce como Buy & Hold o, en la jerga del criptomundo, HODL (término que aparece cuando un usuario borracho publica la errata en un post del Forum de Bitcoin de Diciembre del 2013 – “I AM HODLING” – para tal regodeo del resto de la comunidad que, al parecer, hizo historia). Nuestro escenario base se encuentra en el archivo BitcoinBenchmark.py. Tras ejecutarlo obtendremos los resultados del Gráfico 1:
End value 13,587.4801
Sistema en Tendencia
Nuestro sistema en tendencia se encuentra en el archivo BitcoinAlgo.py. Para su creación vamos a utilizar unos indicadores muy simples de análisis técnico y bastante conservadores, una serie de cruces de medias móviles.
Para entrar en una posición vamos a esperar hasta que se produzca un cruce al alza entre dos medias móviles – una lenta, y otra rápida – sobre el precio de cierre. A la inversa, saldremos de la posición cuando se produzca un cruce a la baja entre ambas medias móviles. En ambos escenarios pediremos también que el movimiento en precios se vea acompañado igualmente por un aumento de la cantidad bajo trading para confirmar la tendencia – en este caso representado mediante una media móvil sobre el volumen de mercado.
Tras ejecutar nuestro sistema en tendencia obtendremos los resultados del Gráfico 2:
End value 227,820.2741
Frente a una rentabilidad del 1,200% con el escenario base, nuestro sencillo sistema nos proporciona una rentabilidad superior al 22,000%. Nada mal para empezar.
Prueba por Periodos
Antes de terminar vamos a realizar otra prueba bastante simple para comprobar si las mejorías de nuestro sistema se producen solamente en un entorno de mercado particular o si, en cambio, se mantienen a lo largo de perfiles de mercado marcadamente dispares.
A tal efecto vamos a ejecutar nuestras pruebas para tres periodos distintos:
- El mercado esencialmente lateral de inicios del 2014 a inicios del 2017.
- El mercado claramente alcista del 2017.
- El mercado bajista a partir de inicios del 2018.
Backtrader hace esta tarea muy fácil al permitirnos delimitar el rango de aplicabilidad de nuestro análisis en los parámetros de carga del feed, mediante las propiedades fromdate y todate:
data = BitcoinFeed(
name=”BTC”,
dataname=”krakenUSD_15m.csv”,
timeframe=bt.TimeFrame.Minutes,
fromdate=dt.datetime(2017, 1, 1),
todate=dt.datetime(2018, 1, 1),
nullvalue=0.0)
Si ejecutamos los análisis pertinentes obtendremos los siguientes resultados, donde comprobamos que el sistema bate al benchmark en todos los entornos de mercado:
- El mercado esencialmente lateral de inicios del 2014 a inicios del 2017.
– Benchmark: 1,195.2990
– Sistema: 5,249.9300
- El mercado claramente alcista del 2017.
– Benchmark: 27,428.6104
– Sistema: 34,798.3657
- El mercado bajista a partir de inicios del 2018.
– Benchmark: -41.2294
– Sistema: 680.4281
Artículo escrito por Isaac de la Peña y Carlos Doblado en TRADERS´ Magazine edición Julio-Agosto 2018
Descargar edición Julio – Agosto 2018
Click en el enlace para leer y descargar esta edición.
[restrict …]
CLICK AQUÍ PARA VER Y DESCARGAR
[/restrict]