Trading algorítmico con Python. Manual Ninja [2021]

La tecnología se ha convertido en un activo básico en las finanzas. Las instituciones financieras se están convirtiendo en empresas tecnológicas en lugar de limitarse a ocuparse de los aspectos financieros como antes.

Los algoritmos matemáticos traen innovación y velocidad. Pueden ayudarnos a obtener una ventaja competitiva en el mercado.

La velocidad y la frecuencia de las transacciones financieras, junto con los grandes volúmenes de datos, han atraído mucha atención hacia la tecnología de todas las grandes instituciones financieras.

El trading algorítmico o cuantitativo es el proceso de diseño y desarrollo de estrategias de trading basadas en análisis matemáticos y estadísticos. Es un área inmensamente sofisticada de las finanzas.

Este artículo lo recomiendo para:

  1. Un estudiante o alguien que aspira a convertirse en analista cuantitativo (quant) en un fondo o banco.
  2. Alguien que está planeando iniciar su propia carrera como trader Quant ( es duro, aviso)

Repasaremos los siguientes temas en este post:

Antes de profundizar en los detalles y la dinámica de los datos sobre la fijación de precios de las acciones, debemos comprender primero los fundamentos de las finanzas. Si eres  una persona familiarizada con las finanzas y con el trading, puede saltarse esta sección

¿Qué son las acciones? ¿Qué es el trading  con  acciones?

Acciones

Una acción es una representación de una participación en la propiedad de una corporación, que se emite a un determinado precio. Es un tipo de garantía financiera que establece su reclamo sobre los activos y el rendimiento de una empresa.

Una organización o empresa emite acciones para recaudar más fondos/capital a fin de ampliar la escala y participar en más proyectos. Estas acciones se ponen a disposición del público y se venden y compran.

Estrategia de trading y compra de acciones

El proceso de compra y venta de acciones existentes y previamente emitidas se denomina invertir en acciones. Existe un precio al que se puede comprar y vender una acción, y éste sigue fluctuando dependiendo de la demanda y la oferta en el mercado de valores.

Dependiendo del rendimiento y las acciones de la empresa, los precios de las acciones pueden subir o bajar, pero el movimiento de los precios de las acciones no se limita al rendimiento de la empresa.

Los inversores  pagan dinero a cambio de la propiedad dentro de una empresa, con la esperanza de hacer algunas transacciones rentables y vender las acciones a un precio más alto.

Otra técnica importante que siguen los inversores es el short selling  o venta en corto. Esto implica que las acciones que toman prestadas se venden inmediatamente con la esperanza de comprarlas más tarde a un precio más bajo, devolverlas al prestamista y obtener el margen.

La mayoría de los inversores siguen un plan y un modelo para invertir. Esto se conoce como una estrategia de inversión.

Los traders cuantitativos de los fondos de cobertura y los bancos de inversión diseñan y desarrollan estas estrategias y marcos operativos para ponerlos a prueba. Se requieren profundos conocimientos de programación y una comprensión de los lenguajes necesarios para elaborar su propia estrategia.

Python es uno de los lenguajes de programación más utilizados, entre los que se encuentran C++, Java, R y MATLAB. Se está adoptando ampliamente en todos los dominios, especialmente en la ciencia de los datos, debido a su fácil sintaxis, su enorme comunidad y el apoyo de terceros.

Necesitarás estar familiarizado con Python y la estadística para aprovechar al máximo este tutorial.

Asegúrate de repasar su Python y repasar los fundamentos de  estadística.

Extracción de datos de la API de Quandl

Para extraer los datos de los precios de las acciones, utilizaremos la API de Quandl. Pero antes de eso, vamos a establecer el entorno de trabajo ( yo uso macOS) :

  1. En tu terminal, cree un nuevo directorio para el proyecto (nómbrelo como quiera):
mkdir 
  1. Asegúrate de tener Python 3 y virtualenv instalados en tu máquina.
  2. Cree un nuevo virtualenv de Python 3 utilizando virtualenv y actívalo utilizando source /bin/activate.
  3. Ahora, instala jupyter-notebook usando pip, y escriba pip install jupyter-notebook en la terminal.
  4. De manera similar, instala los paquetes pandas, quandl, y numpy.
  5. Ejecute su jupyter-notebook desde la terminal.

Ahora, tu notebook debe estar corriendo en el localhost como la captura de pantalla de abajo:

trading con pythonPuedes crear tu primer cuaderno pulsando en el desplegable New de la derecha. Asegúrate de que has creado una cuenta en Quandl y tienes una clave API.

Una vez que esté todo listo, vamos a sumergirnos en este mundo apasionante:

# importing required packages
import pandas as pdimportar quandl as q

Pandas va a ser el paquete más  utilizado en este tutorial, ya que haremos mucha manipulación de datos y trazados.

Después de importar los paquetes, haremos peticiones a la API de Quandl utilizando el paquete Quandl:

# set the API key
q.ApiConfig.api_key = "<API key>”
#enviar una solicitud de obtención para consultar los precios de las acciones de Microsoft al final del día desde el 1 de enero de 2010 hasta el 1 de enero de 2019
msft_data = q.get("EOD/MSFT", start_date="2010-01-01", end_date="2019-01-01")
# mira las primeras 5 filas del marco de datosmsft_data.head

python con quandlAquí tenemos los datos de precios de las acciones de Microsoft EOD de los últimos 9 años. Todo lo que tenías que hacer era llamar al método get del paquete Quandl y suministrar el símbolo de las acciones, MSFT, y el marco de tiempo para los datos que necesitas.

python tradingEsto era realmente simple, ¿verdad?

Avancemos para entender y explorar más estos datos.

Análisis  de datos sobre el precio de las acciones

Con los datos en nuestras manos, lo primero que debemos hacer es entender lo que representa y qué tipo de información encapsula.

Imprimiendo la información del DataFrame, podemos ver todo lo que contiene:

trading algoritmicoComo se ve en la captura de pantalla anterior, el DataFrame contiene el DatetimeIndex, lo que significa que estamos tratando con datos de series temporales.

Un índice puede ser pensado como una estructura de datos que nos ayuda a modificar o referenciar los datos. Los datos de series temporales son una secuencia de instantáneas de precios tomadas en intervalos de tiempo consecutivos e igualmente espaciados.

En el trading, los datos de precios de las acciones EOD capturan el movimiento de ciertos parámetros sobre una acción, como el precio de la acción, durante un período de tiempo especificado con puntos de datos registrados a intervalos regulares.

Terminología importante

Mirando otras columnas, tratemos de entender lo que representa cada columna:

  • Open/Close - Captura el precio de apertura/cierre de la acción
  • Adj_Open/Adj_Close - Es el precio de apertura/cierre ajustado es el precio de una acción en un día determinado de negociación que ha sido revisado para incluir cualquier distribución de dividendos, divisiones de acciones y otras acciones corporativas que se produjeron en cualquier momento antes de la apertura del día siguiente.
  • Volume - registra el número de acciones que se negocian en un día determinado de negociación.
  • High/Low -  registra el precio más alto y el más bajo de las acciones durante un día de negociación determinado.

Estas son las columnas importantes en las que nos centraremos en este momento.

Podemos conocer las estadísticas resumidas de los datos, que nos muestran el número de filas, la media, el máximo, las desviaciones estándar, etc. Intenta ejecutar la siguiente línea de código en la celda de Ipython:

msft_data.describe

trading cuatitativo

resample

El método de resample de Pandas se utiliza para facilitar el control y la flexibilidad en la conversión de frecuencia de los datos de las series temporales. Podemos especificar los intervalos de tiempo para remuestrear los datos a mensual, trimestral o anual, y realizar la operación requerida sobre ellos.

msft_data.resample('M').mean

python trading

Esta es una forma interesante de analizar el rendimiento de las acciones en diferentes marcos temporales.

Calculando los retornos

Un retorno financiero es simplemente el dinero ganado o perdido en una inversión. Un retorno puede ser expresado nominalmente como el cambio en el importe de una inversión a lo largo del tiempo. Se puede calcular como el porcentaje derivado de la relación entre beneficio e inversión.

Tenemos el pct_change a nuestra disposición para este propósito.

A continuación se muestra cómo se pueden calcular los rendimientos:

# Import numpy packageimportar numpy as np
# assign `Adj Close` to `daily_close`
daily_close = msft_data[['Adj_Close']]
# returns as fractional changedaily_return = daily_close.pct_change
# replacing NA values with 0

daily_return.fillna(0, inplace=True)
print(daily_return)

Esto imprimirá los retornos que las acciones han estado generando diariamente. Multiplicando el número por 100 te dará el porcentaje.

La fórmula usada en pct_change es:

Rendimiento = {(Precio al t) - (Precio al t-1)} / {Precio en t-1}

Ahora, para calcular los rendimientos mensuales, todo lo que necesitas hacer es:

mdata = msft_data.resample('M').apply(lambda x: x[-1])monthly_return = mdata.pct_change

Después de remuestrear los datos a los meses (para los días hábiles), podemos obtener el último día de negociación del mes utilizando la función apply.

apply toma una función y la aplica a todas y cada una de las filas de la serie de Pandas. La función lambda es una función anónima en Python que puede ser definida sin un nombre, y sólo toma expresiones en el siguiente formato:

Lambda: expression

Por ejemplo, lambda x: x 2 es una función lambda. Aquí, x es el argumento y x 2 es la expresión que se evalúa y devuelve.

Medias  móviles en el trading

El concepto de medias móviles va a construir la base de nuestra primera estrategia de trading basada en el momento.

En el trading, los traders  a menudo tenemos que evaluar las métricas estadísticas continuamente a lo largo de una ventana  de tiempo.

Veamos cómo podemos calcular la media móvil sobre una ventana de 50 días, y deslizar la ventana cada vez un  1 día.

rolling

Esta es la función mágica que hace los trucos por nosotros:

# assigning adjusted closing prices to 

adj_pricesadj_price = msft_data['Adj_Close']
# calculate the moving averagemav = adj_price.rolling(window=50).mean
# print the resultprint(mav[-10:])

medias moviles pythonVerás la media continua en una ventana de 50 días (aprox. 2 meses). Las medias móviles ayudan a suavizar cualquier fluctuación o picos en los datos, y te dan una curva más suave para el rendimiento de la acción.

Podemos trazar y ver la diferencia pero necesitas el matplotlib:

# importar el paquete matplotlib para ver el gráfico
import matplotlib.pyplot as plt
adj_price.plot

plot trading cuantitastivoAhora  ya puedes dibujar la media móvil

mav.plot

 

media movil pythonPuedes  ver la diferencia por ti mismo, cómo los picos de los datos se evaporan para dar un sentimiento general sobre el rendimiento de la acción.

¡Vamos a hacer  una estrategia de trading cuantitativo!

Aquí viene la parte final y más interesante: diseñar y hacer la estrategia de trading.

Esta será una guía paso a paso para desarrollar una estrategia de cruce de medias móviles simples (SMAC) basada en el momento.

Las estrategias basadas en el momento se basan en un indicador técnico que aprovecha la continuidad de la tendencia del mercado. Compramos valores que muestran una tendencia al alza y vendemos en corto  valores que muestran una tendencia a la baja.

La estrategia SMAC es una estrategia de momento  muy conocida. Es una estrategia de largo plazo. El momento, aquí, es el retorno total de las acciones incluyendo los dividendos de los últimos n meses. Este período de n meses se denomina período de retroceso.

Hay 3 tipos principales de períodos de retroceso: a corto plazo, a medio plazo y a largo plazo. Necesitamos definir 2 períodos de retroceso diferentes de una serie de tiempo en particular.

Se genera una señal de compra cuando la media  de retroceso más corta (o media móvil) supera a la media móvil de retroceso más larga. Una señal de venta se produce cuando la media móvil de retroceso más corta cae por debajo de la media móvil más larga.

Ahora, veamos cómo se haría esto con Phyton:

# Paso 1: Inicializar los períodos de retroceso corto y largo
short_lb =50 long_lb = 120
# paso2: inicializar un nuevo DataFrame llamado signal_df con una columna de señales
signal_df = pd.DataFrame(index=msft_data.index)signal_df['signal'] = 0.0
# paso3: crear una media móvil simple y corta durante el periodo de observación corto
signal_df['short_mav'] = msft_data['Adj_Close'].rolling(window=short_lb, min_periods=1, center=False).mean
# paso4: crear una media móvil simple y larga durante el largo periodo de observación
signal_df['long_mav'] = msft_data['Adj_Close'].rolling(window=long_lb, min_periods=1, center=False).mean
# paso5: generar las señales basadas en la sentencia condicional
signal_df['signal'][short_lb:] = np.where(signal_df['short_mav'][short_lb:] > signal_df['long_mav'][short_lb:], 1.0, 0.0) 
# paso6: crear las órdenes de negociación basadas en la columna de posiciones
signal_df['positions'] = signal_df['signal'].diffsignal_df[signal_df['positions'] == -1.0]

Veamos qué está pasando aquí. Hemos creado 2 períodos de observación. El período de retroceso corto short_lb es de 50 días, y el período de retroceso más largo para el promedio móvil largo se define como un long_lb de 120 días.

Hemos creado un nuevo DataFrame que está diseñado para capturar las señales. Estas señales se generan siempre que el promedio móvil corto cruza el promedio móvil largo utilizando el np.where. Asigna 1.0 para verdadero y 0.0 si la condición resulta ser falsa.

Las columnas de positions en el DataFrame nos dicen si hay una señal de compra o de venta, o si sigue igual. Básicamente calculamos la diferencia en la columna de señales de la fila anterior usando diff.

Y ahí tenemos nuestra estrategia implementada en solo 6 pasos usando Pandas. Fácil, ¿no?

Ahora, intentemos visualizar esto usando Matplotlib.

Todo lo que tenemos que hacer es inicializar una figura del gráfico, añadir los precios de cierre ajustados, las medias móviles cortas y largas al gráfico, y luego trazar las señales de compra y venta utilizando la columna de posiciones en la signal_df anterior:

# inicializar el gráfico utilizando plt
fig = plt.figure
# Añadir una subtrama y una etiqueta para el eje y
plt1 = fig.add_subplot(111, ylabel='Precio en $')
msft_data['Adj_Close'].plot(ax=plt1, color='r', lw=2.)
# traza los promedios móviles de las miradas cortas y largas
signal_df[['short_mav', 'long_mav']].plot(ax=plt1, lw=2., figsize=(12,8))
# Dibuja señales de venta
plt1.plot(signal_df.loc[signal_df.positions == -1.0].index, signal_df.short_mav[signal_df.positions == -1.0],'v', markersize=10, color='k')
# trazando las señales de compra
plt1.plot(signal_df.loc[signal_df.positions == 1.0].index, signal_df.short_mav[signal_df.positions == 1.0], '^', markersize=10, color='m')
 # Muestra el plot
plt.show

Si se ejecuta la celda de arriba en el cuaderno de Jupyter se obtendría un gráfico como el de abajo:

trading con jupiterAhora, puedes ver claramente que cuando la línea azul (promedio móvil corto) sube y sobrepasa la línea naranja (promedio móvil largo), hay un marcador rosa ascendente que indica una señal de compra.

Una señal de venta es denotada por un marcador negro descendente donde hay una caída del short_mav por debajo del long_mav.

¿A dónde ir desde aquí ?

Ahora que su algoritmo está listo, tendrá que comprobar los resultados y evaluar las métricas que marcan el riesgo de la estrategia y de las acciones.

Antiguamente recomendaría Quantopian, pero enNoviembre  de 2020 cerró y su equipo se integró con Robinhood. Es una muestra de que encontrar sistemas rentables para crear fondos no es nada fácil.

 

Te recomiendo que uses BlueShiftQuantra para aprender más sobre  backtesting y estrategias de trading.

Quantra  y  Blueshift son una marca de  QuantInsti. Sin duda lo mejor que hay en internet para aprender trading cuantitativo de verdad si que te engañe cualquier experto en marketing que te saldrá en google.

Con una gama de cursos gratuitos y de pago ofrecidos por expertos en el campo, Quantra ofrece una guía completa sobre un montón de estrategias de trading básicas y avanzadas.

Si te ha ayudado el artículo lo mejor es que me lo agradezcas con un Tweet.

Muchas gracias

backtesting

ESTO TE INTERESA

Trading de alta frecuencia (HFT) . ¿Cómo funciona?

Trading de alta frecuencia (HFT) . ¿Cómo funciona?

ESTO TE INTERESA