확률 강화 RSI 전략

저자:차오장, 날짜: 2023-12-20 15:05:05
태그:

img

전반적인 설명

이것은 지나치게 많이 구입하고 지나치게 많이 팔린 수준을 결정하기 위해 RSI 지표를 사용하는 간단한 장기 전략입니다. 우리는 중지 손실과 수익을 추가하고 최근 수익성있는 거래 확률이 51% 이상 또는 같을 때만 강화 거래에 확률 모듈을 통합하여 전략 성능을 크게 향상 시켰습니다. 이는 잠재적 인 손실 거래를 피함으로써 전략 성능을 크게 향상 시켰습니다.

원칙

이 전략은 RSI 지표를 사용하여 시장의 과잉 구매 및 과잉 판매 조건을 판단합니다. 구체적으로, RSI가 과잉 판매 구역의 하단 한계를 넘을 때 긴 거리로 이동합니다. 그리고 RSI가 과잉 구매 구역의 상단 한계를 넘을 때 포지션을 닫습니다. 또한, 우리는 손해를 멈추고 수익 비율을 설정합니다.

핵심은 확률 판단 모듈을 통합하는 것입니다. 이 모듈은 최근 기간 동안의 긴 거래의 수익률 비율을 계산합니다. 최근 수익성 거래 확률이 51%보다 높거나 같을 경우에만 입력 할 수 있습니다. 이것은 많은 잠재적 인 손실 거래를 피합니다.

장점

확률 강화된 RSI 전략으로서 간단한 RSI 전략에 비해 다음과 같은 장점을 가지고 있습니다.

  1. 추가 스톱 로스 및 수익을 취하기 단독 거래 손실을 제어하고 수익을 잠금
  2. 통합 확률 모듈은 저 확률 시장을 피합니다.
  3. 확률 모듈은 다른 시장 환경에 맞게 조정됩니다.
  4. 길게만 작동하는 메커니즘은 이해하기 쉽고 실행하기 쉽습니다.

위험 분석

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

  1. 시장 부진으로 수익을 낼 수 없는 장기 단속
  2. 잘못된 확률 모듈 판단은 기회를 놓칠 수 있습니다.
  3. 가장 좋은 매개 변수 조합을 찾기가 어렵고 시장 환경에서 상당한 성능 차이가 있습니다.
  4. 느슨한 스톱 로스 설정, 여전히 단일 거래 손실이 발생할 수 있습니다.

해결책:

  1. 짧은 메커니즘을 추가하는 것을 고려하십시오
  2. 오류 판단률을 낮추기 위해 확률 모듈을 최적화
  3. 매개 변수를 동적으로 최적화하기 위해 기계 학습을 사용
  4. 손실을 제한하기 위해 더 보수적인 스톱 로스 레벨을 설정합니다.

개선 방향

이 전략은 아래와 같은 측면에서 더 이상 최적화 될 수 있습니다.

  1. 쌍방향 거래에 대한 짧은 모듈을 늘려
  2. 동적 매개 변수 최적화를 위해 기계 학습을 사용
  3. 과잉 매수/ 과잉 판매를 위한 다른 지표를 시도하세요.
  4. 수익률을 높이기 위해 스톱 로스/프로프트 취득을 최적화
  5. 신호를 필터링하고 확률을 향상시키는 다른 요인을 추가하십시오.

요약

이것은 통합 확률 모듈에 의해 강화 된 간단한 RSI 전략입니다. 바닐라 RSI 전략과 비교하면 손실 트레이드를 필터링하고 전체 마감 및 이익 비율을 향상시킵니다. 다음 단계는 짧은, 동적 최적화 등을 추가하여 더 견고하게 개선 할 수 있습니다.


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © thequantscience

//@version=5
strategy("Reinforced RSI",
     overlay = true,
     default_qty_type = strategy.percent_of_equity, 
     default_qty_value = 100,
     pyramiding = 1,
     currency = currency.EUR, 
     initial_capital = 1000,
     commission_type = strategy.commission.percent, 
     commission_value = 0.07)

lenght_rsi = input.int(defval = 14, minval = 1, title = "RSI lenght: ")
rsi = ta.rsi(close, length = lenght_rsi)

rsi_value_check_entry = input.int(defval = 35, minval = 1, title = "Oversold: ")
rsi_value_check_exit = input.int(defval = 75, minval = 1, title = "Overbought: ")

trigger = ta.crossunder(rsi, rsi_value_check_entry)
exit = ta.crossover(rsi, rsi_value_check_exit)

entry_condition   = trigger 
TPcondition_exit  = exit

look = input.int(defval = 30, minval = 0, maxval = 500, title = "Lookback period: ")

Probabilities(lookback) =>

    isActiveLong = false
    isActiveLong := nz(isActiveLong[1], false)
    isSellLong = false
    isSellLong := nz(isSellLong[1], false)

    int positive_results = 0
    int negative_results = 0

    float positive_percentage_probabilities = 0 
    float negative_percentage_probabilities = 0 

    LONG = not isActiveLong and entry_condition == true 
    CLOSE_LONG_TP = not isSellLong and TPcondition_exit == true

    p = ta.valuewhen(LONG, close, 0)
    p2 = ta.valuewhen(CLOSE_LONG_TP, close, 0)

    for i = 1 to lookback

	    if (LONG[i])
            isActiveLong := true
		    isSellLong := false

        if (CLOSE_LONG_TP[i])
	        isActiveLong := false
	        isSellLong := true

        if p[i] > p2[i]
            positive_results += 1
        else 
            negative_results -= 1 

	    positive_relative_probabilities = positive_results / lookback
	    negative_relative_probabilities = negative_results / lookback
	    positive_percentage_probabilities := positive_relative_probabilities * 100
	    negative_percentage_probabilities := negative_relative_probabilities * 100

    positive_percentage_probabilities
	
probabilities = Probabilities(look) 

lots = strategy.equity/close

var float e = 0 
var float c = 0 

tp = input.float(defval = 1.00, minval = 0, title = "Take profit: ")
sl = input.float(defval = 1.00, minval = 0, title = "Stop loss: ")

if trigger==true and strategy.opentrades==0 and probabilities >= 51
    e := close
    strategy.entry(id = "e", direction = strategy.long, qty = lots, limit = e) 
takeprofit = e + ((e * tp)/100)
stoploss = e - ((e * sl)/100)
if exit==true
    c := close 
    strategy.exit(id = "c", from_entry = "e", limit = c)
if takeprofit and stoploss 
    strategy.exit(id = "c", from_entry = "e", stop = stoploss, limit = takeprofit)

더 많은