RSI 전략의 백테스팅 및 최적화


생성 날짜: 2023-11-10 11:59:40 마지막으로 수정됨: 2023-11-10 11:59:40
복사: 1 클릭수: 858
avatar of ChaoZhang ChaoZhang
1
집중하다
1617
수행원

RSI 전략의 백테스팅 및 최적화

개요

이 전략은 상대적으로 강한 지수 ((RSI) 지표에 기초하여 오버 바이 오버 소드를 판단하고, RSI가 오버 바이 오버 소드 영역에 도달했을 때 반전 포지션을 구축하여 낮은 가격과 높은 가격을 달성하는 목적을 달성합니다. 전략은 간단하고 효율적이며, 시장의 단기간의 오버 바이 오버 소드 현상을 포착하여 수익을 얻습니다.

전략 원칙

이 전략은 단지 RSI 지표를 포지션 신호로 사용한다. RSI 아래의 설정된 낮은 점을 통과할 때 (설정된 20) 더 많이 하고, RSI 상의 설정된 높은 점을 통과할 때 (설정된 80) 더 많이 하지 않는다. 매 거래마다 고정된 자금 (설정된 100 달러) 을 사용한다. 어떤 상황에서도 1%의 이익을 추구한 후에 멈춘다. 손실이 3%에 달하면 멈춘다. 거래 주파수를 제어하기 위해, 전략은 또한 손실 후 거래하지 않는 24 K 라인을 일시 중지한다.

특히, 전략의 핵심 논리는 다음과 같습니다.

  1. RSI를 통해 과매매를 판단하는 방법
  2. RSI 아래 20시간 이상
  3. RSI가 80을 넘으면 공백
  4. 매번 100달러씩
  5. 정지 또는 정지 후 평점
  6. 손실이 발생하면 다음 K 라인에서 24 K 라인을 중지하고 거래하지 않습니다.

이 전략은 매우 단순하며, 매개 변수를 최적화할 여지가 거의 없습니다. RSI 지표의 수학적인 특성을 이용하여, 과매매한 지역에서 역으로 포지션을 구축하여 역으로 수익을 얻습니다.

우위 분석

이 전략의 가장 큰 장점은 간단하고 효율적이라는 것입니다.

  1. 단일 RSI를 사용하여 복잡한 기술적 분석이 필요하지 않습니다.
  2. 모든 기계 거래 시스템은 개인의 감정에 영향을 받지 않습니다.
  3. 시장의 단기적 편차를 이용한 수학적 특성을 활용하여 수익을 올리는데, 시장의 흐름을 예측할 필요가 없습니다.
  4. 자금 관리 규범, 리스크 제어 스톱 손실 장치.

또한, 전략은 수익을 잠금하고 위험을 제어하기 위해 스톱 스톱 손실 비율을 설정하고 거래 빈도를 줄이기 위해 거래 중지 메커니즘을 설정합니다. 이것은 전략이 최소의 위험에 안정적인 수익을 얻을 수있게합니다.

위험 분석

이 전략의 주요 위험은 다음과 같습니다.

  1. 트렌드 상태에서는 수익을 얻을 수 없습니다. 트렌드가 매우 강할 때 RSI는 장기간 과매매 또는 과매매 영역에있을 수 있으며, 역전 가능성이 거의 없기 때문에 이 전략은 수익을 얻기가 어려울 것입니다.

  2. 막부 설정이 너무 커지면 손실이 확대될 수 있다. 현재 막부율은 3%이며, 1-2%로 조정할 필요가 있다.

  3. 거래 빈도가 너무 높으면 수익을 올릴 수 있다. 포지션 개설 빈도를 적절히 통제해야 한다.

  4. 매번 100달러를 고정하는 것은 과도한 위험집중을 야기할 수 있으며, 자본의 비율로 최적화해야 한다.

최적화 방향

위와 같은 분석에 따르면, 이 전략은 다음과 같은 측면에서 최적화될 수 있습니다.

  1. 트렌드 판단 지표인 MA를 추가하고, 트렌드가 불분명할 때 거래를 중지한다.

  2. 정지 손해 중지 비율을 최적화하여 1-2%의 정지 손해 조정이 더 합리적입니다. 정지는 부동 정지로 설정할 수 있습니다.

  3. 포지션 개시 횟수 제한을 높여, 특정 시간 동안 1-2번만 허용한다.

  4. 고정자금 100달러를 자금의 비율로 수정합니다. 1%처럼요.

  5. RSI 주기, 오버 바이 오버 셀 지역과 같은 파라미터의 조합을 최적화한다.

  6. 포지션 통제를 늘리고, 초기 자본이 증가할 때 단편 거래 자본을 증가시키지 않는다.

위와 같은 몇 가지 최적화를 통해 거래 위험을 효과적으로 줄이고 전략의 안정성과 신뢰성을 향상시킬 수 있습니다.

요약하다

이 전략은 전반적으로 매우 간단하고 직접적이며, RSI 지표에 의해 과매매를 판단하여 단기 반전 수익을 얻습니다. 장점은 간단하고 효율적이며, 예측이 필요하지 않으며, 거래 논리는 명확하고, 재검토 및 검증하기 쉽다. 그러나 추세 상황에 대처하는 것은 어려울 수 있으며, 손실 위험이 있습니다. 추세 판단, 최적화 파라미터 설정, 포지션 제어 등의 방법을 도입하여 전략의 안정성과 수익성을 더욱 향상시킬 수 있습니다. 이 전략 아이디어는 새롭고 실제 거래 가치가 있으며, 합리적인 응용이 있으면 더 나은 효과를 얻을 수 있습니다.

전략 소스 코드
/*backtest
start: 2023-11-02 00:00:00
end: 2023-11-09 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("rsi超买超卖_回测用", overlay=false, initial_capital=50000, currency=currency.USD, default_qty_type=strategy.cash)
open_pos = input.int(50000, title = "每次开单资金(usdt)")
rsi_period = input.int(14, title = "rsi周期")
rsi_line      = input.float(20.0,      title='RSI触发线',      step=0.05)
stop_rsi_top_line = input.float(70, title = "顶部rsi止损线")
stop_rsi_bottom_line = input.float(30, title = "底部rsi止损线")
stop_loss_perc = input.float(0.03, title = "止损线")
stop_profit = input.float(0.01, title = "止盈")
loss_stop_trade_k = input.int(24, title = "亏损后x根K线不做交易")


rsiParam = ta.rsi(close, rsi_period)

var int failedTimes = 0
var bool stopTrade = false

// plot(rsiParam)

if stopTrade
    failedTimes += 1
    if failedTimes == loss_stop_trade_k
        failedTimes := 0
        stopTrade := false



// 获取当前持仓方向
checkCurrentPosition() =>
    strategy.position_size > 0 ? 1 : strategy.position_size < 0 ? -1 : 0

curPosition = checkCurrentPosition()

// 当前持仓成本价
position_avg_price = strategy.position_avg_price


// 当前持单, 触达反向的rsi线,清仓
if curPosition > 0 and rsiParam >= stop_rsi_top_line
    strategy.close_all(comment = "closebuy")

if curPosition < 0 and rsiParam <= stop_rsi_bottom_line
    strategy.close_all(comment = "closesell")


// 止盈止损清仓
if curPosition > 0
    // if (position_avg_price - close) / close >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closebuy")
    //     stopTrade := true
    if (close - position_avg_price) / position_avg_price >= stop_profit
        // 止盈
        strategy.close_all(comment = "closebuy")



if curPosition < 0
    // if (close - position_avg_price) / position_avg_price >= stop_loss_perc
    //     // 止损
    //     strategy.close_all(comment = "closesell")
    //     stopTrade := true

    if (position_avg_price - close) / close >= stop_profit
        // 止盈
        strategy.close_all(comment = "closesell")


a = strategy.closedtrades.exit_bar_index(strategy.closedtrades - 1)

if bar_index == a and strategy.closedtrades.profit(strategy.closedtrades - 1) < 0
    stopTrade := true

var float openPrice = 0.0



if rsiParam <= rsi_line and stopTrade == false
	strategy.entry("long", strategy.long, open_pos / close, comment = "long")
    if curPosition == 0
        openPrice := close
    strategy.exit("long_stop", "long", limit = openPrice * (1+stop_profit), stop=openPrice * (1-stop_loss_perc), comment = "closebuy")

if rsiParam >= 100 - rsi_line and stopTrade == false
    strategy.entry("short", strategy.short, open_pos / close, comment = "short")
    if curPosition == 0
        openPrice := close
    strategy.exit("short_stop", "short", limit = openPrice * (1-stop_profit), stop=openPrice * (1+stop_loss_perc), comment = "closesell")




plot(failedTimes)