다중 코어 회귀 동적 반응기 추세 추종 전략

ATR SMA RSI DR MKR TP SL TS
생성 날짜: 2025-02-24 09:22:48 마지막으로 수정됨: 2025-07-21 13:03:01
복사: 1 클릭수: 313
avatar of ianzeng123 ianzeng123
2
집중하다
319
수행원

다중 코어 회귀 동적 반응기 추세 추종 전략 다중 코어 회귀 동적 반응기 추세 추종 전략

개요

이 전략은 동적 반응기 (Dynamic Reactor) 와 다중핵 회귀 (Multi-Kernel Regression) 를 결합한 트렌드 추적 시스템이다. ATR 채널, SMA 평준, 그리고 고스 핵 회귀와 에파네치니코프 핵 회귀를 결합하여 시장 트렌드를 포착하고 RSI 지표를 사용하여 신호 필터링을 한다. 이 전략은 또한 동적 스톱 손실, 다중 수익 목표 및 스톱 손실 추적 등의 기능을 포함하는 완전한 포지션 관리 시스템을 포함하고 있다.

전략 원칙

전략의 핵심은 두 가지 주요 부분으로 구성된다. 첫 번째 부분은 동적 반응기 (DR) 이며, ATR과 SMA를 기반으로 스스로 적응하는 가격 통로를 구축한다. 통로의 폭은 ATR의 곱에 의해 결정되며, 통로의 위치는 SMA의 움직임에 따라 조정된다. 가격이 통로를 뚫을 때 시스템은 트렌드 방향을 업데이트한다. 두 번째 부분은 다중 핵심 회귀 (MKR) 이며, 고스 핵 회귀와 에파네치니코프 핵 회귀의 두 가지 다른 핵심 함수를 결합한다.

전략적 이점

  1. 적응력: 동적 반응기와 다중 중심 회귀를 결합하여 전략은 다양한 시장 환경과 변동 조건에 자동으로 적응할 수 있습니다.
  2. 리스크 관리: 동적 상쇄, 분기 수익 및 추적 상쇄와 같은 다중 리스크 제어 메커니즘을 포함합니다.
  3. 신호 품질: RSI 필터링과 두 선의 교차 확인을 통해 가짜 신호를 효과적으로 줄일 수 있다.
  4. 계산 효율: 복잡한 핵 회귀 알고리즘을 사용하지만, 계산 방법을 최적화하여 전략의 실시간 성능을 보장한다.

전략적 위험

  1. 변수 민감성: 전략 효과는 ATR 곱하기, 핵 함수 대역폭 등 변수의 설정에 크게 의존하며, 부적절한 변수는 과도한 거래 또는 놓친 기회를 초래할 수 있다.
  2. 후기성: 이동 평균과 회귀 알고리즘을 사용하기 때문에 빠른 시점에 약간의 후기가 있을 수 있다.
  3. 시장 적응성: 전략은 트렌드 시장에서 잘 작동하지만, 지역 흔들림 시장에서는 종종 잘못된 신호를 일으킬 수 있다.
  4. 계산 복잡성: 다중 코어 회귀 부분의 계산은 더 복잡하며, 고주파 거래 환경에서는 성능 최적화에 주의를 기울여야 한다.

전략 최적화 방향

  1. 매개 변수 자조: 자조 메커니즘을 도입하여 시장의 변동에 따라 ATR 곱셈과 핵심 함수 대역폭을 동적으로 조정할 수 있다.
  2. 신호 최적화: 거래량, 가격 형태와 같은 보조 지표를 추가하여 신호의 신뢰성을 높이는 것을 고려하십시오.
  3. 위험 제어: 시장의 변동성에 따라 동적으로 조정할 수 있는 스톱로스 및 수익 목표의 비율.
  4. 시장 필터링: 시장 환경 인식 모듈을 추가하여 다른 시장 조건에 따라 다른 거래 전략을 사용합니다.

요약하다

이것은 현대적인 통계학적 방법과 전통적인 기술적 분석을 결합한 완전한 거래 시스템입니다. 동적 반응기 및 다중 중심 회귀의 혁신적인 조합과 완벽한 위험 관리 메커니즘을 통해이 전략은 뛰어난 적응력과 안정성을 보여줍니다. 일부 최적화가 필요한 곳이 있지만, 지속적인 개선과 매개 변수 최적화를 통해이 전략은 다양한 시장 환경에서 안정적인 성능을 유지할 것으로 예상됩니다.

전략 소스 코드
/*backtest
start: 2024-07-20 00:00:00
end: 2025-07-19 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Binance","currency":"ETH_USDT","balance":2000000}]
*/

//@version=5
strategy("DR+MKR Signals – Band SL, Multiple TP & Trailing Stop", overlay=true, default_qty_value=10)

// =====================================================================
// PART 1: Optimized Dynamic Reactor
// =====================================================================
atrLength  = input.int(10, "ATR Length", minval=1)         // Lower value for increased sensitivity
smaLength  = input.int(10, "SMA Length", minval=1)         // Lower value for a faster response
multiplier = input.float(1.2, "ATR Multiplier", minval=0.1, step=0.1) // Adjusted for tighter bands

atrValue  = ta.atr(atrLength)
smaValue  = ta.sma(close, smaLength)

basicUpper = smaValue + atrValue * multiplier
basicLower = smaValue - atrValue * multiplier

var float finalUpper = basicUpper
var float finalLower = basicLower
if bar_index > 0
    finalUpper := close[1] > finalUpper[1] ? math.max(basicUpper, finalUpper[1]) : basicUpper
if bar_index > 0
    finalLower := close[1] < finalLower[1] ? math.min(basicLower, finalLower[1]) : basicLower

var int trend = 1
if bar_index > 0
    trend := close > finalUpper[1] ? 1 : close < finalLower[1] ? -1 : nz(trend[1], 1)

drLine = trend == 1 ? finalLower : finalUpper
p_dr   = plot(drLine, color = trend == 1 ? color.green : color.red, title="Dynamic Reactor", linewidth=2)

// =====================================================================
// PART 2: Optimized Multi Kernel Regression
// =====================================================================
regLength = input.int(30, "Regression Period", minval=1)  // Lower value for increased sensitivity
h1        = input.float(5.0, "Gaussian Band (h1)", minval=0.1) // Adjusted for a better fit
h2        = input.float(5.0, "Epanechnikov Band (h2)", minval=0.1)
alpha     = input.float(0.5, "Gaussian Kernel Weight", minval=0, maxval=1)

f_gaussian_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        weight = math.exp(-0.5 * math.pow(i / bw, 2))
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)

f_epanechnikov_regression(bw) =>
    num = 0.0
    den = 0.0
    for i = 0 to regLength - 1
        ratio = i / bw
        weight = math.abs(ratio) <= 1 ? (1 - math.pow(ratio, 2)) : 0
        num += close[i] * weight
        den += weight
    num / (den == 0 ? 1 : den)

regGauss = f_gaussian_regression(h1)
regEpan  = f_epanechnikov_regression(h2)
multiKernelRegression = alpha * regGauss + (1 - alpha) * regEpan
p_mkr = plot(multiKernelRegression, color = trend == 1 ? color.green : color.red, title="Multi Kernel Regression", linewidth=2)

fill(p_dr, p_mkr, color = trend == 1 ? color.new(color.green, 80) : color.new(color.red, 80), title="Trend Fill")

// =====================================================================
// PART 3: Buy and Sell Signals + RSI Filter
// =====================================================================
rsi = ta.rsi(close, 14)
buySignal  = ta.crossover(multiKernelRegression, drLine) and rsi < 70
sellSignal = ta.crossunder(multiKernelRegression, drLine) and rsi > 30

plotshape(buySignal, style=shape.triangleup, location=location.belowbar, color=color.green, size=size.tiny, title="Buy Signal")
plotshape(sellSignal, style=shape.triangledown, location=location.abovebar, color=color.red, size=size.tiny, title="Sell Signal")

alertcondition(buySignal, title="Buy Alert", message="Buy Signal generated")
alertcondition(sellSignal, title="Sell Alert", message="Sell Signal generated")

// =====================================================================
// PART 4: Trade Management – Dynamic Stop Loss & Adaptive Take Profit
// =====================================================================
var float riskValue = na
if strategy.position_size == 0
    riskValue := na

enterLong() =>
    strategy.entry("Long", strategy.long,comment='开多仓')
    close - finalLower

enterShort() =>
    strategy.entry("Short", strategy.short,comment='开空仓')
    finalUpper - close

if (buySignal)
    riskValue := enterLong()

if (sellSignal)
    riskValue := enterShort()

exitLongOrders() =>
    entryPrice = strategy.position_avg_price
    TP1 = entryPrice + riskValue
    strategy.exit("Long_TP1", from_entry="Long", limit=TP1, qty_percent=50, comment="平多仓TP 1:1")
    strategy.exit("Long_TS", from_entry="Long", trail_offset=riskValue * 0.8, trail_points=riskValue * 0.8, comment="平多仓Trailing Stop")

if (strategy.position_size > 0)
    exitLongOrders()

exitShortOrders() =>
    entryPrice = strategy.position_avg_price
    TP1 = entryPrice - riskValue
    strategy.exit("Short_TP1", from_entry="Short", limit=TP1, qty_percent=50, comment="平空仓TP 1:1")
    strategy.exit("Short_TS", from_entry="Short", trail_offset=riskValue * 0.8, trail_points=riskValue * 0.8, comment="平空仓Trailing Stop")

if (strategy.position_size < 0)
    exitShortOrders()