모멘텀 상관관계 RSI 전략


생성 날짜: 2023-10-07 15:47:42 마지막으로 수정됨: 2023-10-07 15:47:42
복사: 0 클릭수: 751
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

개요

이 전략의 핵심 아이디어는 RSI 지표의 평형 주기를 동적으로 만들고, 가격과 동력의 상관관계에 따라 자동으로 조정하여 RSI 지표의 실용성을 개선하는 것입니다.

전략 원칙

이 전략은 우선 가격의 동력을 계산하고, 다음에는 가격과 동력 사이의 상관관계 계수를 계산한다. 상관관계 계수가 1에 가까워지면 가격과 동력이 매우 긍정적으로 연관되어 있음을 나타냅니다. 상관관계 계수가 1에 가까워지면 가격과 동력이 매우 부정적으로 연관되어 있음을 나타냅니다.

가격과 동력의 상관관계에 따라 RSI 지표의 평형 주기 길이를 조정할 수 있다. 상관관계가 높을 때 짧은 RSI 주기를 사용한다. 상관관계가 낮을 때 긴 RSI 주기를 사용한다.

구체적으로, 이 전략은 RSI 주기의 길이를 20-50의 범위로 설정합니다. 가격과 동력의 관련 계수를 계산한 후, 선형적 지도 방법을 통해 관련 계수를 20-50의 범위로 RSI의 최종 평형 주기의 길이가됩니다.

이렇게하면 시장 상황에 따라 RSI 지표의 파라미터를 자동으로 조정할 수 있으며, 가격 변화와 동력 변화가 강하게 연관되어 있을 때 더 짧은 RSI를 사용하여 더 민감하게 반응할 수 있으며, 연관성이 약한 경우 더 긴 RSI를 사용하여 신호에 대한 소음 영향을 줄일 수 있습니다.

우위 분석

  • 동적 조정 매개 변수, 시장 변화에 적응
  • 고정 주기 지표의 제한을 피하십시오.
  • 윤활주기 자동 최적화, 수동으로 최적의 매개 변수를 선택하지 않는다
  • 다양한 품종에 맞는 구성 가능한 RSI 주기의 범위

위험 분석

  • 관련성 계산 자체는 지연을 도입하여 가격 전환점을 놓칠 수 있습니다.
  • 가격과 동력의 상관관계가 너무 단편적이어서 다른 요소들은 무시됩니다.
  • 기본 RSI 주기 범위는 모든 품종에 적합하지 않을 수 있으며 최적화가 필요합니다.
  • RSI 주기를 조정하기 위해 변동율과 같은 다른 요소와 함께 고려할 수 있습니다.

최적화 방향

  • 다른 Related 계산 방법을 시도하여 래그를 줄이십시오.
  • 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")