리소스 로딩... 로딩...

RSI 트렌드 역전 전략

저자:차오장, 날짜: 2024-04-28 13:33:19
태그:RSIATR

img

전반적인 설명

트렌드 역전 전략 (RSI Trend Reversal Strategy) 은 상대 강도 지수 (RSI) 와 평균 참 범위 (ATR) 를 기반으로 한 양적 거래 전략이다. 빠른 시장 변동에 적응하고 트렌드 역전 기회를 포착하기 위해 수익을 취하고 손실을 중지 (TP/SL) 하는 수준을 동적으로 조정한다. 전략은 변동성을 측정하기 위해 ATR과 결합하여 RSI 주위를 중심으로 두 가지 적응 역동 밴드를 구축하고 있다. 이 전략은 독립적으로 또는 다른 전략에 대한 수익을 취하고 손실을 중지하는 모듈로 사용될 수 있다. 테슬라 (TSLA), 애플 (AAPL), 그리고 엔비디아 (NDAV) 등의 주식의 15분 데이터에서 잘 테스트되었다.

전략 원칙

RSI 트렌드 역전 전략의 핵심은 동적인 TP/SL 대역의 구축에 있다. 먼저, 사용자 지정 최고_자례 및 최저_자례 함수를 사용하여 마지막 크로스오버 이후 최고 및 최저 가격을 찾아 대역의 기초를 형성한다. 그 다음, 사용자가 지정한 길이로 RSI와 ATR을 계산하고 다음과 같은 계산을 수행한다.

  1. 하위 범주 = 가장 높은 가격 × [1 - (ATR/ 가격 + 1/(RSI 하위 범주 × 인플리커))]
  2. 상단역 = 최저 가격 × [1 + (ATR/Price + 1/(RSI 상단역 × 곱자))]

여기서, 곱셈은 사용자 정의 대역 확장 요인이다. 가격이 상단 범위를 넘으면 길게 갈 것이고, 하단 범위를 넘으면 짧게 갈 것이다. 이 두 대역의 색상 또한 대역에 대한 가격의 위치에 따라 변화하여 쉽게 관찰할 수 있다.

전략적 장점

  1. 높은 적응력: TP/SL 대역은 가격 변동에 따라 자동으로 조정하여 시장 변화에 신속하게 대응할 수 있습니다.
  2. 조정 가능한 매개 변수: 길이와 곱셈자와 같은 매개 변수를 조정함으로써 전략의 감수성을 유연하게 제어 할 수 있습니다.
  3. 명확한 논리: 코드 구조는 합리적이고 이해하기 쉽고 더 발전합니다.
  4. 광범위한 적용 가능성: 전략으로 독립적으로 사용하거나 다른 전략에 TP/SL 기능을 추가할 수 있습니다.
  5. 계산 효율성: highest_custom와 같은 사용자 정의 함수를 사용하여 일련 유형을 사용함으로써 발생하는 대규모 반복 계산을 피합니다.

전략 위험

  1. 부적절한 매개 변수 선택은 추가 위험을 초래할 수 있습니다. 예를 들어, 작은 길이는 빈번한 거래로 이어질 수 있으며, 큰 멀티플리커는 너무 느슨한 스톱 손실로 이어질 수 있습니다.
  2. 특정 시장 조건, 즉 불안정한 시장에서 빈번한 통합 및 거짓 파기 등에서 성과가 좋지 않을 수 있으며 이로 인해 더 많은 거래 손실이 발생할 수 있습니다.
  3. 전략 자체는 트렌드 판단 기능이 없으며 다른 신호와 함께 사용해야합니다.

전략 최적화 방향

  1. 이동 평균과 같은 트렌드 지표를 추가하여 주요 트렌드 방향의 반전 지점에서만 거래하는 것을 고려하십시오.
  2. 가장 좋은 길이, 곱하기 등 조합을 찾기 위해 매개 변수를 최적화합니다.
  3. 다른 기술 지표 또는 시장 정서 지표와 결합하여 입점 및 출점 지점의 정확성을 향상시킵니다.
  4. 각 거래의 위험 노출을 엄격하게 통제하기 위해 포지션 관리를 추가합니다.

요약

RSI 트렌드 역전 전략은 TP/SL 포인트를 동적으로 조정하고 시장 변화에 신속히 대응할 수 있는 적응형 대역을 구축하기 위해 RSI와 ATR을 활용한다. 전략은 명확한 논리, 광범위한 적용 가능성, 그리고 양적 거래자에게 강력한 도구가 될 수 있다. 그러나 실제 사용에서는 여전히 매개 변수 선택과 위험 통제에 주의를 기울여야 하며, 전반적인 성능을 향상시키기 위해 다른 지표 신호와 결합하여 사용하는 것이 좋습니다. 전략은 트렌드 필터와 매개 변수 최적화와 같은 최적화를 위한 추가 공간을 갖추고 있다. 전반적으로, RSI 트렌드 역전 전략은 양적 거래에 간단하면서도 효과적인 접근 방식을 제공한다.


/*backtest
start: 2023-04-22 00:00:00
end: 2024-04-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("RSI Trend Reversal", overlay=true, max_bars_back = 4999, calc_on_every_tick = false)


//INPUTS 
rsi_length = input.int(title = "Lenght", defval = 8)
rsi_mult = input.float(title = "Multiplier", defval = 1.5, step = .05)
lookback = input.int(title = "Delay to prevent idealization", defval = 1)
sltp = input.float(title = "Minimum Difference", defval = 10)
src = input.source(title = "Source Input", defval = close)

//PARAMETERS INITILIZATION
hclose = request.security(ticker.heikinashi(syminfo.tickerid), timeframe.period, src)
//FUNCTION INITILIZATION
highest_custom(src, length) =>
    x = src
    for i = 0 to length
        if src[i] > x
            x := src[i]
    x
lowest_custom(src, length) => 
    x = src
    for i = 0 to length
        if src[i] < x
            x := src[i]
    x
rsilev(src, length, mult, sltp) =>
    sl = (100 - sltp) / 100
    tp = (100 + sltp) / 100
    var bool crossup = na
    var bool crossdown = na
    var float dir = na
    dir_change = ta.change(dir)
    var float BearGuy = 0
    BullGuy = ta.barssince(crossup or crossdown)
    if na(BullGuy)
        BearGuy += 1
    else
        BearGuy := BullGuy
    var float upper = na
    var float lower = na
    rsilower = ta.rsi(src, length)
    rsiupper = math.abs(ta.rsi(src, length) - 100)
    atr = ta.atr(length) / src
    lower := highest_custom(math.max(highest_custom(highest_custom(src, BearGuy) * (1 - (atr + ((1 / (rsilower) * mult)))), BearGuy), src * sl), BearGuy)
    upper := lowest_custom(math.min(lowest_custom(lowest_custom(src, BearGuy) * (1 + (atr + ((1 / (rsiupper) * mult)))), BearGuy), src * tp), BearGuy)
    var float thresh = na
    if na(thresh)
        thresh := lower
    if na(dir)
        dir := 1
    if crossdown
        dir := -1
    if crossup
        dir := 1
    if dir == 1
        thresh := lower
    if dir == -1
        thresh := upper
    crossup := ta.crossover(src, thresh)
    crossdown := ta.crossunder(src, thresh)
    thresh

rsiclose = rsilev(hclose, rsi_length, rsi_mult, sltp)

//PLOTTING
var color col = color.lime
if hclose > rsiclose
    col := color.lime
if hclose < rsiclose
    col := color.red
plot(rsiclose, linewidth = 2, color = col)

//STRATEGY
buy = ta.crossover(hclose, rsiclose)
sell = ta.crossunder(hclose, rsiclose)

if buy[lookback]
    strategy.entry("long", strategy.long)
if sell[lookback]
    strategy.entry("Short", strategy.short)

관련

더 많은