골든 크로스 기반의 트렌드 트레이딩 전략

저자:차오장, 날짜: 2023-11-23 14:07:11
태그:

img

전반적인 설명

골든 크로스 트레이딩 전략 (golden cross trading strategy) 은 중장기 트렌드 추적 전략이다. SR 지표와 SR 신호 지표를 계산하여 주식 가격의 트렌드 방향을 파악하고, 신경 네트워크 알고리즘을 사용하여 트렌드 채널을 그리면서 트렌드 추적 작업을 구현한다. SR 지표가 SR 신호를 넘을 때 구매 신호가 생성된다. SR 지표가 SR 신호 아래를 넘을 때 판매 신호가 생성된다. 이 전략은 또한 적응형 선형 회귀 필터 기술을 사용하여 채널 곡선을 최적화하여 잘못된 신호를 효과적으로 억제한다.

원칙

이 전략의 핵심 지표는 SR 지표와 SR 신호 지표이다. SR 지표는 WMA 이동 평균과 SMA 이동 평균의 2차 합성이며 기간은 8이다. SR 신호 지표는 20의 기간으로 계산된 SR 지표이다. SR 지표와 SR 신호의 황금 십자가와 사망은 트렌드 방향을 결정하는 데 사용됩니다.

이 전략은 신경 네트워크 알고리즘을 사용하여 자동으로 적응 채널을 형성하기 위해 주식 가격의 상위 및 하위 한계를 그래프화합니다. 상위 한도는 SR 지표의 역사적 최대 값을 입력으로, 하위 한도는 역사적 최소 값을 입력으로, 회귀 곡선은 각각 채널의 상위 및 하위 한도로 계산됩니다. 적응 선형 회귀 필터링 후에 채널 곡선은 부드럽습니다.

SR 지표가 SR 신호를 넘을 때 구매 신호가 생성됩니다. SR 지표가 SR 신호 아래를 넘을 때 판매 신호가 생성됩니다. 긴 신호와 짧은 신호가 발급된 후 주식 가격과 채널의 상하계와 상하계 사이의 관계는 스톱 로스 및 수익 포지션을 결정합니다.

장점

  • 가격 변동의 영향을 제거하고 트렌드 방향을 정확하게 결정하기 위해 이선형 합성 기술을 사용합니다.
  • 적응식 채널 알고리즘은 입출시기를 최적화하고 잘못된 브레이크를 피합니다.
  • 채널 곡선들은 극한으로부터의 왜곡을 피하기 위해 적응형 선형 회귀 필터링 기술을 적용합니다.
  • 스톱 로즈와 수익 포지션은 채널에 따라 동적으로 변화하며, 자동으로 수익 트렌드를 추적합니다.

위험 분석

이 트렌드 추적 전략의 주요 위험은 다음과 같습니다.

  • 많은 잘못된 신호를 생성하고 오스실레이션 트렌드에서 과도한 유효하지 않은 작업을 생성합니다.
  • 갑작스러운 사건으로 인해 채널의 하단 한계 아래로 급격히 깨는 것은 엄청난 손실을 초래합니다.
  • 부적절한 매개 변수 설정은 쉽게 전략 실패를 일으킬 수 있습니다.

위험을 제어하기 위해 단일 전략에 의존하는 대신 다른 전략과 결합하는 것이 좋습니다. 동시에 다양한 시장 환경에 적응하기 위해 매개 변수 설정을 최적화하십시오.

최적화 방향

이 전략은 다음과 같은 측면에서 최적화 될 수 있습니다.

  1. 크로스오버 신호의 안정성을 높이기 위해 SR 표시기와 신호 표시기의 매개 변수를 최적화한다.

  2. 채널 곡선을 매끄럽게 하기 위해 적응 채널의 사이클 기간을 최적화 합니다.

  3. 다른 필터 표시기를 추가하여 에너지 표시기, 변동성 표시기 등 오류를 방지합니다.

  4. 딥러닝 알고리즘을 통합하여 실시간으로 채널 곡선을 최적화하고 적응력을 향상시킵니다.

요약

골든 크로스 트레이딩 전략은 중장기 트렌드를 추적하는 효과적인 수치 전략이다. 트렌드 방향과 낮은 운영 위험을 올바르게 결정할 확률이 높다. 알고리즘 모델을 최적화하는 데 큰 여지가 있어 이 전략은 주식 트렌드의 변화를 추적하는 강력한 도구가 될 가능성이 있다.


/*backtest
start: 2023-11-15 00:00:00
end: 2023-11-22 00:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

strategy(title = " Strategy PyramiCover",
         shorttitle = "S-PC",
         overlay = true,
         precision = 8,
         calc_on_order_fills = true,
         calc_on_every_tick = true,
         backtest_fill_limits_assumption = 0,
         default_qty_type = strategy.fixed,
         default_qty_value = 2,
         initial_capital = 10000,
         pyramiding=50,
         currency = currency.USD,
         linktoseries = true)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

backTestSectionFrom = input(title = "═══════════════ From ═══════════════", defval = true, type = input.bool)

FromMonth         = input(defval = 1, title = "Month", minval = 1)
FromDay           = input(defval = 1, title = "Day", minval = 1)
FromYear          = input(defval = 2014, title = "Year", minval = 2014)

backTestSectionTo = input(title = "════════════════ To ════════════════", defval = true, type = input.bool)
ToMonth           = input(defval = 31, title = "Month", minval = 1)
ToDay             = input(defval = 12, title = "Day", minval = 1)
ToYear            = input(defval = 9999, title = "Year", minval = 2014)

backTestPeriod() => (time > timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time < timestamp(ToYear, ToMonth, ToDay, 23, 59))

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

per = input(14,title="🔹 Length")
//
up = 0.0
nup= 0.0
lowl = 0.0
nin = 0.0
//
srl=wma(close,8)
srr = sma(close,8)
sr = 2*srl - srr
//
srsl=wma(close,20)
srsr= sma(close,20)
srsignal = 2*srsl - srsr
//
if sr>srsignal
    up := highest(sr,round(150))
    nup :=highest(srsignal,round(20))
else
    up := highest(srsignal,round(150))
    nup := highest(sr,round(20))
//
if sr<srsignal
    lowl := lowest(sr,round(150))
    nin := lowest(srsignal,round(20))
else
    lowl := lowest(sr,round(150))
    nin := lowest(srsignal,round(20))
//reg alexgrover
f_reg(src,length)=>
    x = bar_index
    y = src
    x_ = sma(x, length)
    y_ = sma(y, length)
    mx = stdev(x, length)
    my = stdev(y, length)
    c = correlation(x, y, length)
    slope = c * (my / mx)
    inter = y_ - slope * x_
    reg = x * slope + inter
    reg
//
up_=f_reg(up,per)
lowl_=f_reg(lowl,per)
nup_=f_reg(nup,per)
nin_=f_reg(nin,per)
//
plot(sr, title='SR', color=color.green, linewidth=2, style=plot.style_line,transp=0)
plot(srsignal, title='SR-Signal', color=color.red, linewidth=2, style=plot.style_line,transp=0)
plot(up_, title='Upper limit', color=color.blue, linewidth=3, style=plot.style_line,transp=0)
plot(lowl_, title='Lower limit', color=color.blue, linewidth=3, style=plot.style_line,transp=0)
a=plot(nup_, title='Neuronal Upper', color=color.gray, linewidth=1, style=plot.style_line,transp=0)
b=plot(nin_, title='Neuronal Lower', color=color.gray, linewidth=1, style=plot.style_line,transp=0)
fill(a, b, color=color.gray)
plotshape(crossunder(sr,nup_)? sr+atr(20):na, title="Sell", text="🐻", location=location.absolute, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.black,transp=0)
plotshape(crossover(sr,nin_)? sr-atr(20):na, title="Buy", text="🐂", location=location.absolute, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.black,transp=0)

//
// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ //

if backTestPeriod()

    strategy.entry("Buy", true, 1, when = crossover(sr,nin_)) 
    strategy.entry("Short", false, 1, when = crossunder(sr,nup_))

더 많은