Quant500 Academy

3. El indicador de regresión lineal frente a la media móvil

Nivel 6: Regresión y Modelos de Pricing

El indicador de regresión lineal (LRI, por *Linear Regression Indicator*) es el hermano pequeño del canal, y probablemente el uso más elegante de la regresión en análisis técnico.

La idea es esta: en cada barra se ajusta una recta de regresión sobre las últimas N barras, y se dibuja únicamente el valor final de esa recta, es decir, el punto donde la recta termina. Repitiendo el proceso barra a barra se obtiene una línea continua que muestra, estadísticamente, dónde se espera que esté el precio. Un indicador de regresión lineal de 20 periodos equivale al valor final de una recta de regresión ajustada sobre esas barras.

La interpretación es parecida a la de una media móvil, pero tiene una ventaja frente a ella. En lugar de dibujar un promedio de la acción del precio pasada, dibuja dónde una recta de regresión esperaría que estuviera el precio. Eso hace que el indicador de regresión lineal sea más sensible que una media móvil.

Merece la pena entender por qué, porque es un argumento estadístico bonito. Una media móvil te da el nivel medio de la ventana: si el precio lleva 20 sesiones subiendo en línea recta, la media móvil se queda anclada en el centro de la ventana, unas 10 sesiones por detrás. La regresión, en cambio, estima nivel y pendiente, y al evaluar la recta en el último punto ya ha incorporado esa pendiente. El resultado es una línea que va mucho más pegada al precio actual: menos retraso, a cambio de reaccionar más a los movimientos bruscos.

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

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

# 2. Tendencia de regresion lineal con pandas-ta
linreg = ta.linreg(data['Close'], length=50)
data['LINREG'] = linreg

# Convertimos indice y columna a arrays de numpy
x_dates = data.index.to_numpy()
y_linreg = data['LINREG'].to_numpy()

# 3. Grafico de velas con la tendencia superpuesta
ap = [mpf.make_addplot(y_linreg, color='red', width=1.5)]

mpf.plot(data, type='candle', style='yahoo', addplot=ap,
         title=f'{stock_symbol} con tendencia de regresion lineal',
         volume=True, figsize=(15, 10))

A diferencia del canal del módulo anterior, ta.linreg sí es una función de ventana móvil: solo mira hacia atrás. En cada fila usa las 50 barras anteriores y ninguna posterior, así que no arrastra sesgo de anticipación y se puede usar dentro de un backtest sin trampa. El precio a pagar es que las primeras 49 filas salen como NaN, porque no hay ventana suficiente para ajustar la recta.

Eso último tiene consecuencias prácticas: si más adelante calculas una señal comparando el cierre con LINREG, esas filas iniciales producirán comparaciones con NaN, que en pandas son siempre falsas. Conviene decidir explícitamente qué hacer con ellas en lugar de dejar que el código lo decida por ti en silencio.

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.