Le MACD linéaire débloque la magie de la régression linéaire dans le tradingView

Auteur:ChaoZhang est là., Date: le 15 décembre 2023 à 10 h 22:50
Les étiquettes:

img

Nom de la stratégie: Stratégie MACD linéaire axée sur l'élan

Vue d'ensemble: Il s'agit d'une stratégie quantitative qui utilise la régression linéaire pour prédire les prix des actions combinée à l'indicateur MACD. Elle tire parti de l'analyse de régression linéaire sur les prix et les volumes historiques pour prédire les tendances futures des prix.

Principe de stratégie:

  1. Calculer les coefficients de régression linéaire des prix: adapter une ligne de régression linéaire basée sur les volumes historiques pour prédire les prix futurs.
  2. Tracer les prix prévus: tracer la ligne de prédiction basée sur les coefficients de régression de l'étape 1.
  3. Générer des signaux d'achat: Lorsque le prix prévu se situe entre les prix d'ouverture et de clôture, et que le MACD est en hausse, produire des signaux d'achat.
  4. Générer des signaux de vente: lorsque le MACD est en baisse et que le prix est inférieur au prix prévu, générer des signaux de vente.

Analyse des avantages: Cette stratégie combine la prédiction statistique et le jugement des indicateurs techniques. Elle dérive la prédiction des prix en utilisant la régression linéaire, en évitant la spéculation subjective. Pendant ce temps, l'indicateur MACD peut déterminer efficacement la dynamique du marché et saisir les opportunités avec précision. Dans l'ensemble, cette stratégie a un niveau systématique élevé, une prédiction précise et des risques contrôlables.

Analyse des risques:
La régression linéaire repose uniquement sur des données historiques et peut générer des signaux incorrects en réponse à des événements du cygne noir comme des nouvelles significativement baissières.

Directions d' optimisation:
Nous pensons que cette stratégie peut être optimisée dans les aspects suivants:

  1. Incorporer un mécanisme de stop loss. Couper les pertes lorsque le prix franchit les lignes de stop loss en fermant les positions. Cela contrôle efficacement les pertes causées par des signaux incorrects occasionnels.
  2. Introduire des modèles d'apprentissage automatique, adopter des modèles plus efficaces pour améliorer la précision des prédictions.
  3. Incorporer des indicateurs de sentiment, des indices de peur pour déterminer le sentiment du marché et améliorer le taux de réussite.
  4. La validation des prédictions à travers les périodes pourrait former une stratégie combinée pour surmonter les limitations d'un seul laps de temps.

Conclusion:
Cette stratégie génère des signaux de trading systématiques en prédisant les prix avec régression linéaire et en déterminant les entrées avec l'indicateur MACD. Ses avantages incluent une logique prédictive claire, des risques contrôlables et un espace d'optimisation ample. Nous pensons que sa performance continuera à exceller grâce à des optimisations et des itérations continues.


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


Plus de