MACD lineal desbloqueando la magia de la regresión lineal en el tradingView

El autor:¿ Qué pasa?, Fecha: 2023-12-15 10:22:50
Las etiquetas:

img

Nombre de la estrategia: Estrategia MACD lineal impulsada por el impulso

Visión general: Esta es una estrategia cuantitativa que utiliza la regresión lineal para predecir los precios de las acciones combinados con el indicador MACD. Aprovecha el análisis de regresión lineal en los precios históricos y los volúmenes para predecir las tendencias futuras de los precios. Luego utiliza el indicador MACD para determinar el momento de entrada cuando surgen oportunidades de ganancia.

Principio de la estrategia:

  1. Calcular los coeficientes de regresión lineal de los precios: ajustar una línea de regresión lineal basada en los volúmenes históricos para predecir los precios futuros.
  2. Trazar los precios previstos: Trazar la línea de predicción basada en los coeficientes de regresión del paso 1.
  3. Generar señales de compra: Cuando el precio previsto está entre los precios de apertura y cierre, y el MACD está subiendo, produce señales de compra.
  4. Generar señales de venta: Cuando el MACD está cayendo y el precio está por debajo del precio previsto, generar señales de venta.

Análisis de ventajas: Esta estrategia combina la predicción estadística y el juicio del indicador técnico. Se deriva la predicción de precios utilizando la regresión lineal, evitando la especulación subjetiva. Mientras tanto, el indicador MACD puede determinar eficazmente el impulso del mercado y capturar oportunidades con precisión. En general, esta estrategia tiene un alto nivel sistemático, predicción precisa y riesgos controlables.

Análisis de riesgos:
La regresión lineal se basa únicamente en datos históricos y puede generar señales incorrectas en respuesta a eventos de cisne negro como noticias bajistas significativas. Además, la configuración de parámetros como la duración del período de regresión afecta el rendimiento de la estrategia. Sugerimos usar vwma para suavizar la curva de precios prevista para mitigar los nervios de la curva que afectan a la estrategia.

Direcciones de optimización:
Creemos que esta estrategia se puede optimizar en los siguientes aspectos:

  1. Incorporar un mecanismo de stop loss. Cortar las pérdidas cuando el precio rompe las líneas de stop loss cerrando posiciones. Esto controla eficazmente las pérdidas causadas por señales incorrectas ocasionales.
  2. Introducir modelos de aprendizaje automático y adoptar modelos más eficientes para mejorar la precisión de las predicciones.
  3. Incluye índices de miedo para determinar el sentimiento del mercado y mejorar la tasa de ganancia.
  4. La validación de las predicciones a través de períodos podría formar una estrategia combinada para superar las limitaciones de un solo marco de tiempo.

Conclusión:
Esta estrategia genera señales comerciales sistemáticas prediciendo precios con regresión lineal y determinando entradas con el indicador MACD. Sus ventajas incluyen lógica predictiva clara, riesgos controlables y amplio espacio de optimización. Creemos que su rendimiento continuará sobresaliendo a través de optimizaciones e iteraciones continuas. Proporciona inspiraciones para aprovechar los modelos de predicción científica para realizar operaciones cuantitativas y merece más investigación y aplicaciones.


/*backtest
start: 2023-12-07 00:00:00
end: 2023-12-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © stocktechbot

//@version=5
strategy("Linear On MACD", overlay=true, margin_long=100, margin_short=100)



fast_length = input(title="Fast Length", defval=12)
slow_length = input(title="Slow Length", defval=26)
tolerance = input.string(title="Risk tolerance", defval = "LOW", options=["LOW", "HIGH"])

chng = 0
obv = ta.cum(math.sign(ta.change(close)) * volume)
if close < close[1] and (open < close)
    chng := 1
else if close > close[1]
    chng := 1
else
    chng := -1
obvalt = ta.cum(math.sign(chng) * volume)
//src = input(title="Source", defval=close)
src = obvalt
signal_length = input.int(title="Signal Smoothing",  minval = 1, maxval = 50, defval = 9)
sma_source = input.string(title="Oscillator MA Type",  defval="EMA", options=["SMA", "EMA"])
sma_signal = input.string(title="Signal Line MA Type", defval="EMA", options=["SMA", "EMA"])

// Calculating
fast_ma = sma_source == "SMA" ? ta.sma(src, fast_length) : ta.ema(src, fast_length)
slow_ma = sma_source == "SMA" ? ta.sma(src, slow_length) : ta.ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal == "SMA" ? ta.sma(macd, signal_length) : ta.ema(macd, signal_length)
hist = macd - signal
//hline(0, "Zero Line", color=color.new(#787B86, 50))
//plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below)))
//plot(macd, title="MACD", color=col_macd)
//plot(signal, title="Signal", color=col_signal)
[macdLine, signalLine, histLine] = ta.macd(close, 12, 26, 9)

//Linear Regression

vol = volume

// Function to calculate linear regression
linregs(y, x, len) =>
    ybar = math.sum(y, len)/len
    xbar = math.sum(x, len)/len
    b = math.sum((x - xbar)*(y - ybar),len)/math.sum((x - xbar)*(x - xbar),len)
    a = ybar - b*xbar
    [a, b]

// Historical stock price data
price = close

// Length of linear regression
len = input(defval = 21, title = 'Lookback')

// Calculate linear regression for stock price based on volume
[a, b] = linregs(price, vol, len)

// Predicted stock price based on volume
predicted_price = a + b*vol

// Check if predicted price is between open and close
is_between = open < predicted_price and predicted_price < close


// Plot predicted stock price
plot(predicted_price, color=color.rgb(218, 27, 132), linewidth=2, title="Predicted Stock Price")
plot(ta.vwma(predicted_price,len), color=color.rgb(199, 43, 64), linewidth=2, title="Predicted Stock Price")

//BUY Signal
lincrossunder = close > predicted_price
macdrise = ta.rising(macd,2)
//macdvollong = ta.crossover(macd, signal)
//macdlong = ta.crossover(macdLine, signalLine)
macdvollong = macd > signal
macdlong = macdLine > signalLine
longCondition=false
if macdlong and macdvollong and is_between and ta.rising(predicted_price,1)
    longCondition := true

if (longCondition)
    strategy.entry("My Long Entry Id", strategy.long)
//Sell Signal
lincrossover = close < predicted_price
macdfall = ta.falling(macd,1)
macdsell = macd < signal
shortCondition = false
risklevel = predicted_price
if (tolerance == "HIGH")
    risklevel := ta.vwma(predicted_price,len)


if macdfall and macdsell and (macdLine < signalLine) and (close < risklevel)
    shortCondition := true


if (shortCondition)
    strategy.entry("My Short Entry Id", strategy.short)


Más.