Estoy construyendo una estrategia clásica de trading de pares en la que uso un estimador lineal para modelar el spread de dos activos abriendo una posición neutral de mercado largo-corto durante los momentos de divergencia. Estoy luchando por entender cómo estimar la razón de cobertura apropiada a través de la regresión. Específicamente, estoy confundido sobre el papel del término de intercepción en la ecuación de regresión.
Supongamos que queremos modelar un beta dinámico usando una ventana de regresión móvil. Con un término de intercepción incluido, nuestra estimación de beta se vuelve altamente inestable (hasta el punto de no ser utilizable). Alternativamente, si la intercepción se fuerza a cero, beta se vuelve más estable y, intuitivamente, una estimación más razonable. Dicho esto, he leído muchos documentos sobre el tema de operaciones de pares y estimación de beta y parece que la intercepción se incluye en la mayoría de las ecuaciones de regresión para la estimación de beta. Además, siempre me han dicho que uno debería siempre incluir un término de intercepción o correr el riesgo de sesgo en el modelo. Entonces, ¿qué es lo que causa la inestabilidad de beta? ¿Debería incluir una intercepción en la estimación de la razón de cobertura?
Finalmente, como mi estrategia se centra en modelar el spread de activos (es decir, los residuos de mi regresión), tengo preocupaciones adicionales sobre una media no nula de los residuos causada por la intercepción forzada a cero. Imagino que podría ejecutar regresiones paralelas, es decir, una regresión sin intercepción para una estimación de la razón de cobertura óptima y una segunda regresión con intercepción para obtener residuos imparciales, pero no he visto esto mencionado en la literatura. Creo que podría estar perdiendo fundamentalmente una pieza del rompecabezas. Por lo que vale, mi modelo real está utilizando el Filtro de Kalman para calcular el spread y beta, pero creo que este modelo sufre de las mismas debilidades y preocupaciones que el ejemplo más simple de OLS que he dado.
Aquí hay un gráfico de la estimación diaria de beta de una regresión móvil con una ventana de 20 mirando con una intercepción:
Y este es un gráfico de la estimación diaria de beta para la misma regresión con la intercepción forzada a cero:
A continuación se muestra un fragmento de código mínimo y reproducible de Python:
import yfinance as yf
import numpy as np
from statsmodels.regression.rolling import RollingOLS
data = yf.download(['AAPL', 'MSFT'], start='2015-01-01').get('Adj Close')
data = np.log(data)
# Modelo con intercepción
rmod = RollingOLS(
endog=data['AAPL'],
exog=sm.add_constant(data['MSFT']), # Agregando intercepción
window=20,
)
rres = rmod.fit()
beta = rres.params['MSFT']
plt.plot(beta)
plt.title('Regresión Móvil AAPL/MSFT (Con Intercepción)')
plt.show()
# Modelo con intercepción congelada =0
rmod_nointercept = RollingOLS(
endog=data['AAPL'],
exog=data['MSFT'],
window=20,
)
rres_nointercept = rmod_nointercept.fit()
beta = rres_nointercept.params['MSFT']
plt.plot(beta)
plt.title('Regresión Móvil AAPL/MSFT (Sin Intercepción)')
plt.show()