2 votos

Papel de Intercepto en la Estimación Beta de OLS

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:

enter image description here

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:

enter image description here

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()

1voto

waynecolvin Puntos 110

Hola James: Encuentro interesante tu pregunta y resultados y no puedo responder o decir algo definitivo pero experimenté problemas similares en el pasado cuando intenté usar la cointegración para pares. Solo un par de cosas en cuanto a alguna intuición y comentarios. Esperaba que alguien más dijera algo porque dudo que esto ayude de alguna manera específica hacia tu pregunta.

  1. Creo que la razón de tu resultado es que, cuando permites un intercepto, estás permitiendo que el spread tenga más libertad porque puede variar alrededor de un valor no nulo, mientras que en el modelo sin intercepto, la variación siempre se mide alrededor de cero. Entonces, lo que eso significa para el modelo de corrección de errores es que el valor de equilibrio a largo plazo (no sé si recuerdo exactamente la terminología, pero cuando digo "término de corrección de errores a largo plazo", me refiero a $Y - X \beta - \mu$ en el modelo de corrección de errores) tiene una media diferente todo el tiempo. En el caso sin intercepto, el equilibrio a largo plazo en el modelo de corrección de errores es siempre cero. Entonces, dado que el valor de equilibrio tiene que ser cero, el $\beta$ no tiene tanto margen para moverse de un período a otro en el modelo sin intercepto porque el término de corrección de errores, $Y - X \beta$, necesita estar cerca de cero, porque $\mu = 0$.

  2. Una cosa que intenté (no sé si te ayudará) fue no solo eliminar el intercepto (para reducir la variación en el hedge ratio) sino también fijar $\beta$ en 1.0 y probar esos residuos para estacionariedad. Ten en cuenta que, al hacer esto, debes usar tablas diferentes porque se asume que $\beta$ es conocido. Este enfoque proporcionó una forma automática de reducir la variación de la estimación porque, si no puedes rechazar la hipótesis nula de que $\beta = 1$, entonces eso reducirá claramente la variación de la estimación a cero ¡porque no hay estimación !!!!!!! No recuerdo cuánto ayudó establecer el hedge ratio en un valor conocido como 1.0 pero sí recuerdo que las estimaciones de $\beta$ eran demasiado volátiles, así que probé eso en su lugar.

  3. Puede que quieras echar un vistazo a la regresión de mínimos cuadrados totales donde $x$ y $y$ son tratados simétricamente. Paul Teetor escribió un artículo sobre este enfoque (busca en Google su nombre. Creo que tiene un sitio web o el artículo aparecerá. Si no lo encuentras, avísame) y creo que sus resultados fueron prometedores, pero no recuerdo los detalles.

Ten en cuenta que nunca probé los mínimos cuadrados totales yo mismo, pero el hecho de que el enfoque E-G no sea simétrico alrededor de $x$ y $y$ siempre me molestó. Nunca pude justificar en mi mente cómo los resultados de cointegración podrían depender de qué variable, $x$ o $y$, se eligió como la respuesta.

¡Buena suerte y espero que esto haya ayudado un poco!

                                            Mark

P.D: Una cosa en la que pensar es qué implica cuando se fuerza un valor como $\beta = 1.0$ u otro valor fijo. Al fijar $\beta$ en un valor conocido, ¿qué se está diciendo sobre el proceso de corrección versus permitir que haya una estimación de $\beta$ que podría ser 2 o 4 o 0.5? No sé si puedo responder eso ahora, pero podría hacerlo cuando trabajaba en ello.

0 votos

¡Mark, gracias por esta respuesta útil! Para la edificación de otros lectores, aquí hay un enlace al artículo de Paul Teetor. Una excelente recomendación. Mejores ratios de cobertura para Spread Trading por Paul Teetor.

0 votos

James: Tus preguntas y comentarios trajeron recuerdos. Además de la idea de Paul, el uso de un valor fijo (como -1) también podría ayudar porque lo que me di cuenta al trabajar en cointegración (al menos en lo que se refiere a pares) es que se quiere evitar estimar parámetros cuando sea posible. Lo que descubrí más tarde (al trabajar en un espacio diferente al de pares) es que esa verdad podría aplicarse al trabajar en la investigación financiera cuantitativa en general. Buena suerte.

1voto

Kiah Puntos 53

Como seguimiento a mi publicación original, quería proporcionar un ejemplo de Filtro de Kalman ya que parece resolver el problema de beta dinámico tal como lo proporciona el OLS en movimiento sin sufrir la inestabilidad de la estimación como se demostró en el gráfico de OLS en movimiento de la publicación original.

Estimación de beta del Filtro de Kalman para AAPL/MSFT para el mismo período de tiempo e intervalo que la publicación original. Tenga en cuenta que elegí valores completamente arbitrarios para las variables de ruido, delta y Vt:

enter image description here

A continuación se muestra un snippet de código reproducible mínimo en Python:

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pykalman import KalmanFilter

data = yf.download(['AAPL', 'MSFT'], start='2015-01-01').get('Adj Close')
data = np.log(data)

H = np.eye(2)
delta = 1e-5
vt = 0.1
Wt = delta / (1 - delta) * np.eye(2) 
R = np.ones((2,2)) 
theta = np.zeros(2) 

F = np.vstack([data.iloc[:, 0], np.ones(data.iloc[:, 0].shape)]).T[:, np.newaxis]

kf = KalmanFilter(
    n_dim_obs=1, n_dim_state=2,     
    initial_state_mean=theta,       
    initial_state_covariance=R,     
    transition_matrices=H,          
    observation_matrices=F,         
    observation_covariance=vt,      
    transition_covariance=Wt,
)

# La media del estado se representa frecuentemente por theta
state_means, state_covs = kf.filter(data.iloc[:, 1].values)

ser = pd.Series(state_means[:,0], index=data.index, name='beta')

ser.plot()
plt.title('Estimaciones de Beta del Filtro de Kalman AAPL/MSFT')

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X