이중 이동 평균 교차 정량적 전략 기반


생성 날짜: 2024-03-08 14:18:21 마지막으로 수정됨: 2024-03-08 14:18:21
복사: 1 클릭수: 622
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이중 이동 평균 교차 정량적 전략 기반

개요 (Overview)

이 전략은 2개의 지수 이동 평균 ((EMA) 의 교차 신호를 기반으로 거래한다. 단기 EMA 상에서 장기 EMA를 통과할 때, 더 많은 포지션을 열고, 단기 EMA 아래에서 장기 EMA를 통과할 때, 평소 포지션을 한다. 이 전략은 또한 위험을 제어하고 전략의 성과를 최적화하기 위해 스톱 손실 메커니즘과 거래 시간 필터를 도입한다.

전략 원칙 (Strategy Principles)

이 전략은 두 개의 다른 주기의 EMA를 트렌드 판단 기준으로 사용한다. EMA는 간단한 이동 평균 (SMA) 과 비교하여 가격 변화에 더 빨리 반응할 수 있으며, 무게 분배가 더 합리적이다. 단기 EMA 상에서 장기 EMA를 통과하면 가격이 상승 추세를 형성할 수 있음을 의미하며, 이때 더 많은 포지션을 열고, 반대로 단기 EMA 아래에서 장기 EMA를 통과하면 상승 추세가 종료될 수 있음을 의미하며, 이때 포지션을 평정한다.

평행선 교차 신호 외에도 이 전략은 손실 메커니즘을 도입한다. 한편으로는, 고정 비율의 손실을 설정한다. 즉, 가격이 상대적으로 포지션 개시 가격이 특정 퍼센트 이상 떨어지면, 손실을 제어하기 위해 필리 포지션을 강제한다. 다른 한편으로는, 가격 종료 가격이 이전 K 선 종료 가격보다 낮으면 평행 포지션을 선택할 수도 있다.

또한, 이 정책은 거래 시간 필터를 도입했다. 사용자는 거래의 시작과 종료 시간을 스스로 설정하여 특정 시간 (예: 휴일, 거래하지 않는 시간 등) 에 거래하는 것을 피할 수 있다.

장점 분석 (Advantage Analysis)

  1. 간단하고 사용하기 쉬운: 전략의 논리는 명확하고, 거래 신호로 두 개의 EMA만 사용하여 이해하기 쉽고 구현하기 쉽습니다.

  2. 트렌드 추적: EMA는 가격 변화에 빠르게 반응하여 트렌드 형성 및 종료에 대한 전략을 잡을 수 있습니다.

  3. 리스크 제어: 고정된 비율의 중지 손실과 이전 K 라인 종료 가격에 기반한 중지 손실을 도입하여 단일 거래 손실과 철수를 효과적으로 제어 할 수 있습니다.

  4. 변수 유연성: 사용자는 자신의 필요에 따라 EMA 주기, 중지 비율, 이전 K 라인 종료 가격 중지, 거래 시간 기간을 사용했는지 여부와 같은 변수를 조정하여 전략 성능을 최적화 할 수 있습니다.

리스크 분석

  1. 매개 변수 최적화 위험: 이 전략의 성능은 EMA 주기, 상쇄율 등의 매개 변수의 선택에 의존하며, 부적절한 매개 변수는 전략의 저성능으로 이어질 수 있다. 따라서, 역사 데이터에 매개 변수 최적화 및 역검사가 이루어져 최적의 매개 변수를 선택해야 한다.

  2. 시장 위험: 이 전략은 주로 트렌딩 시장에 적용되며, 불안한 시장이나 트렌드 역전시 자주 거래하면 큰 회수로 이어질 수 있다. 따라서 시장 상황에 따라 전략 매개 변수를 조정하거나 이 전략을 사용하지 않도록 해야 한다.

  3. 비용 위험: 이 전략은 더 많은 거래 수를 생성하여 거래 비용을 증가시킬 수 있습니다. 따라서 적절한 거래 스펙트럼과 거래량을 선택하고 거래 당 비용을 잘 제어해야합니다.

최적화 방향 (Optimization Direction)

  1. 더 많은 기술 지표를 도입: EMA 교차 신호를 기반으로 RSI, MACD 등 다른 기술 지표를 도입하여 다중 요소 거래 신호를 형성하여 추세를 판단하는 정확성을 향상시킵니다.

  2. 동적 중지: 시장의 변동률, ATR 등 지표에 따라 동적으로 중지 위치를 조정하여 위험을 제어하면서 중단으로 인한 수익 손실을 최대한 줄여줍니다.

  3. 포지션 관리: 시장 경향의 강도, 가격과 평균선 편차 정도 등에 따라 포지션 크기를 동적으로 조정하고, 추세가 강할 때 포지션을 늘리고, 추세가 약하거나 불명확할 때 포지션을 줄인다.

  4. 기계 학습 최적화: 기계 학습 알고리즘을 사용하여 전략 매개 변수를 최적화하여 최적의 매개 변수 조합을 자동으로 선택하여 전략 수익률을 높이고 과 적합의 위험을 줄입니다.

[결과]

이 이중 평행 교차량화 전략은 두 개의 EMA의 교차 신호를 통해 트렌드를 판단하고, 동시에 스톱 패스 메커니즘과 거래 시간 필터를 도입하여, 트렌드 추적 능력과 위험 제어 사이의 좋은 균형을 이룬다. 이 전략의 논리는 단순하지만, 합리적인 변수 최적화와 위험 제어로 인해, 트렌디 시장에서 안정적인 수익을 얻을 수 있다.

전략 소스 코드
/*backtest
start: 2023-03-02 00:00:00
end: 2024-03-07 00:00:00
period: 1d
basePeriod: 1h
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/
// © ZenAndTheArtOfTrading / www.PineScriptMastery.com
// @version=5
strategy("EMA strategy", 
     overlay=true, 
     initial_capital=50000,
     default_qty_type=strategy.percent_of_equity, 
     default_qty_value=100, // 100% of balance invested on each trade
     commission_type=strategy.commission.cash_per_contract, 
     commission_value=0.005) // Interactive Brokers rate

// Get user input
i_ma1           = input.int(title="MA 1 Length", defval=200, step=10, group="Strategy Parameters", tooltip="Long-term MA")
i_ma2           = input.int(title="MA 2 Length", defval=10, step=10, group="Strategy Parameters", tooltip="Short-term MA")
i_stopPercent   = input.float(title="Stop Loss Percent", defval=0.10, step=0.1, group="Strategy Parameters", tooltip="Failsafe Stop Loss Percent Decline")
i_lowerClose    = input.bool(title="Exit On Lower Close", defval=false, group="Strategy Parameters", tooltip="Wait for a lower-close before exiting above MA2")
i_startTime     = input(title="Start Filter", defval=timestamp("01 Jan 1995 13:30 +0000"), group="Time Filter", tooltip="Start date & time to begin searching for setups")
i_endTime       = input(title="End Filter", defval=timestamp("1 Jan 2099 19:30 +0000"), group="Time Filter", tooltip="End date & time to stop searching for setups")

// Get indicator values
ma1 = ta.ema(close, i_ma1)
ma2 = ta.ema(close, i_ma2)

// Check filter(s)
f_dateFilter = true

// Check buy/sell conditions
var float buyPrice = 0
buyCondition    = close > ma1 and strategy.position_size == 0 and f_dateFilter
sellCondition   = close < ma2 and strategy.position_size > 0 //and (not i_lowerClose or close < low[1])
stopDistance    = strategy.position_size > 0 ? ((buyPrice - close) / close) : na
stopPrice       = strategy.position_size > 0 ? buyPrice - (buyPrice * i_stopPercent) : na
stopCondition   = strategy.position_size > 0 and stopDistance > i_stopPercent

// Enter positions
if buyCondition
    strategy.entry(id="Long", direction=strategy.long)

if buyCondition[1]
    buyPrice := open

// Exit positions
if sellCondition or stopCondition
    strategy.close(id="Long", comment="Exit" + (stopCondition ? "SL=true" : ""))
    buyPrice := na

// Draw pretty colors
plot(buyPrice, color=color.lime, style=plot.style_linebr)
plot(stopPrice, color=color.red, style=plot.style_linebr, offset=-1)
plot(ma1, color=color.blue)
plot(ma2, color=color.orange)