Линейный MACD раскрывает магию линейной регрессии в торговлеView

Автор:Чао Чжан, Дата: 15-12-2023 10:22:50
Тэги:

img

Название стратегии: Импульсная линейная стратегия MACD

Обзор: Это количественная стратегия, которая использует линейную регрессию для прогнозирования цен на акции в сочетании с индикатором MACD. Он использует линейный регрессионный анализ исторических цен и объемов для прогнозирования будущих ценовых тенденций. Затем он использует индикатор MACD для определения времени входа, когда появляются возможности получения прибыли.

Принцип стратегии:

  1. Вычислить линейные регрессивные коэффициенты цен: приспособить линейную регрессивную линию на основе исторических объемов для прогнозирования будущих цен.
  2. График прогнозируемых цен: График линии прогнозирования на основе коэффициентов регрессии с шага 1.
  3. Создание сигналов покупки: когда прогнозируемая цена находится между открытыми и закрытыми ценами, а MACD растет, создают сигналы покупки.
  4. Создание сигналов продажи: когда MACD падает и цена ниже прогнозируемой цены, создание сигналов продажи.

Анализ преимуществ: Эта стратегия сочетает в себе статистическое предсказание и суждение по техническим показателям. Она выводит прогноз цен с использованием линейной регрессии, избегая субъективных спекуляций. Между тем, индикатор MACD может эффективно определять рыночный импульс и точно улавливать возможности. В целом эта стратегия имеет высокий систематический уровень, точное предсказание и контролируемые риски.

Анализ рисков:
Линейная регрессия основана исключительно на исторических данных и может генерировать неверные сигналы в ответ на события черного лебедя, такие как значительные медвежие новости. Кроме того, параметры, такие как длина периода регрессии, влияют на эффективность стратегии.

Направления оптимизации:
Мы считаем, что эта стратегия может быть оптимизирована в следующих аспектах:

  1. Включить механизм стоп-лосса. Сократить убытки, когда цена проходит через линии стоп-лосса, закрывая позиции. Это эффективно контролирует убытки, вызванные случайными неправильными сигналами.
  2. Внедрение моделей машинного обучения. Принятие более эффективных моделей для повышения точности прогнозов.
  3. Включайте показатели настроения. Включайте показатели страха, чтобы определить настроение рынка и улучшить показатель выигрыша.
  4. Сочетание нескольких временных рамок. Подтверждение прогнозов в течение периода может сформировать комбинированную стратегию для преодоления ограничений одного временного рама.

Заключение:
Эта стратегия генерирует систематические торговые сигналы путем прогнозирования цен с линейной регрессией и определения входов с помощью индикатора MACD. Ее преимущества включают в себя четкую логику прогнозирования, контролируемые риски и большое пространство для оптимизации. Мы считаем, что ее производительность будет продолжать превосходить благодаря непрерывным оптимизациям и итерациям. Она дает вдохновение для использования научных моделей прогнозирования для проведения количественной торговли и заслуживает дальнейших исследований и применений.


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


Больше