이동평균선 교차를 기반으로 한 거래 전략


생성 날짜: 2024-01-24 14:59:44 마지막으로 수정됨: 2024-01-24 14:59:44
복사: 0 클릭수: 528
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

이동평균선 교차를 기반으로 한 거래 전략

개요

이동 평균 크로스 트레이딩 전략은 좀 더 흔한 양적 트레이딩 전략이다. 이 전략은 서로 다른 주기의 이동 평균을 계산하고, 그들의 교차 상황에 따라 거래 신호를 생성한다. 구체적으로, 4주기, 8주기, 그리고 20주기의 지수 이동 평균을 계산하는 것이다.

전략 원칙

이 전략의 핵심 논리는 다음과 같습니다.

  1. 4주기, 8주기, 20주기 EMA선을 계산한다.
  2. 4주기 EMA선과 8주기 EMA선의 관계를 판단한다:
    1. 4주기 EMA 라인에 8주기 EMA 라인을 통과하면, 가격 움직임이 강해진 것을 나타냅니다.
    2. 4주기 EMA가 8주기 EMA를 넘으면, 가격 움직임이 약해졌음을 나타냅니다.
  3. 20주기 EMA 선의 방향을 판단하는 것:
    1. 20주기 EMA가 올라간다면 Enter Long
    2. 만약 20주기 EMA선이 내려가면 Enter Short
  4. 4주기 EMA선과 8주기 EMA선 관계가 반전될 때, Prepare Exit。
  5. 20주기 EMA선 방향이 반전될 때, Exit Now。

이 방법을 통해, 우리는 시장의 신호를 판단하기 위해 서로 다른 주기적 평균선 사이의 교차점을 이용하고, 가장 긴 주기적 평균선의 방향을 사용하여 잘못된 신호를 필터링하여 안정적인 거래 전략을 구축합니다.

전략적 이점

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

  1. 전략적 논리는 간단하고 명확하며, 이해하기 쉽고 구현하기 쉽습니다.
  2. 이중 조건 필터를 사용하면 잘못된 신호를 줄일 수 있습니다.
  3. 20주기 EMA의 상승은 큰 트렌드를 식별하고 안정성을 강화합니다.
  4. 사용자 정의 변수, 거래 빈도 조정
  5. 다른 지표나 모델과 쉽게 결합하여 복합적인 전략을 수립한다.

전략적 위험

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

  1. 이중평등선 전략은 잘못된 신호를 발생시킬 수 있다.
  2. 고정된 주기는 시장의 변화에 적응할 수 없습니다.
  3. “대시장 진동으로 손실이 발생할 수 있다.

이 문제를 해결하기 위한 주요 해결책은 다음과 같습니다.

  1. 적당히 지분 기간을 단축하고 적당히 손실을 중지하십시오.
  2. 동적 최적화 변수, 평균선 주기를 조정한다.
  3. 다른 지표 또는 모델과 결합하여 복합 전략을 만드는 것.

전략 최적화

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

  1. 사이클 최적화: 다양한 품종에 따라 최적의 MA 사이클 조합을 결정

    1. 스톱 로즈 최적화: 합리적으로 스톱 로즈를 설정하고 단편 손실을 제어합니다.
    2. 변수 최적화: 유전 알고리즘, 마르코프 체인 등의 방법을 사용하여 변수를 동적으로 최적화
  2. 모델 융합: 더 많은 알파를 추출하기 위해 LSTM, RNN 등의 딥 러닝 모델과 통합

  3. 포트폴리오 최적화: 다른 지표와 전략 포트폴리오를 구성

요약하다

이동 평균 횡단 전략은 전체적으로 고전적이고 일반적으로 사용되는 양적 거래 전략이다. 이 전략의 논리는 간단하고 이해하기 쉽고 구현되며 안정성이 있다. 그러나 가짜 신호를 생성하고 시장 변화에 적응하지 못하는 등의 문제가 있다. 이러한 문제는 변수 최적화, 스톱 로스 최적화, 모델 통합 등의 방법으로 개선될 수 있다.

전략 소스 코드
/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//future strategy
//strategy(title = "stub", default_qty_type = strategy.fixed, default_qty_value = 1,  overlay = true, commission_type=strategy.commission.cash_per_contract,commission_value=2.05)
//stock strategy
strategy(title = "stub",   overlay = true)
//forex strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true)
//crypto strategy
//strategy(title = "stub", default_qty_type = strategy.percent_of_equity, default_qty_value = 100,  overlay = true, commission_type=strategy.commission.percent,commission_value=.0,default_qty_value=10000)


testStartYear = input(1900, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testEndYear = input(2018, "Backtest Start Year")
testEndMonth = input(12, "Backtest Start Month")
testEndDay = input(1, "Backtest Start Day")
testPeriodEnd = timestamp(testStartYear,testStartMonth,testStartDay,0,0)


testPeriod() => true

ema1 = ema(close,4)
ema2 = ema(close,8)
ema3 = ema(close,20)

go_long = ema1[0] > ema2[0] and ema3[0] > ema3[1]
exit_long = ema1[0] < ema2[0] or ema3[0] < ema3[1]

go_short = ema1[0] < ema2[0] and ema3[0] < ema3[1]
exit_short = ema1[0] > ema2[0] or ema3[0] > ema3[1]

 
if testPeriod()
    strategy.entry("simpleBuy", strategy.long, when=go_long)
    strategy.exit("simpleBuy", "simpleSell",when=exit_long)
    
    strategy.entry("simpleSell", strategy.short,when=go_short)
    strategy.exit("simpleSell", "simpleSell",when=exit_short)