Acceder
Blog Damián Fanaro
Blog Damián Fanaro
Blog Damián Fanaro

Medias Móviles en Python

Aprende cómo una estrategia básica de trading puede ser automatizada con Python.

En el post anterior hemos hablado sobre algoritmos, medias móviles y trading automático. Mencionamos una estrategia de trading sencilla que consistía en tomar posiciones de compra o venta cuando las medias móviles se cruzaban.

En esta entrada, vamos a utilizar el lenguaje de programación Python para implementar la estrategia y así conseguir nuestro primer sistema de trading semi-automático. Decimos que será “semi” ya que el algoritmo nos indicará si comprar o vender en un momento dado pero no enviará las ordenes al mercado automáticamente. En última instancia, el inversor decide qué hacer con las señales generadas por el sistema.

Les recordamos que si bien este es un ejemplo básico, se requieren conocimientos elementales de programación y de Python en especial.

¿Comenzamos?

Lo primero que tenemos que hacer es utilizar 3 librerías muy poderosas que nos permitirán manipular y visualizar datos financieros:

Una vez instalados estos paquetes, procederemos a crear un archivo con extensión .py donde escribiremos nuestro algoritmo completo.

Abrimos el archivo y ponemos el siguiente fragmento de código:

Lo que estamos haciendo es indicarle al intérprete de Python que queremos incluir las librerías mencionadas para que estén disponibles al momento de usarlas en nuestro programa.

Luego vamos a definir dos clases, ActionColorMapping y ActionPricePoint:

Usaremos ActionColorMapping solamente para propósitos de visualización que veremos más adelante. Por otro lado, instancias del tipo ActionPricePoint encapsularán los datos sobre posiciones a tomar en momentos específicos del tiempo.

A continuación vamos a escribir dos funciones de orden superior (funciones que retornan funciones, comúnmente llamado expresiones lambda), una para evaluar si estamos en condiciones de vender y otra que evalúa si estamos en condiciones de comprar:

En ambas funciones, las variables left y right serán las medias móviles de 20 y 100 días respectivamente, para un día específico.

También vamos a definir una función para visualizar el precio, las medias móviles y los puntos de compra y venta que se hayan manifestado en el pasado:

Aquí es donde hacemos uso de la librería Matplotlib. Cabe destacar que, para que un gráfico sea visualizado al momento de ejecutar el programa, es necesario llamar a la función show() (ver la última línea de código).

Ahora que ya tenemos definidas las funciones de apoyo, veamos finalmente la implementación del algoritmo de cruces de medias móviles:

Nuestro programa comienza con la ejecución del método main. Ahí es donde llamamos a la función calculate_moving_average_crossovers pasando como parámetro el símbolo por el cual queremos operar. En este caso hemos pasado CAT, por la empresa americana Caterpillar Inc.

Luego, el algoritmo llama a una función que lee los datos históricos desde un archivo con formato CSV (comma-separated value, del inglés) y retorna el precio de cierre. El archivo contiene múltiples valores tales como la fecha, el precio de apertura y cierre, el precio máximo y mínimo del día, el precio de cierre ajustado y el volumen operado; pero en nuestro caso solo nos interesa el precio de cierre. La fuente de estos datos es de Yahoo Finance.

Una vez que tenemos los datos del precio para cada día, procederemos a calcular las medias móviles utilizando la función rolling de Pandas Dataframe.

Por último, iteramos sobre cada precio de cierre yendo en orden cronológico y comprobamos si se produce un cruce de medias móviles y en que dirección sucede. Recordemos que si la media de 20 días se cruza por debajo de la de 100 entonces tendremos una señal de venta, mientras que si lo hace por encima, tendremos una señal de compra.

A modo de ejercicio, dejamos los detalles del algoritmo a interpretación del lector.

Resultado final

El gráfico resultante luego de ejecutar nuestro programa es el siguiente:

Puntos de cruce de medias móviles de 20 y 100 días.

Como se puede observar, hay 3 señales que se manifestaron en el pasado. Dos para vender (círculos rojos) y uno para comprar (círculo verde).

El código completo junto con los datos históricos lo puedes encontrar aquí.

Recursos

En el próximo post haremos algunos cálculos matemáticos para determinar cuanto hubiese sido nuestra ganancia o pérdida si hubiésemos operado en el mercado siguiendo nuestra estrategia de cruce de medias móviles.

Si tienes alguna pregunta o sugerencia, no dudes en comentar!

Hasta la próxima!

2
¿Te ha gustado mi artículo?
Si quieres saber más y estar al día de mis reflexiones, suscríbete a mi blog y sé el primero en recibir las nuevas publicaciones en tu correo electrónico
  • Medias móviles
Lecturas relacionadas
La Máquina Inversora
La Máquina Inversora
Trading Algorítmico con redes neuronales
Trading Algorítmico con redes neuronales
¿Evaluar o predecir mercados para operar? Apliquemos redes neuronales
¿Evaluar o predecir mercados para operar? Apliquemos redes neuronales
  1. en respuesta a drlucafiorini
    -
    #2
    23/06/19 09:31

    Hola @drlucafiorini, gracias por tu comentario!
    Mejoraré los próximos artículos que contengan código.
    Al mismo tiempo, queria comentarte que los ejemplos completos los puedes encontrar aquí:
    https://github.com/tradiar/blog-code-examples.

    Saludos!

  2. #1
    21/06/19 20:04

    Gracias,
    he reproducido el ejemplo.
    Sería interesante ver más artículos de este tipo en Rankia!

    Un apunte:
    El codigo en formato imagen dificulta un poco reproducir los ejemplos, si se pudiera copiar, sería mejor.

Definiciones de interés
Te puede interesar...
  1. La máquina inversora
  2. Ganando con las Medias Móviles
  3. Medias Móviles en Python
  4. Evaluando un Portfolio con Excel
  1. Medias Móviles en Python
  2. La máquina inversora
  3. Ganando con las Medias Móviles
  4. Evaluando un Portfolio con Excel