이중 역전 동력 인덱스 거래 전략

저자:차오장, 날짜: 2023-12-25 12:02:57
태그:

img

전반적인 설명

이 전략은 거래를 위한 이중 역전 모멘텀 인덱스 지표에 기반을 두고 있다. 최고 가격, 최저 가격, 폐쇄 가격을 사용하여 일정 기간 동안 역전 모멘텀 인덱스를 계산하고, 인덱스가 과잉 구매 구역에서 아래로 또는 과잉 판매 구역에서 위로 역전될 때 거래 신호를 생성한다. 또한 브레이크아웃 스톱 로스 메커니즘을 설정한다.

전략 논리

이 전략의 핵심 지표는 스토카스틱 모멘텀 인덱스 (SMI) 이다. SMI의 계산 공식은:

$$SMI = \frac{Close-(HH+LL)/2}{AVGDIFF/2}*100$$

HH는 지난 N일 동안의 가장 높은 가격, LL는 지난 N일 동안의 가장 낮은 가격, N는 매개 변수 a에 의해 결정됩니다. AVGDIFF는 HH-LL의 M일 이동 평균, M는 매개 변수 b에 의해 결정됩니다.

SMI는 가격의 반전 특성을 나타냅니다. 주식 가격이 지난 N 일 동안 가장 높은 지점에 접근 할 때, SMI는 100에 가깝습니다. 주식의 과잉 구매를 나타냅니다. 지난 N 일 동안 가장 낮은 지점에 접근 할 때, SMI는 -100에 가깝습니다. 과잉 판매를 나타냅니다. SMI가 100 수준에서 아래로 반전되거나 -100 수준에서 위로 반전되면 구매 / 판매 신호가 생성됩니다.

이 전략은 SMI의 M-day 이동 평균 SMA를 거래 신호 라인으로 사용합니다. SMI가 과잉 구매 구역에서 아래로 뒤집어지고 SMA 아래로 넘어갈 때 구매 신호가 생성됩니다. SMI가 과잉 판매 구역에서 위로 뒤집어지고 SMA 위를 넘어갈 때 판매 신호가 생성됩니다.

또한, 전략은 촛불 몸의 브레이크오웃을 스톱 로스로 판단합니다.

이점 분석

이 전략의 장점은 다음과 같습니다.

  1. 가격 반전 원리를 활용하여 반전 지점에서 거래 신호를 생성하고 반전 기회를 포착할 수 있습니다.

  2. SMI는 가장 높은 가격, 가장 낮은 가격 및 폐쇄 가격을 결합하여 과잉 구매 및 과잉 판매 조건을 판단하여 더 신뢰할 수있는 신호를 만듭니다.

  3. 촛불 몸집 브레이크오프 스톱 로스로 적시에 포지션을 종료하고 위험을 효과적으로 제어할 수 있습니다.

  4. 전략은 몇 가지 매개 변수를 가지고 있으며 구현 및 최적화하기가 쉽습니다.

위험 분석

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

  1. 리버스 거래는 성공적 인 리버스의 정확한 시기를 결정하기가 어렵고 트렌드 리버스를 포착하기 전에 여러 손실을 입을 수 있습니다.

  2. 반전점의 잘못된 판단은 손실을 증폭시킬 수 있습니다.

  3. 몸의 탈출 스톱 손실은 너무 민감하고 포착될 가능성이 높을 수 있습니다.

해결책은 다음과 같습니다.

  1. SMI 매개 변수를 최적화하여 반전 거래 빈도를 조정합니다.

  2. 다른 지표를 결합하여 역행 시기를 결정합니다.

  3. 너무 민감하지 않도록 몸 크기를 조절해

최적화

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

  1. SMI의 매개 변수 (a) 와 (b) 를 최적화하여 반전 포착의 감도를 조정합니다.

  2. 주요 트렌드 방향, 예를 들어 이동 평균, 변동성 지표 등을 놓치지 않도록 판단을 위해 다른 지표를 추가합니다.

  3. 너무 민감하거나 무감각하지 않도록 더 많은 스톱 손실 방법을 추가하십시오. 예를 들어 후속 스톱 손실, 곡선 스톱 손실 등.

  4. 역전 성공 가능성을 판단하기 위해 기계 학습 모델을 포함하고 실패한 역전 거래를 피합니다.

결론

결론적으로, 이것은 반전 모멘텀 인덱스 (SMI) 를 기반으로 한 이중 방향 거래 전략이다. 이점은 가격 반전을 활용하고 반전 지점에서 신호를 생성함으로써 더 많은 단기 거래 기회를 포착하는 데 있다. 그러나 반전 거래의 전형적인 위험도 있다. 패러미터 조정 및 스톱 로스 최적화가 증폭 손실을 방지하는 데 필요합니다. 전반적으로, 이 전략은 반전 거래에 관심있는 투자자에게 적합하지만 위험을 제어하기 위해 다른 지표와 엄격한 스톱 로스를 포함해야합니다.


/*backtest
start: 2023-11-01 00:00:00
end: 2023-11-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.0", shorttitle = "Stochastic str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
a = input(5, "Percent K Length")
b = input(3, "Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = SMIsignal < -1 * limit and close < open
dn = SMIsignal > limit and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot)

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", strategy.short, needshort == false ? 0 : lot)
    
if  exit
    strategy.close_all()

더 많은