Ejemplo práctico de backtesting de Pair Trading en Python
Para este ejemplo, asumiremos que queremos recolectar datos y probar una estrategia de pair trading en pares de acciones de empresas de tecnología. Utilizaremos la biblioteca yfinance para descargar los datos de precios y la biblioteca statsmodels para construir nuestro modelo.
import yfinance as yf
import statsmodels.api as sm
Luego, definimos los pares de acciones que queremos analizar:
pair_1 = yf.Ticker("AAPL")
pair_2 = yf.Ticker("MSFT")
A continuación, descargamos los datos históricos de precios para los dos pares de acciones:
pair_1_data = pair_1.history(period="max")
pair_2_data = pair_2.history(period="max")
Ahora que tenemos los datos, podemos calcular la relación de precios entre los dos pares de acciones. Calculamos el spread como la diferencia entre los precios de cierre de los dos activos, normalizados a una escala común:
spread = pair_1_data['Close'] - pair_2_data['Close']
spread = (spread - spread.mean()) / spread.std()
Una vez que tenemos el spread, construimos nuestro modelo de backtesting utilizando un modelo de regresión lineal para estimar los parámetros beta y alpha que nos permitirán determinar cuándo es el momento adecuado para comprar o vender nuestros pares de acciones:
model = sm.OLS(spread, sm.add_constant(pair_2_data['Close'])).fit()
beta = model.params[1]
alpha = model.params[0]
La idea detrás de la estrategia de pair trading es que, si la diferencia de precios entre los dos activos se desvía significativamente de su media, entonces se espera que se produzca una corrección a la media en el futuro cercano. Por lo tanto, si el spread es mayor que un cierto umbral "upper", vendemos el par de acciones de manera corta, y si el spread es menor que un umbral "lower", compramos el par de acciones:
spread_mean = spread.mean()
spread_std = spread.std()
upper = spread_mean + 2 * spread_std
lower = spread_mean - 2 * spread_std
if spread[-1] > upper:
pair_1_sell = 1
pair_2_buy = beta
elif spread[-1] < lower:
pair_1_buy = 1
pair_2_sell = beta
else:
pass
Finalmente, ejecutamos el modelo en un bucle para ajustar el spread en tiempo real:
for i in range(len(pair_1_data)):
spread[i] = pair_1_data['Close'][i] - beta * pair_2_data['Close'][i] - alpha
if spread[i] > upper:
pair_1_sell[i] = 1
pair_2_buy[i] = beta
elif spread[i] < lower:
pair_1_buy[i] = 1
pair_2_sell[i] = beta
¡Y eso es todo! Con este modelo, hemos recopilado datos de precios de dos acciones de empresas de tecnología y construido un modelo de backtesting que nos permitirá evaluar la efectividad de nuestra estrategia de pair trading.