Introducción al Backtesting

La reciente zozobra de los mercados financieros me ha tenido atado a la pantalla del ordenador más de lo que podría haber deseado y sin duda de lo que cualquier médico hubiese recomendado, con la tarea de optimizar nuestros algoritmos de trading y asegurarnos de que nuestras estrategias de inversión están listas para capear temporales. El esfuerzo es todo menos académico: no en vano nos debemos a los muchos clientes, grandes y pequeños, que han depositado su confianza en Ágora EAFI, entre los cuales nos contamos también nosotros mismos, invirtiendo hasta el 90% de nuestros ahorros en los mismos vehículos y estrategias que recomendamos, algo digno de mención en una industria yerma de emprendimiento y demasiado poblada por consultores que acaudalan con los riesgos de otros. Aquí lo pasamos bien todos, o la muñeca va al río.

En estos menesteres y a través de conversaciones con gente activa en los mercados, me ha parecido percibir una cierta carencia de rigor a la hora de validar los méritos de sus estrategias de inversión. En múltiples ocasiones he asistido a una ardiente defensa de ciertas señales de entrada o salida, en base a su tremenda efectividad en dos o tres operaciones (realizadas recientemente o extraídas de un libro escrito por un amigo), sólo para descubrir que el interlocutor no se había preocupado de consultar las otras siete u ocho ocasiones en las cuales dicho indicador había fallado estrepitosamente. Y créanme que lo peor de todo resulta convencer con tales argumentos, porque una estrategia que funciona sólo dos de cada diez veces puede ser perfectamente viable, siempre y cuando se gane proporcionalmente mucho más en los aciertos que en los fallos. Pero en la mayoría de los casos las opiniones no se fundamentan en análisis ninguno, y ahí está el problema. Por favor, dense cuenta de que esto no significa la defensa de la inversión automatizada. Muchas personas recelan del uso de computadores en el trading precisamente por ese aspecto, el miedo al Skynet de turno que se dedica a enviar desbocadas órdenes de compra y venta como quien lanza pepinos nucleares entre Rusia y USA. Pero a menos que usted se dedique al high frequency trading o a la inversión intradiaria en general, lo cierto es que para la inversión en tendencia diaria o semanal los tiempos de reacción son suficientemente amplios para que los computadores le asistan en la toma de decisiones, y luego usted decida realizar la ejecución de órdenes como más le convenga, fax inclusive.

Por otro lado tampoco significa una defensa de la automatización de la toma de decisiones, es decir, de ceñirse a rajatabla a lo que el sistema indique ignorando el contexto: usted siempre puede decidir aplicar una exposición menor debido al débil entorno macro, o no ejecutar la operación debido a su experto conocimiento de la industria a la que pertenece la empresa en cuestión, ambas variables exógenas al sistema. Ahora bien, es cierto que la excepción debería ser eso, excepcional, y no la regla en su toma de decisiones, porque de otro modo puede que fuera más lógico cambiar de metodología. A menudo las excepciones no son un vehículo para que entre nueva información en el sistema, sino nuestras emociones (hábitos, prejuicios, miedos), y los seres humanos somos notoriamente propensos a hacernos trampas al solitario.

Un día mi socio Carlos Doblado dijo algo brillante: “tenemos reglas para no hacernos preguntas”. Bien documentados por el campo de las finanzas conductuales  (behavioral finance) están los múltiples sesgos psicológicos que afectan nuestras decisiones, herencia de un hipotálamo útil para sobrevivir en la selva tropical  pero poco aconsejable para triunfar en la de los mercados financieros modernos.

Y cabe decir que, si en ocasiones usted se permite cierta arbitrariedad dentro de su metodología, razón de más para interesarse por saber qué hubiese ocurrido de no haberlo hecho; porque si al ceñirse al programa obtiene mejores resultados a largo plazo es una señal reveladora de que tal vez su intuición necesita en ocasiones comportarse un poco. En definitiva, poner a prueba su metodología va sin duda a convertirle en una persona más crítica, más rigurosa, y mejor preparada para la actividad inversora.

La piedra angular de dicha tarea es el backtesting: ya que no disponemos de datos futuros, utilizamos datos históricos para estimar cuales hubiesen sido los resultados de aplicar su estrategia en el pasado. Los resultados serán muy dependientes tanto de la cantidad como de la calidad de la información (mejor contra más casos, más precisos y más recientes), lo cual normalmente implica tenerse que manejar con cantidades enormes de datos a lo largo amplios horizontes temporales. Tan pronto como queramos manejar más de un activo o usar reglas mínimamente elaboradas, Excel se nos va a quedar pequeño.

La ausencia de medios asequibles es lo que tradicionalmente ha constreñido esta actividad a una audiencia más profesional, pero la buena noticia es que hoy en día existen herramientas gratuitas que con poco esfuerzo nos pueden dar resultados excelentes, y en esta serie de posts me gustaría poder ayudar a mis lectores a dar sus primeros pasos para que puedan crear sus propios entornos de backtesting.

En esta línea de bricolaje financiero doméstico voy a suponer que los lectores utilizan una plataforma Windows, con poca o nula experiencia en programación, y voy a primar herramientas y técnicas que sean accesibles y adaptables, en general lo que se conoce como código abierto (open source). Existen buenos entornos de backtesting ligados a varios productos comerciales y sin duda les dedicaré algunos posts en el futuro, pero debido a su estructura cerrada es mucho más probable que nos topemos rápidamente con limitaciones si nuestra estrategia se desvía de la norma, y en una industria que recompensa el pensar diferente que el grupo eso es algo a tener muy en cuenta.

Por poner un ejemplo, en Ágora EAFI hemos invertido en la creación de nuestras propias herramientas de backtesting, un entorno de big data que maneja cientos de millones de datos, correspondientes a los últimos veinte años de actividad en los mercados europeos y estadounidenses. Estos datos, que provienen tanto de fuentes públicamente accesibles como series privadas, combinan indicadores puramente técnicos con criterios fundamentales y de sentimiento inversor, orientándonos a través de una metodología de inversión un tanto diferente de lo tradicional en cuanto que no se basa en señales discretas de operación, sino en robustez relativa de los activos para la creación de carteras diversificadas. Antes de intentar correr vamos a aprender a caminar, pero valga esto en cuanto a la importancia de la flexibilidad y la adaptabilidad.

Librería

Vamos a comenzar por PyAlgoTrade, una excelente librería open source de backtesting creada por Gabriel Martín Becedillas. Además de ser un paquete de código robusto y bien estructurado, PyAlgoTrade tiene la ventaja adicional de estar desarrollado en Python, un lenguaje de programación moderno, expresivo, flexible, y mayoritariamente elegido por la comunidad de datólogos (data scientists) como el digno heredero del lenguaje científico R con lo que disponemos de una amplia selección de módulos en Python para realizar tareas de análisis estadístico, financiero, visualización de datos, e incluso búsqueda de patrones, machine learning y redes neurales que podemos más adelante conectar a nuestro entorno.

Si no tenemos ya un intérprete de Python instalado en nuestra máquina tenemos que comenzar por ahí, descargando el ejecutable correspondiente desde:

https://www.python.org/downloads/

Es muy importante que:

  • Elijamos la versión 2.7.11 de Python (compatible con PyAlgoTrade).
  • Durante el proceso de instalación, nos aseguremos de marcar la opción “Add Python.exe to PATH”, de manera que podamos ejecutar instrucciones de Python directamente en la línea de comandos. Si no, deberemos incluirlo más tarde.

La distribución de Python incluye pip, una útil herramienta para instalar paquetes de Python si necesidad de que nos preocupemos de dependencias entre módulos ni otras tareas de fontanería informática. Así que a partir de aquí instalar PyAlgoTrade es tan sencillo como abrir una línea de comandos (ejecutar “cmd”, por ejemplo) y escribir:

C:\> pip install PyAlgoTrade

Algunos usuarios han reportado problemas al ejecutar este comando en Windows, que se solventan cambiando a pip install –no-cache-dir PyAlgoTrade.

También es posible que, al ejecutar las estrategias que vamos a presentar a continuación, le surjan errores del tipo ImportError: No module named matplotlib.pyplot, en este caso por faltar en su entorno el módulo de representación gráfica. Puede instalar éste y otros que necesite también mediante pip:

C:\> pip install matplotlib

Ahora vamos a crear una nueva carpeta en nuestro ordenador para contener todo nuestro trabajo de backtesting, por ejemplo en C:\backtesting. Realmente no importa dónde se encuentre mientras sea fácilmente accesible.

Todos los ejemplos que verás aquí y en capítulos posteriores te los puedes bajar del repositorio de GitHub PyAlgoSamples.

Datos

Como ya mencionamos los datos son la gasolina de nuestro Ferrari, poco lejos llegaremos con el tanque vacío por muy flamante que sea. Afortunadamente disponemos de fuentes públicas y gratuitas con las que comenzar en Yahoo Finance. Por ejemplo, vamos a consultar la cotización de Amadeus IT:

http://finance.yahoo.com/q?s=AMS.MC&ql=1

PyAlgoTrade tiene una gran integración con Yahoo Finance. Por ejemplo, si queremos bajarnos el histórico de precios para Amadeus en el 2015, ejecutemos esta instrucción en la línea de comandos:

C:\backtesting> python -c "from pyalgotrade.tools import yahoofinance; yahoofinance.download_daily_bars('AMS.MC', 2015, 'AMS.MC-2015.csv')"

Inmediatamente veremos un nuevo archivo “AMS-2015.csv” en nuestra carpeta. Este formato CSV (Comma-Separated Values) se puede consultar directamente en Excel. Así de cómodo y sencillo.

Nota Mayo 2017! Yahoo ha dejado de proporcionar esta API (el anuncio está aquí). La opción es descargar los archivos manualmente con la función de descarga del web, o bien utilizar esta solución a través de pandas_datareader. Para ello tenéis que importar dos módulos nuevos:

C:\backtesting> pip install pandas_datareader
C:\backtesting> pip install fix_yahoo_finance

Contáis con un ejemplo completo en este archivo BasicYahooFix del proyecto en GitHub.

Estrategia

Vamos ahora a crear una estrategia básica de prueba usando una Media Móvil Simple o SMA (Simple Moving Average). El SMA es un indicador técnico de fuerza relativa muy común que nos ayuda a suavizar los movimientos de los precios a lo largo de varias sesiones y cuya ruptura puede indicar potencial de crecimiento o caída en un activo.

Por ejemplo con un presupuesto inicial de $1000 compraremos 25 acciones de Amadeus cuando el precio ajustado de la sesión supere el SMA de los últimos 10 días, y cerraremos la posición en la situación inversa; cuando la SMA supere al precio.

Esto nos va a requerir escribir unas líneas de código en Python, y aunque es técnicamente posible hacerlo en una aplicación tan sencilla como el Bloc de Notas de Windows, es siempre recomendable utilizar un Entorno Integrado de Desarrollo (IDE) preparado para Python, porque así obtendremos características como el coloreado semántico que nos ayudarán a evitar errores y ser más productivos.

IDEs para Python hay para todos los bolsillos y preferencias. Mi favorito personal es PyCharm de JetBrains, aunque tiene cierta curva de aprendizaje y no es gratuito. Aquí de nuevo nos sonríe la fortuna porque, al igual que pip, la distribución de Python también incluye IDLE, un mucho más que decente IDE de Python con el que podemos empezar por el módico coste de cero euros. Puede encontrar IDLE dentro de la carpeta donde instaló Python, por defecto:

C:\Python27\Lib\idlelib\idle.bat

A nivel de archivos, trabajar con IDLE se asemeja mucho a manejar documentos de texto con Word: crear nuevos archivos, guardarlos, abrirlos de nuevo, etc. Vamos a crear nuestra estrategia en el archivo SimpleStrategy.py (la extensión que denota código de Python) dentro de la carpeta de backtesting.

C:\backtesting\SimpleStrategy.py

En este enlace puede descargar el código completo de SimpleStrategy.py. En este caso tenemos que interpretar el archivo de atrás hacia adelante. La ejecución se inicia con la última línea, una llamada a la función run_strategy pasando el valor del periodo SMA, 10 en este caso.

La función run_strategy cumple las siguientes funciones:

  • Carga el feed de datos de Amadeus en 2015 que bajamos de Yahoo.
  • Crea nuestra estrategia, le pasa los datos, y la pone en marcha.
  • Imprime el valor final de nuestra cartera antes de terminar.

Por su parte podemos ver más arriba que nuestra estrategia, llamada MyStrategy, deriva de strategy.BacktestingStrategy para integrarse en el funcionamiento de la librería. Es muy importante entender que PyAlgoTrade orquesta su funcionamiento mediante eventos, denotados por el prefijo “on”, frente a los cuales nuestra estrategia puede reaccionar y actuar. Por ejemplo, la serie diaria de datos va llamando al evento onBars, donde comprobamos si el precio ajustado de la sesión está por encima del SMA previo, en cuyo caso colocamos una orden de compra de 25 acciones.  Si esta orden tiene éxito se llama al evento onEnterOk, en caso contrario se dispara el evento onEnterCanceled, y así continúa la lógica de nuestra estrategia hasta llegar a al final del 2015.

Para ejecutar nuestra estrategia podemos abrir el archivo en IDLE y pulsar F5 (que corresponde al menú “Run” / “Run Module”), o bien escribir lo siguiente en la línea de comandos:

C:\backtesting> python SimpleStrategy.py

Si hemos hecho todo correctamente, obtendremos unas prácticas gráficas sobre el progreso general de nuestra inversión…

figure_1

… así como una lista detallada de todas las operaciones de compra y venta ejecutadas durante el periodo.

Screen Shot 2016-03-17 at 9.14.25 PM

Finalmente podemos ver que con nuestro ejemplo hemos obtenido $1144.41, una nada desdeñable rentabilidad del 14.4% sobre nuestra inversión inicial. ¡Wow! ¡Qué cracks! ¿Significa esto que es una buena estrategia?

Siguientes Pasos

No tan rápido. Antes hay otros aspectos que debemos considerar:

  • ¿Con qué nos comparamos? El benchmark es esencial para evaluar una estrategia. Por ejemplo ¿Cuál hubiese sido el resultado de una estrategia “buy & hold”, comprando las acciones de este mismo título al inicio y manteniéndolas hasta el final? Es algo que podemos fácilmente comprobar en PyAlgoTrade. Aquí le dejo el código completo de BuyAndHoldStrategy.py, con el cual constatará que hubiese obtenido… $1203.04. De hecho, perdemos dinero.
  • ¿Cuál es el riesgo que asumimos con nuestra inversión, y nos compensa por la rentabilidad obtenida? Es mucho mejor ganar 10% con un depósito bancario que con una acción, porque el riesgo implícito es mucho menor. Esto nos lleva a introducir medidas de volatilidad y de pérdida máxima, entre otras.
  • Nuestro universo de inversión contiene sólo una acción, con lo cual difícilmente podemos componer una cartera de títulos equilibrada y diversificada, o tan siquiera priorizar entre diferentes oportunidades de inversión.
  • Aunque incluso en esta versión básica PyAlgoTrade hace un buen trabajo en simular condiciones de mercado reales (por ejemplo, veremos que el 1 de Mayo no se llega a ejecutar nuestra orden de por falta de volumen en el mercado), convendría refinar más nuestro entorno para reflejar elementos de fricción como los costes de intermediación, cambio de divisas, o deslizamiento (slippage) de precios, que en agregado pueden esquilmar significativamente nuestras posibilidades de éxito.

En sucesivos posts intentaré dar respuesta a estas y tantas otras cuestiones para ir progresivamente componiendo una sólida base sobre la cual construir nuestras estrategias de inversión. De momento puede sentirse orgulloso de lo mucho avanzado con tan poco esfuerzo, y si el tiempo lo permite le aconsejo que se deje llevar por la curiosidad analizando diferentes rangos temporales, otros activos, modificando el periodo de cómputo de la SMA, introduciendo otros indicadores de la potente selección de PyAlgoTrade… ¡Ah! Y por favor no olvide compartir este post en sus redes sociales. Contra más seamos, más aprenderemos.

Anuncios

5 comentarios en “Introducción al Backtesting

  1. emilionbisnes

    Justamente estoy buscando la manera de hacer un backtesting para mis sistemas. Por ahora lo he ido haciendo en excel, pero quiero emplear algo más profesional. Muchas gracias, estaré muy atento. Si tienes tiempo pásate por el blog y mira los resultados de 2016.

    Me gusta

  2. Buenas Isaac:

    cuando ejecuto…:

    C:\backtesting> python -c “from pyalgotrade.tools import yahoofinance; yahoofinance.download_daily_bars(‘AMS.MC’, 2015, ‘AMS.MC-2015.csv’)”

    me devuelve el error:

    Traceback (most recent call last):
    File “”, line 1, in
    File “C:\Program Files\Python36\lib\site-packages\pyalgotrade\tools\yahoofinance.py”, line 119
    except Exception, e:
    ^
    SyntaxError: invalid syntax

    y si quito la coma del archivo editándolo en el idle, me devuelve:

    Traceback (most recent call last):
    File “”, line 1, in
    File “C:\Program Files\Python36\lib\site-packages\pyalgotrade\tools\yahoofinance.py”, line 119
    except Exception e:
    ^
    SyntaxError: invalid syntax

    A partir de ahí, como no consigo el archivo csv pues no puedo seguir los artículos.
    Agradecería una solución o el archivo, aunque prefiero la solución que resuelva el posible error.

    Un cordial saludo y enhorabuena por el blog.

    Miguel

    Me gusta

  3. David E. Acero

    ¡Hola Isaac!
    Lo primero, darte las gracias por compartir tus conocimientos con los que estamos empezando en el mundo de la inversión. He intentado descargar los archivos con la programación del ejemplo que has puesto, pero los enlaces ya no funcionan.
    ¿Sería posible que actualizaras los enlaces o nos dijeras dónde podemos encontrar esos ejemplos?
    Gracias por adelantado,

    Me gusta

    1. Hola David, muchas gracias por tus amables palabras.
      En efecto, los enlaces no funcionaban. Ahora lo he trasladado todo a un repositorio de GitHub:
      https://github.com/isaacdlp/pyalgosamples
      Y también actualizado los enlaces en todos los tutoriales.
      Disculpa la tardanza pero en Ágora hemos estado ocupadísimos con la publicación de nuestro primer libro y apenas ahora hemos vuelto a la “normalidad”.
      Espero que ahora lo puedas disfrutar mejor.

      Me gusta

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