Estoy construyendo una estrategia clásica de negociación de pares en la que utilizo un estimador lineal para modelizar el diferencial de dos activos abriendo una posición long-short market neutral en momentos de divergencia. Me cuesta entender cómo estimar el ratio de cobertura adecuado mediante regresión. En concreto, estoy confundido con respecto al papel del término de intercepción en la ecuación de regresión.
Supongamos que queremos modelizar una beta dinámica utilizando una ventana de regresión móvil. Con un término de intercepción incluido, nuestra estimación beta se vuelve muy inestable (hasta el punto de no ser utilizable). Alternativamente, si el intercepto se fuerza a cero, la beta se vuelve más estable e, intuitivamente, una estimación más razonable. Dicho esto, he leído muchos artículos sobre el tema de las operaciones por pares y la estimación de la beta y parece que el intercepto se incluye en la mayoría de las ecuaciones de regresión para la estimación de la beta. Además, siempre me han dicho que se debería siempre incluir un término de intercepción o un sesgo de riesgo en el modelo. ¿Cuál es entonces la causa de la inestabilidad de beta? ¿Debería incluir un intercepto en la estimación del ratio de cobertura?
Por último, dado que mi estrategia se centra en modelizar el diferencial de activos (es decir, los residuos de mi regresión), me preocupa la posibilidad de que la media de los residuos sea distinta de cero debido a que el intercepto se fuerza a cero. Imagino que podría realizar regresiones paralelas, es decir, una regresión sin intercepto para la estimación óptima del coeficiente de cobertura y una segunda regresión con intercepto para obtener residuos insesgados, pero no he visto que se haga referencia a ello en la bibliografía. Creo que en el fondo me falta una pieza del rompecabezas. Por si sirve de algo, mi modelo real está utilizando el filtro de Kalman para calcular el diferencial y la beta, pero creo que este modelo adolece de las mismas debilidades y preocupaciones que el ejemplo OLS más simple que he dado.
A continuación se muestra un gráfico de la estimación beta diaria de una regresión continua con una ventana retrospectiva de 20 utilizando un intercepto:
Y éste es un gráfico de la estimación beta diaria para la misma regresión con el intercepto forzado a cero:
A continuación se muestra un fragmento de código mínimo 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)
# Model with intercept
rmod = RollingOLS(
endog=data['AAPL'],
exog=sm.add_constant(data['MSFT']), # Adding intercept
window=20,
)
rres = rmod.fit()
beta = rres.params['MSFT']
plt.plot(beta)
plt.title('AAPL/MSFT Rolling Regression (With Intercept)')
plt.show()
# Model with intercept frozen =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('AAPL/MSFT Rolling Regression (No Intercept)')
plt.show()