동적 모멘텀 RSI 전략

저자:차오장, 날짜: 2023-10-07 15:47:42
태그:

전반적인 설명

이 전략의 핵심 아이디어는 RSI 지표의 평형 기간을 동적으로 만들어 가격과 동력 사이의 상관관계에 따라 자동으로 조정하여 RSI 지표의 유용성을 향상시키는 것입니다.

전략 논리

이 전략은 먼저 가격의 동력을 계산하고, 그 다음 가격과 동력 사이의 상관 계수를 계산합니다. 상관 계수가 1에 가까워지면 가격과 동력이 매우 긍정적으로 상관된다는 것을 의미합니다. 상관 계수가 -1에 가까워지면 가격과 동력이 매우 부정적으로 상관된다는 것을 의미합니다.

가격과 동력 사이의 상관관계에 따라 RSI 지표의 평형 기간을 조정할 수 있습니다. 상관관계가 높을 때 더 짧은 RSI 기간을 사용합니다. 상관관계가 낮을 때 더 긴 RSI 기간을 사용합니다.

구체적으로, 이 전략은 RSI 기간 범위를 기본적으로 20-50로 설정합니다. 가격과 추진력 사이의 상관 계수를 계산한 후 선형 지도를 사용하여 상관 계수를 최종 RSI 평형 기간으로 20-50 범위에 매핑합니다.

이는 RSI 매개 변수를 시장 조건에 따라 자동으로 조정할 수 있게 한다. 가격 변화와 동력 변화가 밀접하게 상관관계가 있을 때, 짧은 기간 RSI가 더 민감하게 작용하기 위해 사용된다. 상관관계가 약할 때, 더 긴 기간 RSI가 신호에 미치는 잡음의 영향을 줄이기 위해 사용된다.

이점 분석

  • 동적 매개 변수 조정 시장 변화에 적응
  • 고정 기간 지표의 제한을 피합니다.
  • 평형 시기는 자동으로 최적화됩니다, 수동으로 최선의 매개 변수를 선택 할 필요가 없습니다
  • 다른 제품들에 대한 구성 가능한 RSI 기간 범위 작업

위험 분석

  • 상관성 계산 자체는 지연을 도입, 가격 전환점을 놓칠 수 있습니다
  • 가격 동력 상관관계만 고려하는 것은 너무 단순화되어 다른 요인을 무시합니다.
  • 기본 RSI 기간 범위는 모든 제품에 적합하지 않을 수 있습니다, 최적화 필요
  • 변동성 같은 다른 요소를 포함 고려 하 여 RSI 기간을 조정

최적화 방향

  • 레이그를 줄이기 위해 다른 상관 계산 방법을 시도
  • RSI 기간을 결정하기 위해 상관관계뿐만 아니라 더 많은 요인을 고려하십시오.
  • 최적의 기본 RSI 기간 범위를 찾기 위해 다른 제품에 대한 백테스트
  • 순수 선형 매핑 대신 상관 요소 가중을 설정할 수 있습니다.
  • 특정 시장 환경에서 적당한 RSI 기간을 피하기 위해 필터를 추가합니다.

요약

역동적으로 RSI 평형 기간을 조정하는 아이디어는 배울 가치가 있지만 구체적인 구현에는 개선할 여지가 있습니다. 핵심은 RSI 매개 변수 선택에 영향을 미치는 결정적인 요소를 식별하고 수치화 가능한 지표로 변환하는 것입니다. 또한, 모델에만 의존하지 말고 매개 변수 범위의 경험적 최적화가 필요합니다. 전반적으로 이것은 추가 최적화 및 개선 후 실용적인 잠재력을 가진 매우 혁신적인 아이디어입니다.


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")



더 많은