이중 이동 평균 크로스오버에 기초한 양적 거래 전략

저자:차오장, 날짜: 2024-02-21 14:28:28
태그:

img

전반적인 설명

이 전략은 Double Moving Average Crossover를 기반으로 한 양적 거래 전략 (Quantitative Trading Strategy Based on Double Moving Average Crossover) 이라고 불립니다. 이 전략의 주요 아이디어는 가격 추세를 결정하고 이에 따라 구매 및 판매 결정을 내리는 데 빠른 이동 평균선과 느린 이동 평균선 사이의 교차 신호를 사용하는 것입니다.

전략 원칙

이 전략의 핵심 지표는 빠르고 느린 이동 평균 라인이다. 이 전략은 빠른 속도와 느린 이동 평균 라인 사이의 교차 관계를 사용하여 가격 추세를 결정하고 이를 기반으로 거래 결정을 내린다.

특히, 빠른 이동 평균 라인 매개 변수는 24 기간으로 설정되고 느린 이동 평균 라인 매개 변수는 100 기간으로 설정됩니다. 빠른 이동 평균 라인이 아래에서 느린 이동 평균 라인 위에 넘어가면 가격이 상승 추세에 들어서고 있음을 나타냅니다. 그리고 전략은 이 시점에서 구매 신호를 발송합니다. 빠른 이동 평균 라인이 위에서 느린 이동 평균 라인 아래에 넘어가면 가격이 하락 추세에 들어서고 있음을 나타냅니다. 그리고 전략은 이 시간에 판매 신호를 발송합니다.

빠른 이동 평균선과 느린 이동 평균선의 교차 방향을 판단함으로써 가격 트렌드 변화를 효과적으로 파악하여 구매 및 판매 결정을 할 수 있습니다.

전략 의 장점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 이 원칙은 간단하고 이해하기 쉽고 구현하기 쉽습니다. 이중 이동 평균 크로스 오버는 가장 기본적인 기술 지표 중 하나이며 이해 및 적용이 쉽습니다.

  2. 조정 가능한 매개 변수, 높은 적응력. 빠른 및 느린 이동 평균의 매개 변수는 실제 조건에 따라 조정 할 수 있으며 전략을 더 유연하게합니다.

  3. 트렌드 변화를 포착 할 수있는 강력한 능력. 두 배 이동 평균 크로스오버는 종종 가격이 통합에서 트렌드로 이동 할 때 전환점을 포착하는 데 사용됩니다.

  4. 통합을 효과적으로 필터링하고 유효하지 않은 거래를 줄일 수 있습니다. 복제 이동 평균을 사용하여 통합 범위를 식별하고 통합 중 반복적인 포지션 개척을 피할 수 있습니다.

전략 의 위험

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

  1. 이중 이동 평균의 크로스오버 신호는 지연될 수 있다. 트렌드 추적 지표로서, 이중 이동 평균의 크로스오버 신호는 종종 일정 기간에 지연할 수 있으며, 이는 특정 수준의 기회 비용을 초래할 수 있다.

  2. 오스실레이션 시장에서 잘못된 신호를 생성하는 것이 쉽습니다. 두 배 이동 평균은 가격이 명확한 추세를 보이는 경우 가장 잘 작동합니다. 그러나 오스실레이션 시장에서는 종종 잘못된 신호를 생성하는 경향이 있습니다.

  3. 잘못된 매개 변수 설정은 전략 성능에 영향을 줄 수 있습니다. 빠르고 느린 이동 평균 매개 변수가 잘못 설정되면 트렌드 크로스오버를 캡처하는 민감성에 영향을 줄 것입니다.

대응 솔루션:

  1. 크로스오버 신호의 감수성을 높이기 위해 이동 평균 기간을 적절히 단축합니다.

  2. 변동 시장에서 유효하지 않은 거래를 줄이기 위해 필터링을 위해 변동성 또는 볼륨 지표를 추가합니다.

  3. 가장 좋은 매개 변수 조합을 찾기 위한 매개 변수 최적화. 자동 최적화를 위한 기계 학습 및 다른 방법을 추가합니다.

전략 최적화의 방향

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

  1. 더 고급한 이동 평균 기술 지표, 예를 들어 선형 가중 이동 평균을 사용하여 간단한 이동 평균을 대체하여 지표의 추적 및 예측 능력을 향상시킵니다.

  2. 유효하지 않은 신호를 줄이기 위해 공동 필터링을 위한 볼륨 및 변동성 지표와 같은 더 많은 보조 지표를 추가합니다.

  3. 매개 변수 적응성을 향상시키기 위해 빠르고 느린 이동 평균 매개 변수를 최적화합니다. 기계 학습 및 무작위 최적화와 같은 방법은 최적 매개 변수를 찾기 위해 사용할 수 있습니다.

  4. 전략이 시장에 진출 한 후, 단 한 번의 손실을 제어하기 위해 스톱 로스 포인트와 트레일링 스톱 로스를 설계 할 수 있습니다. 동시에 충분한 이익을 보장하기 위해 수익 최적화 기술을 추가하십시오.

  5. 딥러닝과 같은 새로운 기술은 더 복잡한 가격 패턴을 식별하여 더 나은 결과를 얻기 위해 구매 및 판매 결정을 내리는 이동 평균 크로스오버를 돕기 위해 사용될 수 있습니다.

요약

일반적으로, 이 전략은 비교적 고전적이고 간단하다. 이중 이동 평균 지표에 기초하여 가격 동향을 결정하여 가격이 통합에서 추세로 이동할 때 기회를 발견한다. 장점은 트렌딩 시장을 추적하는 데 적합한 명확한 논리와 단순함이다. 그러나 전략의 안정성과 효율성을 높이기 위해 매개 변수 조정 및 최적화를 통해 개선해야 하는 신호 지연과 같은 몇 가지 단점도 있다. 전반적으로, 기본 전략으로서, 이것은 매우 적합하지만 더 복잡한 시장 환경에 적응하기 위해 지속적인 최적화가 필요하다.


/*backtest
start: 2024-01-21 00:00:00
end: 2024-02-20 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Pine Script Tutorial Example Strategy 1', overlay=true, initial_capital=100000, default_qty_value=100, default_qty_type=strategy.percent_of_equity)

//OBV
src = close
obv = ta.cum(math.sign(ta.change(src)) * volume)
ma(source, length, type) =>
    switch type
        "SMA" => ta.sma(source, length)
        "EMA" => ta.ema(source, length)
        "SMMA (RMA)" => ta.rma(source, length)
        "WMA" => ta.wma(source, length)
        "VWMA" => ta.vwma(source, length)
typeMA = input.string(title = "Method", defval = "SMA", options=["SMA", "EMA", "SMMA (RMA)", "WMA", "VWMA"], group="Smoothing")
smoothingLength = input.int(title = "Length", defval = 20, minval = 1, maxval = 100, group="Smoothing")
Limit = input.float(title = "Limit", defval = 1, minval = 0.1, maxval = 10, group="Smoothing")
smoothingLine_ma = ma(obv,smoothingLength, typeMA)
obv_diff = (obv-smoothingLine_ma)*100/obv

//PVT
var cumVolp = 0.
cumVolp += nz(volume)
if barstate.islast and cumVolp == 0
    runtime.error("No volume is provided by the data vendor.")
srcp = close
vt = ta.cum(ta.change(srcp)/srcp[1]*volume)
smoothingLine_map = ma(vt,smoothingLength, typeMA)
pvt_diff = (vt-smoothingLine_map)*100/vt

// plot(obv_diff+close+100 ,title="OBV_DIFF", color = color.rgb(255, 118, 54))
// plot(pvt_diff+close+80 ,title="PVT_DIFF", color = color.rgb(223, 61, 255))

indicator = (pvt_diff+obv_diff)/2
goLongCondition1 = ta.crossover(indicator,Limit)
timePeriod = time >= timestamp(syminfo.timezone, 2023,1, 1, 0, 0)  // Backtesting Time
notInTrade = strategy.position_size <= 0
if goLongCondition1 and timePeriod and notInTrade
    stopLoss = low * 0.99 // -2%
    takeProfit = high * 1.05 // +5%
    strategy.entry('long', strategy.long )
    strategy.exit('exit', 'long', stop=stopLoss, limit=takeProfit)






// fastEMA = ta.ema(close, 24)
// slowEMA = ta.ema(close, 100)
// goLongCondition1 = ta.crossover(fastEMA, slowEMA)
// timePeriod = time >= timestamp(syminfo.timezone, 2018, 12, 15, 0, 0)
// notInTrade = strategy.position_size <= 0
// if goLongCondition1 and timePeriod and notInTrade
//     stopLoss = low * 0.97
//     takeProfit = high * 1.12
//     strategy.entry('long', strategy.long)
//     strategy.exit('exit', 'long', stop=stopLoss, limit=takeProfit)
// plot(fastEMA, color=color.new(color.blue, 0))
// plot(slowEMA, color=color.new(color.yellow, 0))

더 많은