- En este artículo, veremos cómo usar la regresión lineal, una herramienta estadística financiera, para predecir tendencias de precios. ¿Preparados?
- Artículo publicado en Hispatrading 60.
La regresión es una técnica estadística utilizada en finanzas, inversiones y otros campos para evaluar la fuerza y la naturaleza de la relación entre una variable dependiente y una o más variables independientes.
La forma más común de regresión es la regresión lineal, también conocida como regresión simple o mínimos cuadrados ordinarios (MCO), que identifica la relación lineal entre dos variables.
¿Qué es una relación lineal?
Una relación lineal, también conocida como asociación lineal, es un término estadístico que describe una conexión en línea recta entre dos variables. Esta relación puede representarse gráficamente con una línea recta que vincula la variable con la constante, o matemáticamente, donde la variable independiente se multiplica por el coeficiente de pendiente y se suma a una constante para determinar la variable dependiente.
Fórmula para una relación lineal
Matemáticamente, una relación lineal es aquella que satisface la ecuación:
y = mx + b
donde:
m = pendiente
b = intersección con el eje y
En esta ecuación, “x” e “y” son dos variables relacionadas por los parámetros “m” y “b”.
Gráficamente, y = mx + b se traza en el plano x-y como una línea con pendiente “m” e intersección con el eje y “b”. La intersección con el eje y “b” es simplemente el valor de “y” cuando x=0. La pendiente “m” se calcula a partir de dos puntos individuales (x1, y1) y (x2, y2) como:
m = (y2 − y1) / (x2 − x1)
Los traders utilizan la regresión lineal para identificar tendencias y predecir precios futuros. Las herramientas clave incluyen líneas y canales de regresión lineal.
La regresión lineal es una herramienta valiosa en el análisis técnico para identificar tendencias y tomar decisiones de trading. En finanzas, la regresión lineal se utiliza para predecir resultados financieros basados en uno o más indicadores financieros. Identifica la línea que mejor se ajusta a un conjunto de puntos de datos, ilustrando la relación entre variables.
Una línea de regresión por mínimos cuadrados representa la relación entre dos valores numéricos diferentes. Este procedimiento ajusta la línea a los puntos de datos de manera que minimiza la suma de las distancias verticales al cuadrado entre la línea y los puntos. También se la conoce como línea de mejor ajuste o línea de tendencia.
Aquí, utilizaremos los niveles de precios (apertura, máximo, mínimo o cierre) en relación con las líneas de regresión lineal como líneas de soporte y resistencia para confirmar decisiones de trading.
El canal externo en color magenta representa un canal de volatilidad dentro del cual los precios se mueven hacia arriba y hacia abajo. La línea de regresión lineal verde se calcula en función de los precios de cierre, mientras que la línea de regresión lineal roja se deriva de los precios máximos. Un cruce del precio de cierre por encima de la línea verde actúa como una señal de compra temprana. Un cruce del precio de cierre por encima de la línea roja es una señal para abrir una posición larga. Mientras el precio de cierre se mantenga por encima de la línea verde, se puede mantener la posición larga.
El canal magenta exterior representa un canal de volatilidad dentro del cual los precios se mueven hacia arriba y hacia abajo. La línea verde de regresión lineal se calcula en función de los precios de cierre, mientras que la línea roja de regresión lineal se deriva de los precios máximos. Un cruce del precio de cierre por debajo de la línea roja sirve como la primera señal de venta. Un cruce del precio de cierre por debajo de la línea verde es una señal para abrir una posición corta. Mientras el precio de cierre permanezca por debajo de la línea roja, puedes mantener tu posición corta.
Las líneas negras punteadas verticales en las Figuras 1 y 2 son separadores de meses.
Al final de este artículo, encontrarás el código fuente de MetaTrader 4 (SVE_Regression.mq4) para el indicador SVE_Regression. Simplemente compila el código fuente en el editor de MT4 para generar un archivo ejecutable SVE_Regression.ex4.
Ahora puedes crear dos indicadores de regresión (rojo y verde) en la misma ventana de gráficos, como se muestra en las Figuras 1 y 2.
Los valores de entrada para la línea de regresión lineal verde en el indicador SVE_Regression son los siguientes:
•Periodo de regresión: El número de barras utilizadas para el cálculo (13).
•Corrección de exceso: El factor de desplazamiento y la velocidad de cambio (1.7).
•Tipo de precio: El precio utilizado para el cálculo de la regresión. Las opciones incluyen cierre, apertura, máximo o mínimo. Otros tipos de precios, como típico, mediano y ponderado, se ajustarán por defecto al precio de cierre.
•Media de suavizado: Puedes aplicar una media de suavizado adicional a la línea de regresión. Usar el valor “0” no añade suavizado extra. El tipo de media de suavizado puede ser Simple, Exponencial, Suavizada o Lineal Ponderada.
Parámetros de Entrada de la Regresión (Línea Roja):
La única diferencia aquí es el tipo de precio. Para la línea de regresión lineal roja, se utiliza el precio máximo (High).
Cuando el precio de cierre cae por debajo de la línea de regresión verde, es momento de abrir una posición corta. Mientras el precio se mantenga por debajo de la línea de regresión roja, deberías mantener tu posición corta.
Cuando el precio de cierre sube por encima de la línea de regresión roja, es momento de abrir una posición larga. Mientras el precio se mantenga por encima de la línea de regresión verde, deberías mantener tu posición larga.
Evitando Errores Comunes en el Trading
Errores que debes evitar como trader:
Event | Mistake |
No se ha establecido un límite máximo automático de pérdidas diarias. | Si las órdenes se ejecutan de manera continua por cualquier motivo, asegúrese de tener un límite máximo de pérdidas diarias establecido. Una vez que se alcance este límite, el asesor experto detendrá toda la operativa. |
Evite operar dentro de rangos de negociación pequeños. | Operar dentro de un rango de negociación pequeño es poco probable que sea rentable. Aunque se intente con marcos de tiempo más pequeños, seguirá siendo difícil obtener ganancias. |
El precio se encuentra en el medio de un canal de volatilidad. | Mantente fuera del mercado durante rangos de negociación estrechos, ya que el resultado suele ser incierto. |
El stop loss está configurado demasiado justo. | El uso de un stop loss muy pequeño genera numerosas señales de compra/venta. ¡Detén el auto-trading de inmediato! Un stop loss adecuado debe proporcionar suficiente margen para mantener la operación activa. |
Una nueva posición comienza a moverse en la dirección equivocada después de abrirse. | No cerrar o revertir una operación después de una señal de reversión, o abrir una posición adicional en la misma dirección para intentar una recuperación rápida, suele empeorar la situación. |
¿Buscando cambios de tendencia? | Evita operar en cambios de tendencia. En su lugar, concéntrate en operar continuaciones de tendencia después de una corrección a corto plazo, cuando el precio retoma su tendencia anterior. |
¿Operar cambios de tendencia? | Opera reversiones de tendencia solo cuando se haya alcanzado un objetivo sólido, preferiblemente después de completar un conteo de ondas de Elliott a corto plazo. |
Scalping con ordenadores de alta frecuencia. | Si hay mucha actividad pero solo pequeños movimientos de precio durante un período de tiempo, NO operes. |
Volumen de negociación no ajustado adecuadamente. | El tamaño básico de tu lote está ajustado para una volatilidad media normal. Disminuye el tamaño del lote durante períodos de alta volatilidad y aumenta el valor del stop loss, o simplemente mantente fuera del mercado. |
Operar manual y automáticamente al mismo tiempo. | Evita operar manual y automáticamente al mismo tiempo en el mismo gráfico. El auto-trading podría cerrar todas las operaciones abiertas, interfiriendo potencialmente con tus operaciones manuales. |
A continuación, se presenta el código fuente de SVE_Regression. ¡Muchos éxitos!
//+——————————————————————+
//| SVE_Regression.mq4 |
//| Copyright © 2024, Sylvain Vervoort |
//| http://stocata.org/ |
//| 20240610 version 1.0 |
//+——————————————————————+
#property copyright «Copyright © 2024, Sylvain Vervoort»
//#property link http://stocata.org/
#property description «Version 1.0 – 2024.06.10»
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Green
#property indicator_width1 2
#property strict
//—- input parameters
extern int RegAverage = 13 ; // Regression Period
extern double OvershootCorr = 1.7; // Overshoot Correction
extern ENUM_APPLIED_PRICE TrackingPrice = PRICE_CLOSE;// Price Type, only COHL
extern int SmoothVal = 3; // Smooth average 0=Not Used
extern ENUM_MA_METHOD SmoothType = MODE_SMMA; // Smooth Type
//—- buffers
double SmoReg[];
double RegAverageBuff[];
double sumx = 0;
double sumy = 0;
double sumxy = 0;
double sumx2 = 0;
double sumy2 = 0;
double yint = 0;
double r = 0;
double m = 0;
//+——————————————————————+
//| INITIALIZATION FUNCTION |
//+——————————————————————+
int init()
{
//—- buffers
IndicatorBuffers (2);
SetIndexBuffer (0, SmoReg);
SetIndexStyle (0, DRAW_LINE);
SetIndexDrawBegin (0, RegAverage);
SetIndexBuffer (1, RegAverageBuff);
SetIndexStyle (1, DRAW_NONE);
string StrRegAverage = IntegerToString(RegAverage);
string StrOvershootCorr = DoubleToString(OvershootCorr,1);
IndicatorShortName («SVE_Regression»);
return(0);
}
//+——————————————————————+
//| Custom indicator iteration function |
//+——————————————————————+
int OnCalculate
(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
int n,limit,shift;
limit = rates_total-RegAverage; // avoid property strict error
for (shift=limit-1; shift >= 0; shift–)
{
sumx = 0;
sumy = 0;
sumxy = 0;
sumx2 = 0;
sumy2 = 0;
// Only allow tracking open, close, high, low prices
// Force median, typical and weighted prices to closing prices
if (TrackingPrice ==PRICE_MEDIAN) TrackingPrice = PRICE_CLOSE;
else if (TrackingPrice==PRICE_TYPICAL) TrackingPrice = PRICE_CLOSE;
else if (TrackingPrice==PRICE_WEIGHTED)TrackingPrice = PRICE_CLOSE;
// Calculate xy values separately tracing prices, open, high, low, close
if (TrackingPrice==PRICE_CLOSE) // tracing closing price
{
for (n = 0; n <= RegAverage-1; n++)
// loop through bars calclating LR for each bar
// using the least squares method y=mx+b
{
sumx = sumx + n;
sumy = sumy + close[shift + n];
sumxy = sumxy + n * close[shift + n];
sumx2 = sumx2 + n * n;
sumy2 = sumy2 + close[shift + n] * close[shift + n];
}
}
else if (TrackingPrice==PRICE_OPEN) // Tracing open price
{
for (n = 0; n <= RegAverage-1; n++)
{
sumx = sumx + n;
sumy = sumy + open[shift + n];
sumxy = sumxy + n * open[shift + n];
sumx2 = sumx2 + n * n;
sumy2 = sumy2 + open[shift + n] * open[shift + n];
}
}
else if (TrackingPrice==PRICE_HIGH) // Tracing high price
{
for (n = 0; n <= RegAverage-1; n++)
{
sumx = sumx + n;
sumy = sumy + high[shift + n];
sumxy = sumxy + n * high[shift + n];
sumx2 = sumx2 + n * n;
sumy2 = sumy2 + high[shift + n] * high[shift + n];
}
}
else if (TrackingPrice==PRICE_LOW) // Tracing low price
{
for (n = 0; n <= RegAverage-1; n++)
{
sumx = sumx + n;
sumy = sumy + low[shift + n];
sumxy = sumxy + n * low[shift + n];
sumx2 = sumx2 + n * n;
sumy2 = sumy2 + low[shift + n] * low[shift + n];
}
}
// calculate square root regression for each individual value
double temp = RegAverage * sumx2 – sumx * sumx;
if (temp == 0) temp = .0000001;
m = (RegAverage * sumxy – sumx * sumy) / temp;
temp = RegAverage;
if (temp == 0) temp = .0000001;
yint = (sumy + m * sumx) / temp;
temp = MathSqrt((RegAverage * sumx2 – sumx * sumx) *
(RegAverage * sumy2 – sumy * sumy));
if (temp == 0) temp = .0000001;
r = (RegAverage * sumxy – sumx * sumy) / temp;
RegAverageBuff[shift] = yint – m * RegAverage/(OvershootCorr + 0.0001);
// avoid division by 0
}
// Track result in buffer and display result in the chart
if(SmoothVal > 0){
for (shift=limit-1;shift >= 0;shift–)
SmoReg[shift]=iMAOnArray(RegAverageBuff,0,SmoothVal,0,SmoothType,shift);}
else if(SmoothVal == 0)
for (shift=limit-1;shift >= 0;shift–) SmoReg[shift] = RegAverageBuff[shift];
return(0);
}
//+——————————————————————+