Implementando Estrategias de Trading Algorítmico con Python: Una Guía Paso a Paso
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.