HYE 평균 회전 SMA 전략

저자:차오장, 날짜: 2023-12-15 16:51:23
태그:

img

전반적인 설명

HYE Mean Reversion SMA 전략은 간단한 이동 평균과 상대 강도 지수 (RSI) 를 사용하는 평균 회전 거래 전략이다. 가격은 이동 평균에서 특정 비율로 벗어나면 구매 및 판매 신호를 생성하며, RSI 지표 필터링과 결합됩니다. 단기 거래 전략입니다.

전략 논리

이 전략은 주로 다음과 같은 규칙에 기초합니다.

  1. 2개 기간 간단한 이동 평균이 5개 기간 간단한 이동 평균보다 3% 낮아지면 가격이 평균에서 벗어난 것으로 간주되며 구매 신호가 생성됩니다.

  2. 2주기 SMA가 5주기 SMA를 넘으면 가격이 평균으로 돌아간다고 간주되고 판매 신호가 생성됩니다.

  3. 5주기 RSI의 기하급수적 이동 평균과 결합하면, 구매 신호는 RSI가 30 이하일 때만 생성되고, RSI가 70 이상일 때 판매 신호를 생성하여 불필요한 거래를 피합니다.

주요 아이디어는 단기 가격 변동을 사용하여 평균 반전 기회를 포착하는 것입니다. 가격이 특정 비율로 떨어지면 구입하고, 가격이 이동 평균에 가깝게 반전되면 판매하여 이익을 창출합니다. 한편, RSI 지표는 소란스러운 거래 신호를 필터링하기 위해 과소매 및 과소매 조건을 식별 할 수 있습니다.

이점 분석

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

  1. 낮은 모니터링 비용으로 구현하기 쉽습니다.

  2. 이동 평균에서 가격 오차를 사용하여 단기 평균 회귀 기회를 캡처합니다. 역사적으로 좋은 백테스트 성과.

  3. RSI 인디케이터는 노이즈 트레이딩을 효과적으로 필터하고 정상과 죽이는 계곡을 쫓는 것을 피할 수 있습니다.

  4. 다양한 시장 환경에 적응 할 수있는 유연한 매개 변수 조정.

  5. 단지 긴, 단 또는 두 방향의 거래를 지원합니다. 다른 선호도에 맞게.

위험 분석

또한 몇 가지 위험이 있습니다.

  1. 평균 회귀는 가격이 이동 평균으로 회귀하는 것에 의존합니다. 급격한 가격 변화가 발생하면 높은 스톱 손실 위험이 있습니다.

  2. 부적절한 매개 변수 설정은 과도한 거래 또는 놓친 기회로 이어질 수 있습니다.

  3. 성과는 시장과 밀접한 상관관계를 가지고 있습니다. 범위와 변동성 시장에서 낮은 성과입니다.

대책:

  1. 단일 트레이드 손실을 통제하기 위해 적절한 스톱 로스를 설정합니다.

  2. 매개 변수를 점진적으로 최적화하고 위험 조정 수익을 평가합니다.

  3. 주식 지수와 결합해서 적응력을 높일 수 있습니다.

최적화 방향

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

  1. 최적의 매개 변수를 찾기 위해 다른 이동 평균 조합을 테스트합니다.

  2. 다른 지표들을 포함해서 추세를 파악하고 승률을 향상시키려고 노력하세요.

  3. 최대 마감량을 줄이기 위해 스톱 로스 메커니즘을 추가합니다.

  4. 수익률을 높이기 위해 출입 및 출입 규칙을 최적화하십시오.

  5. 기계 학습 기술을 채택하여 적응적인 매개 변수를 만들 수 있습니다.

결론

HYE 평균 반전 SMA 전략은 간단하고 실용적인 단기 평균 반전 전략이다. 이동 평균에서 가격 오차를 사용하여 거래 신호를 생성하고 RSI 지표로 소음을 필터한다. 좋은 백테스트 성능을 보여주었다. 전략은 다른 시장 환경에 적응하는 조정 가능한 매개 변수로 구현하기가 쉽습니다. 그러나 환전 및 스톱 로스 위험의 불확실성은 주목되어야하며, 다른 시장 조건에 대한 적절한 최적화를 필요로합니다. 전반적으로 양적 거래에 대한 좋은 참조 평균 반전 전략 템플릿을 제공합니다.


/*backtest
start: 2022-12-08 00:00:00
end: 2023-12-14 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=4

strategy("HYE Mean Reversion SMA [Strategy]", overlay = true )
  
//Strategy inputs
source = input(title = "Source", defval = close)
tradeDirection = input(title="Trade Direction", type=input.string,
     options=["Long Only", "Short Only", "Both"], defval="Long Only") 
smallMAPeriod = input(title = "Small Moving Average", defval = 2)
bigMAPeriod = input(title = "Big Moving Average", defval = 5)
percentBelowToBuy = input(title = "Percent below to buy %", defval = 3)
percentAboveToSell = input(title = "Percent above to sell %", defval = 3)
rsiPeriod = input(title = "Rsi Period", defval = 2)
rsiLevelforBuy = input(title = "Maximum Rsi Level for Buy", defval = 30)
rsiLevelforSell = input(title = "Minimum Rsi Level for Sell", defval = 70)
     
longOK  = (tradeDirection == "Long Only") or (tradeDirection == "Both")
shortOK = (tradeDirection == "Short Only") or (tradeDirection == "Both")

// Make input options that configure backtest date range
startDate = input(title="Start Date", type=input.integer,
     defval=1, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer,
     defval=1, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer,
     defval=2020, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer,
     defval=31, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer,
     defval=12, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer,
     defval=2021, minval=1800, maxval=2100)
     
inDateRange = true

//Strategy calculation 
rsiValue = rsi(source, rsiPeriod)
rsiEMA   = ema(rsiValue, 5)
smallMA = sma(source, smallMAPeriod)
bigMA =  sma(source, bigMAPeriod) 
buyMA = ((100 - percentBelowToBuy) / 100) * sma(source, bigMAPeriod)[0]
sellMA = ((100 + percentAboveToSell) / 100) * sma(source, bigMAPeriod)[0]

if(crossunder(smallMA, buyMA) and rsiEMA < rsiLevelforBuy and inDateRange and longOK)
    strategy.entry("BUY", strategy.long) 

if(crossover(smallMA, bigMA) or not inDateRange)
    strategy.close("BUY")

if(crossover(smallMA, sellMA) and rsiEMA > rsiLevelforSell and inDateRange and shortOK)
    strategy.entry("SELL", strategy.short)

if(crossunder(smallMA, bigMA) or not inDateRange)
    strategy.close("SELL")



더 많은