가중 이동 평균 교차를 기반으로 한 양적 거래 전략


생성 날짜: 2023-12-06 12:05:01 마지막으로 수정됨: 2023-12-06 12:05:01
복사: 0 클릭수: 626
avatar of ChaoZhang ChaoZhang
1
집중하다
1619
수행원

가중 이동 평균 교차를 기반으로 한 양적 거래 전략

개요

이 전략은가중된 양적 이동 평균 교차 전략(Weighted Quantitative Moving Average Crossover Strategy) 의 기본 아이디어는 가격, 거래량 등과 같은 여러 지표를 결합하여 빠른 라인과 느린 라인을 설계하고 금 포크와 사다리 포크가 발생할 때 구매 및 판매 신호를 발령하는 것입니다.

전략 원칙

이 전략의 핵심 지표는 양적 이동 평균 (Quantitative Moving Average, QMA) 이다. QMA는 일정 기간 동안의 중도 평균 가격을 계산하여 트렌드 방향을 측정합니다. 일반 이동 평균과 다른 점은 가격의 무게 (중도 = 가격) 이다.*거래량은 시간이 지남에 따라 감소한다. 따라서, 최근 가격의 무게가 더 커지고, 시장의 변화에 더 빠르게 반응할 수 있다.

구체적으로, 이 전략은 빠른 QMA 라인을 구축하고 느린 QMA 라인을 구축한다. 빠른 라인 파라미터는 25일, 느린 라인 파라미터는 29일로 설정된다. 빠른 라인이 아래에서 느린 라인을 통과하면 구매 신호가 발생하고 빠른 라인이 위에서 아래에서 느린 라인을 통과하면 판매 신호가 발생한다.

우위 분석

일반 이동 평균에 비해 이 전략은 다음과 같은 장점이 있습니다.

  1. 시장에 더 빠르게 대응하여 단선 기회를 잡을 수 있습니다.
  2. 가격과 거래량의 여러 차원을 결합하여 더 큰 안정성을 갖습니다.
  3. 다양한 시장 환경에 적응할 수 있는 유연한 변수 설정

위험 분석

이 전략에는 몇 가지 위험도 있습니다.

  1. 단선 운영이 빈번하여 거래 비용과 점유율을 높일 수 있습니다.
  2. PARAMETERS 과잉 최적화로 인해 곡선 적합성이 발생할 수 있습니다.
  3. 거래량이 적을 때 지표 효과는 하락할 수 있습니다.

이러한 위험은 적절한 변수 주파수 조정, 엄격한 워크 포워드 분석, 그리고 다른 지표와 결합하여 완화할 수 있다.

최적화 방향

이 전략에는 더 많은 최적화할 여지가 있습니다.

  1. QMA의 변수를 동적으로 조정하여 시장의 변동에 따라 적응할 수 있도록 합니다.
  2. 변동성, 거래량과 같은 지표들을 결합하여 진입 기회를 필터링합니다.
  3. 단편적 손실을 통제하기 위한 전략

요약하다

이 전략은 전반적으로 안정성이 좋은 단기 거래 전략이다. 단일 가격 평균에 비해, 이 전략의 지표는 시장 수요 공급 관계를 더 잘 반영한다. 매개 변수 조정 및 위험 관리 수단의 도입을 통해 이 전략은 장기적으로 안정적으로 작동하여 좋은 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2022-11-29 00:00:00
end: 2023-12-05 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Brad VWMACD Strategy 2233", overlay=false, max_bars_back=500,default_qty_type=strategy.percent_of_equity,commission_type=strategy.commission.percent, commission_value=0.18, default_qty_value=100)

// === INPUT BACKTEST RANGE === 
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"

// === INPUT SMA === 
//fastMA    = input(defval = 16, type = integer, title = "FastMA", minval = 1 )
//slowMA    = input(defval = 23, type = integer, title = "SlowMA", minval = 1)

fastMA    = input(defval = 25, title = "FastMA", minval = 1 )
slowMA    = input(defval = 29,  title = "SlowMA", minval = 1)

Long_period = slowMA
Short_period = fastMA
Smoothing_period = input(9, minval=1)
xLongMAVolPrice = ema(volume * close, Long_period) 
xLongMAVol = ema(volume, Long_period) 
xResLong = (xLongMAVolPrice * Long_period) / (xLongMAVol * Long_period)
xShortMAVolPrice = ema(volume * close, Short_period) 
xShortMAVol = ema(volume, Short_period) 
xResShort = (xShortMAVolPrice * Short_period) / (xShortMAVol * Short_period)
xVMACD = xResShort - xResLong
xVMACDSignal = ema(xVMACD, Smoothing_period)
nRes = xVMACD - xVMACDSignal
//plot(nRes*20+slowMA, color=blue, style = line )
//plot(3000, color=red, style = line )


// === SERIES SETUP ===

buy  = crossover( xVMACD,xVMACDSignal)     // buy when fastMA crosses over slowMA
sell = crossunder( xVMACD,xVMACDSignal)  // sell when fastMA crosses under slowMA


// === SERIES SETUP === 

//buy  = crossover(vwma(close, fastMA),7+vwma(close, slowMA))     // buy when fastMA crosses over slowMA
//sell = crossunder(vwma(close, fastMA),vwma(close, slowMA)-7)    // sell when fastMA crosses under slowMA

// === EXECUTION ===
strategy.entry("L", strategy.long, when = window() and buy)  // buy long when "within window of time" AND crossover
strategy.close("L", when = window() and sell)                // sell long when "within window of time" AND crossunder         

// === EXECUTION ===
strategy.entry("S", strategy.short, when = window() and sell)  // buy long when "within window of time" AND crossover
strategy.close("S", when = window() and buy)                // sell long when "within window of time" AND crossunder         

plotshape(window() and buy, style=shape.triangleup, color=green, text="up")
plotshape(window() and sell, style=shape.triangledown, color=red, text="down")
plot(xVMACD*100, title = 'FastMA', color = orange, linewidth = 2, style = line)  // plot FastMA
plot(xVMACDSignal*100, title = 'SlowMA', color = aqua, linewidth = 2, style = line)    // plot SlowMA