Implementando Estrategias de Trading Algorítmico con Python: Una Guía Paso a Paso

0
251
Oscilador RSI (14) en Python

En esta guía vamos a explicar de forma simple como implementar estrategias de trading algoritmico con Python. Para esto vamos a usar una estrategia simple de cruce de medias móviles como ejemplo. El código que mostramos a continuación puede usarse como base para el desarrollo de estrategias automatizadas más complejas y mejor adaptadas al estilo de cada trader.

Esta guía se desarrolla paso a paso ya que busca que pueda ser implementada incluso por los principiantes.

Importar bibliotecas necesarias

  • import pandas as pd: Importa la biblioteca Pandas y la renombra como pd para facilitar su referencia.
  • import yfinance as yf: Importa la biblioteca Yahoo Finance y la renombra como yf.
  • import numpy as np: Importa la biblioteca NumPy y la renombra como np.
#Instalación de bibliotecas

import pandas as pd
import yfinance as yf
import numpy as np

Explicación del código:

  • pandas: Una biblioteca para manipulación y análisis de datos.
  • yfinance: Una biblioteca para descargar datos financieros de Yahoo Finance.
  • numpy: Una biblioteca para operaciones numéricas.

Pueden obtener más información sobre yfinance para obtener datos del mercado en Python de Yahoo Finance en: ¿Como obtener datos del mercado con yfinance?

Definir una función para descargar datos históricos del mercado

#Descarga de datos históricos

def descargar_datos_mercado (simbolo, start_date, end_date):
  datos_mercado = yf.download(simbolo, start=start_date, end=end_date)
  return datos_mercado
  • def descargar_datos_mercado (simbolo, start_date, end_date): Define una función llamada descargar_datos_mercado que toma un símbolo de un activo negociado en el mercado, una fecha de inicio y una fecha de finalización como parámetros.
  • datos_mercado = yf.download (simbolo, start=start_date, end=end_date): Utiliza la biblioteca yfinance para descargar datos históricos del mercado para el símbolo y el período de tiempo especificados.
  • return stock_data: Devuelve los datos de acciones descargados como un DataFrame de Pandas.

Explicación del código:

  • Esta función toma como parámetros el símbolo de un activo negociado en el mercado, una fecha de inicio y una fecha de finalización.
  • Utiliza yfinance para descargar datos históricos del mercado para el símbolo y el período de tiempo especificados.
  • Devuelve un DataFrame de Pandas que contiene los datos del mercado del activo en cuestión.

Definir una función para generar señales de trading

#Código para generar señales de trading
def generar_signals(datos):
 signals = pd.DataFrame(index=datos.index)
 signals['signal'] = 0.0
# Crear una media móvil simple sobre el marco de tiempo de más corto plazo
 signals['short_mavg'] = datos['Close'].rolling(window=40, min_periods=1, center=False).mean()
# Crear una media móvil simple sobre el marco de tiempo de más largo plazo
 signals['long_mavg'] = datos['Close'].rolling(window=100, min_periods=1, center=False).mean()
# Crear señales
 signals['signal'][40:] = np.where(signals['short_mavg'][40:] > signals['long_mavg'][40:], 1.0, 0.0)
# Generar órdenes de trading
 signals['positions'] = signals['signal'].diff()
return signals
  • def generar_signals(datos): Define una función llamada generate_signals que toma como entrada un DataFrame de datos de acciones.
  • signals = pd.DataFrame(index=datos.index): Crea un DataFrame llamado signals con el mismo índice que los datos de entrada.
  • signals[‘signal’] = 0.0: Añade una columna ‘signal‘ inicializada con ceros.
  • Las siguientes líneas calculan promedios móviles simples cortos y largos y generan señales de compra (1.0) y venta (0.0) basadas en una estrategia de cruce de medias móviles.
  • signals[‘positions’] = signals[‘signal’].diff(): Crea una columna ‘positions’ que representa las posiciones de trading tomando la diferencia entre señales consecutivas.

Explicación del código:

  • Esta función genera señales de trading basadas en una estrategia de cruce de medias móviles simples.
  • Calcula una media móvil simple de corto plazo y otra de largo plazo utilizando los precios de cierre.
  • Se genera una señal de compra (1.0) si la media móvil a corto plazo cruza arriba de la media móvil de largo plazo; de lo contrario, se genera una señal de venta (0.0).
  • La columna ‘positions’ representa las posiciones de trading.

Definir una función para hacer una prueba de backtesting de la estrategia

#Función de backtesting de la estrategia

def backtesting_estrategia(signals, capital_inicial=100000):
 posiciones = pd.DataFrame(index=signals.index).fillna(0.0)
 posiciones['stock'] = 100 * signals['signal']   # Comprar 100 acciones en cada señal de compra
# Iniciar la cartera con el valor poseído
 cartera = posiciones.multiply(data['Adj Close'], axis=0)
# Almacenar la diferencia en acciones poseídas
 pos_diff = posiciones.diff()
# Agregar "efectivo" a la cartera
 cartera['cash'] = capital_inicial - (pos_diff.multiply(data['Adj Close'], axis=0)).cumsum()
# Agregar "total" a la cartera
 cartera['total'] = cartera['cash'] + cartera['stock']
return cartera

  • def backtesting_estrategia (signals, capital_inicial=100000): Define una función llamada backtesting_estrategia que toma como entrada señales de trading y una cantidad de capital inicial.
  • La función simula el trading creando un DataFrame denominado “posiciones” que representa las posiciones de trading y calcula el resultado de la cartera resultante.
  • cartera[‘total’] = cartera[‘cash’] + cartera[‘stock’]: Calcula el valor total de la cartera sumando los valores de efectivo y acciones.

Explicación del código:

  • Esta función realiza el backtesting de la estrategia de trading utilizando las señales generadas.
  • Crea un DataFrame (posiciones) para representar las posiciones de trading (compra de 100 acciones en cada señal de compra).
  • Inicializa la cartera con el valor de las acciones poseídas.
  • Se almacena la diferencia en acciones poseídas (pos_diff).
  • La columna ‘cash’ representa el efectivo restante después de comprar o vender acciones.
  • La columna ‘total’ representa el valor total de la cartera.

Sección principal del código

#Sección "main" del código

if __name__ == "__main__":
 simbolo = 'AAPL'
 start_date = '2022–01–01'
 end_date = '2024–01–01'
# Descarga de datos históricos del mercado
 datos = descargar_datos_mercado(simbolo, start_date, end_date)
# Generar señales de trading
 signals = generar_signals(datos)
# Backtesting de la estrategia de trading
 cartera = backtesting_estrategia(signals)
# Mostrar resultados de cartera
 display(cartera)
  • if name == “main“: Verifica si el script se está ejecutando directamente (no importado como un módulo).
  • simbolo = ‘AAPL’, start_date = ‘2022-01-01‘, end_date = ‘2024-01-01’: Define el símbolo de la acción y el rango de fechas para la descarga de datos históricos.
  • Llama a la función descargar_datos_mercado para obtener datos históricos del mercado.
  • Genera señales de trading utilizando la función generar_signals.
  • Realiza el backtesting de la estrategia de trading utilizando la función backtesting_estrategia.
  • Muestra la cartera resultante utilizando la función display.
  • Nota: Asegúrate de que la función display esté importada correctamente o reemplázala con print si es necesario.

Explicación del código:

  • Esta sección se ejecuta si el script se ejecuta directamente.
  • Especifica el símbolo de la acción (‘AAPL’) y el rango de fechas para descargar datos históricos.
  • Descarga datos históricos del mercado, genera señales de trading, realiza el backtesting de la estrategia y muestra la cartera resultante.

En resumen, este script descarga datos históricos del mercado, genera señales de trading basadas en una estrategia simple de cruce de medias móviles, y realiza el backtesting de la estrategia simulando la ejecución de órdenes de compra y venta. Luego, se muestran los valores finales de la cartera.


 

TagsPython
Raul Canessa

Leave a reply