EMA의 크로스 양적 전략

저자:차오장, 날짜: 2024-03-08 14:18:21
태그:

img

전반적인 설명

이 전략은 거래를 위해 두 개의 기하급수적인 이동 평균 (EMA) 의 교차 신호를 기반으로합니다. 단기 EMA가 장기 EMA를 넘을 때 긴 지위를 열고 단기 EMA가 장기 EMA를 넘을 때 지점을 닫습니다. 이 전략은 또한 위험을 제어하고 전략 성과를 최적화하기 위해 스톱 로스 메커니즘과 거래 시간 필터를 도입합니다.

전략 원칙

이 전략은 트렌드 판단의 기초로 서로 다른 기간을 가진 두 개의 EMA를 사용합니다. 간단한 이동 평균 (SMA) 에 비해 EMA는 가격 변화에 더 빠르게 반응하고 더 합리적인 무게 분포를 가질 수 있습니다. 단기 EMA가 장기 EMA를 넘을 때 가격이 상승 추세를 형성하고 긴 포지션을 열 수 있음을 나타냅니다. 반대로 단기 EMA가 장기 EMA를 넘을 때 상승 추세가 끝날 수 있음을 나타냅니다. 그리고 포지션은 닫습니다.

이동 평균 크로스 신호 외에도 전략은 스톱 로스 메커니즘을 도입합니다. 한편으로는 고정 비율의 스톱 로스가 설정되어 있습니다. 즉, 가격이 개시 가격에 비해 특정 비율 이상 떨어지면 손실을 제어하기 위해 포지션은 강제로 닫습니다. 다른 한편으로는 종료 가격이 이전 촛불의 종료 가격보다 낮을 때 포지션을 닫을 수도 있습니다. 이 두 가지 스톱 로스 방법은 전략 인출을 효과적으로 제어 할 수 있습니다.

또한, 전략은 거래 시간 필터를 도입합니다. 사용자는 허용 거래의 시작 및 종료 시간을 스스로 설정할 수 있으며, 따라서 특정 시간 동안 거래를 피할 수 있습니다.

이점 분석

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

  2. 트렌드 추적: EMA는 가격 변화에 신속하게 대응할 수 있으며, 전략이 트렌드 형성과 종료 시기를 파악하여 트렌드 추적 수익을 얻을 수 있습니다.

  3. 리스크 통제: 고정 비율의 스톱 로스 및 이전 촛불의 종료 가격에 기반한 스톱 로스를 도입하면 단일 거래 손실과 마감을 효과적으로 제어 할 수 있습니다.

  4. 유연한 매개 변수: 사용자는 자신의 필요에 따라 EMA 기간, 스톱-러스 비율, 이전 촛불의 종료 가격을 스톱-러스, 거래 시간 기간 등으로 조정할 수 있으며, 따라서 전략 성능을 최적화 할 수 있습니다.

위험 분석

  1. 매개 변수 최적화 위험: 전략의 성능은 EMA 기간 및 스톱-러스 비율과 같은 매개 변수 선택에 달려 있으며 부적절한 매개 변수는 전략 성능이 떨어질 수 있습니다. 따라서 최적의 매개 변수를 선택하기 위해 역사적 데이터에 대한 매개 변수 최적화 및 백테스팅을 수행해야합니다.

  2. 시장 위험: 전략은 주로 트렌딩 시장에 적용됩니다. 변동성 시장 또는 트렌드 역전에서 빈번한 거래는 큰 드래운으로 이어질 수 있습니다. 따라서 시장 조건에 따라 전략 매개 변수를 조정하거나 전략을 사용하는 것을 중단해야합니다.

  3. 비용 위험: 전략은 많은 수의 거래를 생성하여 거래 비용을 증가시킬 수 있습니다. 따라서 적절한 거래 목표와 양을 선택하고 각 거래의 비용을 제어해야합니다.

최적화 방향

  1. 더 많은 기술 지표를 도입: EMA 크로스 신호를 기반으로 RSI와 MACD와 같은 다른 기술 지표를 도입하여 다인자 거래 신호를 형성하고 트렌드 판단의 정확성을 향상시킵니다.

  2. 동적 스톱 로스: 시장 변동성 및 ATR 등의 지표에 따라 동적으로 스톱 로스 포지션을 조정하며, 동시에 위험을 제어하고 가능한 한 스톱 로스로 인한 수익 손실을 최소화합니다.

  3. 포지션 관리: 시장 트렌드의 강도, 이동 평균에서 가격 오차의 정도 등에 따라 포지션 크기를 동적으로 조정하고, 트렌드가 강할 때 포지션을 증가시키고, 트렌드가 약화되거나 불분명한 경우 포지션을 감소시킵니다.

  4. 머신러닝 최적화: 머신러닝 알고리즘을 사용하여 전략 매개 변수를 최적화하고 최적의 매개 변수 조합을 자동으로 선택하여 전략 수익을 향상시키고 과잉 적합 위험을 줄입니다.

결론

이 EMA 크로스 양적 전략은 트렌드를 판단하기 위해 두 개의 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)

더 많은