선형 MACD는 트레이딩에서 선형 회귀의 마술을 풀고 있습니다

저자:차오장, 날짜: 2023-12-15 10:22:50
태그:

img

전략 이름: 모멘텀 구동형 선형 MACD 전략

개요: 이것은 MACD 지표와 결합하여 주식 가격을 예측하기 위해 선형 회귀를 활용하는 양적 전략입니다. 미래 가격 추세를 예측하기 위해 역사적 가격과 양에 대한 선형 회귀 분석을 활용합니다. 이 때 이익 기회가 나타날 때 입시 시기를 결정하기 위해 MACD 지표를 사용합니다.

전략 원칙:

  1. 가격의 선형 회귀 계수를 계산합니다. 미래의 가격을 예측하기 위해 역사적인 양에 기반한 선형 회귀 선을 맞추십시오.
  2. 예측된 가격을 그래프로 표시합니다. 단계 1의 회귀 계수들을 기반으로 예측선을 그래프로 표시합니다.
  3. 구매 신호를 생성합니다. 예측된 가격이 오픈과 클로즈 가격 사이에 있고 MACD가 상승할 때 구매 신호를 생성합니다.
  4. 판매 신호를 생성: MACD가 하락하고 가격이 예측 가격보다 낮을 때 판매 신호를 생성합니다.

이점 분석: 이 전략은 통계적 예측과 기술적 지표 판단을 결합합니다. 주관적 투기를 피하여 선형 회귀를 사용하여 가격 예측을 도출합니다. 한편 MACD 지표는 시장 추진력을 효과적으로 결정하고 기회를 정확하게 포착 할 수 있습니다. 전반적으로이 전략은 높은 체계적 수준, 정확한 예측 및 제어 가능한 위험을 가지고 있습니다.

위험 분석:
선형 회귀는 역사적 데이터에만 의존하고 있으며, 흑백조 사건에 대응하여 부정확한 신호를 생성할 수 있습니다. 또한 회귀 기간 길이가 전략 성능에 영향을 미치는 것과 같은 매개 변수 설정. 우리는 전략에 영향을 미치는 곡선 불안을 완화하기 위해 예측된 가격 곡선을 매끄럽게하기 위해 vwma를 사용하는 것을 제안합니다.

최적화 방향:
우리는 이 전략이 다음과 같은 측면에서 최적화 될 수 있다고 믿습니다.

  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)


더 많은