Backtesting de Bitcoin

El Bitcoin, un dinero criptográfico que no depende de ningún banco central o Gobierno, se está consolidando como la alternativa digital al papel moneda. El 2017 apunta a ser recordado como uno de los años más importantes para Bitcoin, las criptomonedas y la tecnología blockchain, con un crecimiento que ha superado todas las expectativas: las predicciones para este año apuntaba a superar los tres mil dólares estadunidenses. En tan solo seis meses esta cifra fue superada en algunas casas de cambio y las proyecciones ahora se colocan más cercanas a los cinco mil.

Si cerraremos el año arrollando esa cota o con una dolorosa corrección nadie en su sano juicio lo sabe ya que, además de la madurez progresiva en la adopción de la tecnología, tras esta apreciación asombrosa también hay un fuerte componente especulativo, espoleado por el establecimiento de la favorable ley de criptomonedas en Japón el año pasado que ha llevado al yen a ser la moneda fiduciaria más usada para el intercambio con bitcoins, ejemplo que está siendo replicado en otros países. En todo caso esta cadena de eventos ha colocado a las criptomonedas frente a una audiencia inversora mucho mayor, aumentando la profundidad de las casas de cambio y posibilitando así el uso del análisis técnico como herramienta de trading activo.

Como prevenir es de sabios, estaremos interesados en poder probar nuestras estrategias antes de usarlas, así que dedicaremos este artículo a integrar las criptomonedas en nuestro entorno de backtesting financiero. Si no lo conocen todavía, les recomiendo que se inicien en este artículo y también que descarguen el repositorio complementario de GitHub con el código fuente.

Datos de Bitcoin

Ya sabe nuestro querido lector que los datos son el agua de la vida que nutre al resto del jardín experimental. Sin ellos, sólo desierto. Por fortuna los podemos obtener gratuitamente a través de la API de Quandl. Primero instalaremos el módulo de Quandl para Python con PIP:

pip install quandl

A continuación escribiremos el código que nos va a permitir descargar los datos. Por defecto los obtendremos bajo la forma de un dataframe de pandas.

import quandl


def quandl_bitcoin(instrument, store):
    df = quandl.get(instrument, returns="pandas")
    df.to_csv(store,
        columns=["Open", "High", "Low", "Close", "Volume (Currency)", "Close"],
        header=["Open", "High", "Low", "Close", "Volume", "Adj Close"]
    )

Estas pocas líneas concentran mucha potencia, porque la flexibilidad de pandas nos permitirá transformar los datos al formato “Open, High, Low, Close, Volume, Adj Close” que PyalgoTrade espera. Nótese que por un lado he elegido denominar el Volumen en divisa en lugar de Bitcoins (BTC) para evitar distorsiones, y por otro he simplemente duplicado el Close como Adj Close, porque las criptomonedas ni emiten dividendos ni han tenido ajustes a su valor (de momento siempre que ha habido una escisión, como Bitcoin Cash o Ethereum Classic, se ha creado una moneda separada en lugar de ajustar el precio de la original).

He incluído este código dentro de pyalgoext de forma que ahora a modo de ejemplo podemos bajar todo el histórico de cotización de Bitcoin de la casa de cambio Kraken simplemente con:

from pyalgoext import download

download.quandl_bitcoin("BCHARTS/KRAKENUSD", "data/BTCUSD-KRAKEN.csv")

Ahora tenemos todos los datos dentro de un archivo CSV de la carpeta data llamado BTCUSD-KRAKEN.csv. Vamos a visualizarlo usando los conocimientos de Bitly que adquirimos en el artículo sobre gráficos avanzados (pulse sobre la imagen para obtener su versión interactiva).

Screen Shot 2017-09-24 at 5.43.38 PM
Serie diaria de precios BTCUSD de Kraken

Tenemos el rango 2014-01-07 a 2017-09-23, cubriendo casi cuatro años de datos… pero… ¿Qué sucede por ejemplo el 19 de Febrero del 2016? ¿El precio se va a cero? La novedad de Bitcoin conlleva este tipo de problemas. Hemos de recordar que las criptomonedas al igual que la mayor parte del FOREX son mercados OTC en los que no hay un “precio central” sino que cada casa de cambio tiene un precio diferente. Obviamente las discrepancias son mínimas debido al arbitraje, pero los problemas técnicos y gazapos de estas plataformas semi-profesionales provoca distorsiones de este tipo.

Aparte de KRAKEN, podemos recurrir via Quandl a los precios de otras casas como BITSTAMP, ITBIT, o COINBASE. Si lo hace comprobará que en todos ellos se producen este tipo de incómodos Glitches of the Matrix excepto en el caso de Coinbase, lo que muestra su posición como la casa de cambio más madura y estable de que se dispone.

Screen Shot 2017-09-24 at 5.54.41 PM
Serie diaria de precios BTCUSD de Coinbase

Una opción sería promediar series para obtener un “precio real” del activo cada día, pero a parte de su valor académico esto no nos serviría de mucho con algoritmos que tienen que lidiar con la práctica y pueden atragantarse con los desfases, así que en su lugar le recomiendo que limite su investigación y su trading a Coinbase (tranquilo, le aseguro que no me llevo ni un duro).

A Medirnos con un Benchmark

Recordarán de artículos previos que de poco nos sirve cantar las bondades de cualquier estrategia de inversión si no tenemos una base con la que compararla. En este caso el Benchmark que elegiremos será la estrategia pasiva por antonomasia: comprar y mantener. A tal efecto he creado el archivo de pruebas BitcoinStrategy.py. Ejecútelo tal como está para obtener los resultados del ESCENARIO 1, el Benchmark:

BTC_SCENARIO_1

Revisemos como estamos acostumbrados las métricas más importantes. Ya que Bitcoin está rabiosamente alcista los resultados son extremadamente buenos: una  fabulosa rentabilidad anual del 262% aunque claro, debamos tragarnos una pérdida máxima del 50%, que se dice fácil pero representa la mitad de nuestro capital.

Rentabilidad: 2880.4083%
Rentabilidad Anualizada: 262.5489%
Volatilidad Anualizada: 78.0558%
Ratio de Sharpe Anualizado: 1.8269
DrawDown Máximo: 50.1132%
DrawDown Más Largo: 173 dias

La rentabilidad obtenida también asume que estamos operando con un apalancamiento de 2 veces el capital inicial de 1 millón de USD, puesto que el análisis técnico difícilmente puede contribuir a un valor en subida libre sin añadir una dosis moderada apalancamiento y queremos que la comparativa sea ceteris paribus (por eso mismo asumimos que cubrimos el USD si nuestra moneda nativa es el EUR).

Estrategia Básica

Sólo tiene que editar la línea 22 de BitcoinStrategy.py para cambiar al segundo escenario, que implementa una sencilla estrategia de cruce de medias móviles similar a la que expusimos en este artículo con detalle.

SCENARIO = 2

BTC_SCENARIO_2

Rentabilidad: 5131.3642%
Rentabilidad Anualizada: 348.8211%
Volatilidad Anualizada: 95.5086%
Ratio de Sharpe Anualizado: 1.7683
DrawDown Máximo: 35.2527%
DrawDown Más Largo: 209 días

La rentabilidad aumenta de una forma sustancial y, notablemente, conseguimos reducir la pérdida máxima a un 35% que escuece menos. Pero como buenos profesionales que somos no vamos a dejarnos encantar por estos cantos de sirena, ya que asumir una volatilidad mucho superior nos conduce a un ratio de Sharpe inferior, es decir, a una peor ecuación rentabilidad / riesgo en términos netos.

Estrategia Avanzada

Vamos ahora a combinar los elementos básicos de nuestra estrategia con uno de los indicadores que el completísimo paquete de análisis técnico TA-Lib pone a nuestra disposición y que nuestro entorno integra con gran facilidad. En concreto usaremos el Oscilador Aaron que explota los rangos entre cénits y nadires de la cotización como explicamos en detalle en este artículo anterior, además de cubrir los aspectos técnicos de la integración de TA-Lib.

SCENARIO = 3

BTC_SCENARIO_3.png

Rentabilidad: 7640.8544%
Rentabilidad Anualizada: 420.7632%
Volatilidad Anualizada: 93.0483%
Ratio de Sharpe Anualizado: 1.9331
DrawDown Máximo: 32.6258%
DrawDown Más Largo: 164 días

Ahora sí que mediante la combinación de medias móviles y el oscilador que, recordemos, no son un refrito del mismo dato sino que exploran diferentes aspectos del precio, los resultados justifican el esfuerzo. Nuestra rentabilidad anualizada asciende a un 420%, al punto que justifica el incremento en volatilidad y nos proporciona un fantástico ratio de Sharpe, además de lograr contener aún más la pérdida máxima.

Caminante No Hay Camino

Se hace camino al andar, así que aquí le dejo unas ideas para que pueda continuar su exploración más allá de sustituir unos indicadores por otros.

Por un lado se podría experimentar incluyendo stops a las estrategias para protegernos de sorpresas. A tal efecto he dejado la clase Python preparada para usar tanto stops de tipo FIXED (stop fijo) como TRAILING (stop que sigue a la cotización con un rango) con tan solo cambiar las valores de las líneas 24 o 25. Sin embargo, tenga en cuenta que como ya comentamos en su momento una buena estrategia tiene sus stops cocidos dentro de las propias reglas, y si hacemos este trabajo bien raramente nos va ayudar un condicionante externo adicional.

Por otro lado aunque no es fácil tomar posiciones cortas en Bitcoin, tampoco resulta tampoco imposible y aquí tiene varios mecanismos al respecto, de manera que podría experimentar usando cortos únicamente (buena suerte en una subida libre) o combinando largos y cortos en una estrategia que sea más neutral al mercado y estar preparado en el caso de que la tendencia se tuerza en serio. Verá que también le he dejado la clase de Python preparada para ello. De nada. ¡Aunque ya se haya acabado el verano, para eso están los amigos!

 

Anuncios

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