Quant500 Academy

2. Canales de regresión: la tendencia y su volatilidad

Nivel 6: Regresión y Modelos de Pricing

Antes de meternos en la descripción matemática de los modelos de pricing, merece la pena ver cómo los traders usan la regresión en análisis técnico, porque es el uso más directo e intuitivo de todos.

En el análisis técnico, el indicador de regresión lineal y los canales de regresión destacan como herramientas que ofrecen al trader dos cosas a la vez: una perspectiva sobre la dirección de la tendencia y una medida de la volatilidad potencial alrededor de esa tendencia. En el fondo son análisis estadístico puro aplicado a un gráfico: un enfoque cuantificable de la dinámica del mercado.

Los canales son un componente importante del análisis técnico y existen bastantes técnicas distintas: el canal de Fibonacci, el pitchfork de Andrews, el canal de Keltner. El canal de regresión lineal es un indicador de tres líneas que delimita el techo, el suelo y el centro del movimiento de precio que se está analizando.

La línea central es la recta de regresión ajustada sobre el precio. La línea superior del canal (UCL) y la inferior (LCL) se dibujan a un número determinado de desviaciones típicas por encima y por debajo, normalmente dos. El espacio entre UCL y LCL representa el rango de movimiento esperado para el activo dadas su tendencia y su volatilidad pasadas. Cuando el precio se sale del canal, puede estar señalando una sobreextensión y una posible vuelta a la media.

Es habitual combinar bandas de Bollinger y canal de regresión para construir estrategias:

import pandas as pd
import yfinance as yf
import mplfinance as mpf
import pandas_ta as ta
import numpy as np

# 1. Descargamos los datos de NVIDIA
start_date = '2020-08-01'
end_date = '2021-01-01'
stock_symbol = 'NVDA'
data = yf.download(stock_symbol, start=start_date, end=end_date)

# 2. Bandas de Bollinger con pandas-ta
data.ta.bbands(close='Close', length=20, append=True)

# 3. Canal de regresion
x = np.array(range(len(data)))
y = data['Close'].values
slope, intercept = np.polyfit(x, y, 1)
data['Regression'] = slope * x + intercept

residuals = y - data['Regression']
std_error = np.std(residuals)

data['Upper Regression'] = data['Regression'] + (2 * std_error)
data['Lower Regression'] = data['Regression'] - (2 * std_error)

Fíjate en un detalle que se pasa por alto constantemente: la variable x no son fechas, es un contador ordinal 0, 1, 2, 3... Al regresar el precio contra ese contador, la pendiente se interpreta como dólares ganados por barra, y los huecos de fin de semana o festivos desaparecen del cálculo.

Y una advertencia todavía más importante: este canal se ajusta sobre toda la muestra a la vez. La recta del día 10 se ha calculado usando también los precios del día 100. Como fotografía descriptiva de un tramo pasado es perfectamente válida, pero si la usas tal cual dentro de un backtest estás introduciendo sesgo de anticipación, porque estás decidiendo con información que en ese momento no existía. Para operar de verdad, el canal hay que recalcularlo en cada barra usando solo la ventana anterior.

Y una diferencia conceptual con Bollinger: las bandas de Bollinger se dibujan alrededor de una media móvil que se recalcula barra a barra, mientras que el canal de regresión se dibuja alrededor de una recta estática ajustada al tramo completo.

Para ampliar esta lección

El resto de Quant500

Lo que estás aprendiendo, aplicado al índice todos los días:

La cartera del modelo, cada semana en tu correo

Cada sábado, su semana en un minuto: cómo fue, lo mejor y lo peor, y qué directivos compraron con su dinero. Y el día que el modelo se rehace, qué entra y qué sale. Es una simulación, no un consejo. Como mucho un correo a la semana, sin publicidad y sin cuenta; te das de baja con un clic. Lo hace una persona: Pol Gracia.

Cartera modelo con resultados simulados, no una recomendación personalizada. Tu correo se usa solo para esto: privacidad.

Detrás de la Academia y del resto de Quant500 hay una sola persona: Pol Gracia Serrahima.