Aunque en un principio se posicionaba como una “reserva estable de valor” similar al oro, fuera del alcance de las políticas de los gobiernos, la falta de fundamentos y las expectativas variadas de los diferentes actores del mercado han provocado que Bitcoin se haya convertido en uno de los activos más especulativos del mundo en la actualidad.
Ante este escenario surge la pregunta: ¿podemos utilizar los recursos del análisis técnico y del trading en tendencia para optimizar nuestras inversiones en criptomonedas? El objetivo de este artículo es mostrar, utilizando un entorno lo más realista posible, cómo un sistema muy sencillo de trading basado en indicadores de análisis técnico puede superar a una inversión pasiva en Bitcoin.
Trading con criptomonedas
Preparación del sistema
Para nuestro backtesting utilizaremos la plataforma backtrader, que es gratuita y de código abierto, lo que una vez que nos sintamos cómodos con dicho entorno nos va a permitir modificarlo, extenderlo y adaptarlo a nuestras necesidades de testeo. Además, dado que backtrader está escrito en Python, un lenguaje de programación muy popular entre las comunidades de expertos en análisis, contaremos con otras librerías para realizar ciencia de datos avanzada e incluso añadir inteligencia artificial a nuestros sistemas con relativamente poco esfuerzo.
El siguiente paso será encontrar información de precios, ya que nuestros resultados solo serán tan buenos como la calidad de los datos en los que se basen. Un dicho popular en este entorno es: garbage in, garbage out. Si le metés basura, vas a obtener basura. Por suerte, no es necesario desembolsar grandes sumas de dinero para obtener estas fuentes. Sin ir más lejos, el sitio web de Bitcoincharts ofrece todos los datos históricos de trading de Bitcoin para descarga de forma completamente gratuita.
Para esta prueba, he decidido centrarme en el popular mercado Kraken por su largo historial (el servicio comenzó en 2014). Vamos a proceder a descargar el archivo krakenUSD.csv, lo cual nos llevará un rato porque ocupa casi 500 MB, ya que contiene todas las operaciones individuales de Bitcoin desde el inicio del servicio. Si abrimos el archivo, veremos que se trata de una serie de líneas con el siguiente aspecto:
Cada línea corresponde a un tick o transacción y contiene tres valores separados por comas, que de izquierda a derecha significan:
1389118697,874.670400000000,0.010690590000 1389118703,883.326140000000,0.010638230000 1389118711,892.067530000000,0.010586140000
Cada línea corresponde a un tick o transacción y contiene tres valores separados por comas, que de izquierda a derecha significan:
- La fecha de la transacción, en formato UNIX expresado en milisegundos (por ejemplo, 1389118697 corresponde al 7 de enero de 2014),
- El precio expresado en dólares estadounidenses (874.670400000000 USD), y
- El volumen intercambiado (0.010690590000 Bitcoins o, lo que es lo mismo, 1,069,059 Satoshis).
Lo positivo es que el archivo está ordenado cronológicamente de manera ascendente, es decir, desde las transacciones más antiguas hasta las más recientes conforme descendemos por el documento, que es el orden con el que backtrader puede trabajar. Lo negativo es que backtrader no puede entender fechas en milisegundos y, además, espera un formato de línea con los siguientes campos:
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 adecuarse a esta situación sin necesidad de reescribir los archivos originales. Podrás encontrar dicha adaptación en la clase BitcoinFeed del archivo Resample.py. Sin embargo, hacer un backtest tick a tick puede no ser ideal por dos razones, una práctica y otra teórica. La práctica se debe al volumen de la información que manejamos, que va a enlentecer en exceso el proceso de testeo. Los recursos exigidos para procesar los datos convertirán una rutina de minutos en una espera de horas, lo que impactará nuestra capacidad de experimentación.
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 adecuarse a esta situación sin necesidad de reescribir los archivos originales. Podrás encontrar dicha adaptación en la clase BitcoinFeed del archivo Resample.py. Sin embargo, hacer un backtest tick a tick puede no ser ideal por dos razones, una práctica y otra teórica. La práctica se debe al volumen de la información que manejamos, que va a enlentecer en exceso el proceso de testeo. Los recursos exigidos para procesar los datos convertirán una rutina de minutos en una espera de horas, lo que impactará 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 en 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 ejecutando una serie de backtests sobre los mismos datos de forma iterativa, 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 – pero si lo deseás, podés 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.
Date, Open, High, Low, Close, Volume
2014-01-07 18:30:00, 883.32614, 892.06753, 874.48165, 874.48165, 0.04276811 2014-01-07 19:15:00, 866.10944, 866.10944, 860.0, 860.0, 0.17440196000000002 2014-01-07 19:30:00, 870.0, 870.0, 830.00001, 835.02002, 6.227191829999995
Benchmark: escenario base
Es importante resaltar que, para mantener todos nuestros tests ceteris paribus, operaremos siempre con 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, solo 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. Este 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 permita operar con cuentas apalancadas o comprar con margen, puede ser tan sencillo como pedir prestados 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, siempre debemos compararlo con un escenario base o benchmark. Ya que, en el fondo, queremos evaluar si nuestra acción sobre la criptomoneda 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 Foro de Bitcoin en diciembre de 2013 – “I AM HODLING” – para tal regocijo 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
Ejemplo de backtest de benchmark
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 en el volumen operado 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.
Ejemplo de sistema en tendencia
Prueba por periodos
Antes de terminar, vamos a realizar otra prueba bastante simple para comprobar si las mejoras 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 diferentes.
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 facilita esta tarea 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 supera al benchmark en todos los entornos de mercado. Nos remontamos a ejemplos de los inicios:
- 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
El análisis técnico para maximizar rendimientos
En resumen, aunque Bitcoin ha demostrado ser uno de los activos más especulativos del mundo, un enfoque disciplinado basado en análisis técnico y trading en tendencia puede ofrecer rendimientos significativamente superiores a una estrategia pasiva de compra y mantenimiento.
A través de la correcta preparación del sistema, la optimización del manejo de datos y el uso de indicadores simples pero efectivos, es posible no solo proteger nuestras inversiones en criptomonedas, sino también sacar provecho de las oportunidades del mercado. Esta metodología se presenta como una herramienta valiosa para quienes buscan maximizar sus ganancias en un entorno volátil como el de las criptomonedas.
A través de la correcta preparación del sistema, la optimización del manejo de datos y el uso de indicadores simples pero efectivos, es posible no solo proteger nuestras inversiones en criptomonedas, sino también sacar provecho de las oportunidades del mercado. Esta metodología se presenta como una herramienta valiosa para quienes buscan maximizar sus ganancias en un entorno volátil como el de las criptomonedas.