O recurso está a ser carregado... Carregamento...

MACD linear desbloqueando a magia da regressão linear no TradingView

Autora:ChaoZhang, Data: 2023-12-15 10:22:50
Tags:

img

Nome da estratégia: estratégia MACD linear impulsionada

Visão geral: Esta é uma estratégia quantitativa que utiliza regressão linear para prever os preços das ações combinados com o indicador MACD. Ele aproveita a análise de regressão linear em preços históricos e volumes para prever tendências de preços futuras.

Princípio de estratégia:

  1. Calcular coeficientes de regressão lineares dos preços: ajustar uma linha de regressão linear baseada em volumes históricos para prever preços futuros.
  2. Gravar os preços previstos: Gravar a linha de previsão com base nos coeficientes de regressão do passo 1.
  3. Gerar sinais de compra: Quando o preço previsto está entre os preços de abertura e fechamento, e o MACD está subindo, produzir sinais de compra.
  4. Gerar sinais de venda: Quando o MACD está caindo e o preço está abaixo do preço previsto, gerar sinais de venda.

Análise das vantagens: Esta estratégia combina previsão estatística e julgamento de indicadores técnicos. Deriva a previsão de preços usando regressão linear, evitando especulação subjetiva. Enquanto isso, o indicador MACD pode determinar efetivamente o impulso do mercado e capturar oportunidades com precisão.

Análise de riscos:
A regressão linear depende apenas de dados históricos e pode gerar sinais incorretos em resposta a eventos de cisne negro, como notícias significativamente de baixa. Além disso, configurações de parâmetros, como comprimentos de período de regressão, afetam o desempenho da estratégia. Sugerimos usar vwma para suavizar a curva de preços prevista para mitigar os nervosos da curva que afetam a estratégia.

Orientações de otimização:
Acreditamos que esta estratégia pode ser otimizada nos seguintes aspectos:

  1. Incorporar um mecanismo de stop loss. Cortar perdas quando o preço atravessa as linhas de stop loss fechando posições. Isso controla efetivamente as perdas causadas por sinais incorretos ocasionais.
  2. Introduzir modelos de aprendizagem de máquina. Adotar modelos mais eficientes para melhorar a precisão da previsão.
  3. Incluir índices de medo para determinar o sentimento do mercado e melhorar a taxa de ganho.
  4. Combinar vários prazos: a validação de previsões entre períodos poderia formar uma estratégia combinada para superar as limitações de um único período.

Conclusão:
Esta estratégia gera sinais de negociação sistemáticos, prevendo preços com regressão linear e determinando entradas com o indicador MACD. Suas vantagens incluem lógica preditiva clara, riscos controláveis e amplo espaço de otimização. Acreditamos que seu desempenho continuará a se destacar através de otimizações e iterações contínuas. Ele fornece inspirações para alavancar modelos de previsão científica para realizar negociações quantitativas e merece mais pesquisas e aplicações.


/*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)


Mais.