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

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

저자:차오장, 날짜: 2023년 11월 10일 11:59:40
태그:

img

전반적인 설명

이 전략은 RSI (관계 강도 지수) 지표에 기반하여 과소득 및 과소득 조건을 결정합니다. RSI가 과소득 또는 과소득 수준에 도달하면 낮은 가격으로 구매하고 높은 가격으로 판매 할 때 역 트렌드 포지션을 취합니다. 전략은 간단하고 효과적이며 시장에서 단기적인 과소득 및 과소득 시나리오를 활용합니다.

전략 논리

이 전략은 RSI 지표를 입력 신호로만 사용합니다. RSI가 낮은 지점 (20 기본값) 아래로 넘어가면 긴 거리로 이동하고, RSI가 높은 지점 (80 기본값) 을 넘어가면 짧은 거리로 이동합니다. 매번 고정 금액 (100 기본값) 을 거래하며 시장 조건에 관계없이 1%의 이익을 목표로합니다. 손실이 3%에 도달하면 중단됩니다. 거래 빈도를 제어하기 위해 전략은 손실 거래 후 24 바로 거래를 중단합니다.

핵심 논리는

  1. RSI를 사용하여 과잉 매수/ 과잉 판매를 결정합니다
  2. RSI가 20 이하로 넘어갈 때 장거리
  3. RSI가 80을 넘으면 쇼트
  4. 매번 100달러를 매각합니다.
  5. 마감하기 위해 수익을 취하거나 손실을 중지합니다
  6. 손실 경우, 24 바에 대한 거래를 중지

우리가 볼 수 있듯이, 전략은 매우 간단하고 기계적입니다. 매개 변수 최적화에 대한 공간이 거의 없습니다. 그것은 단순히 RSI의 수학적 특성을 이용하여 과잉 구매 / 과잉 판매 지역의 역 트렌드 포지션을 취합니다.

이점 분석

이 전략의 가장 큰 장점은 단순성과 효율성입니다.

  1. 단일 지표 RSI를 사용합니다. 복잡한 기술적 분석이 필요하지 않습니다.
  2. 완전히 기계적인 시스템이고 감정적 간섭이 없습니다.
  3. 시장 방향을 예측하지 않고 단기적인 오차로 인한 이익
  4. 스톱 로스/프로피트 취득으로 관리되는 위험요소

또한 수익을 차단하고 위험을 제어하기 위해 스톱 로스 / 취득 비율을 구현하며 빈도를 줄이기 위해 거래 중단도 수행합니다. 이는 위험을 최소화하면서 보상을 극대화합니다.

위험 분석

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

  1. 강한 트렌드 시장에서 수익을 낼 수 없습니다. RSI는 트렌드가 지속될 때 장기간 과반 구매 / 과반 판매 구역에 머물러있을 수 있습니다.

  2. 너무 큰 스톱 로스는 과도한 손실로 이어질 수 있습니다. 현재 3%의 스톱 로스는 1-2%로 줄여야 할 수 있습니다.

  3. 높은 거래 주파수는 승리의 후에 과도한 거래로 이어질 수 있습니다. 거래 주파수를 제한해야합니다.

  4. 100달러 규모의 위험집약이 고정되어 자본의 %로 최적화되어야 합니다.

최적화 방향

분석을 바탕으로 전략은 다음과 같은 방법으로 개선될 수 있습니다.

  1. 트렌드가 명확하지 않을 때 MA와 같은 트렌드 필터를 추가하여 거래를 일시 중지합니다.

  2. 스톱 로스/프로피트 취업 비율을 최적화합니다. 스톱 로스를 1-2%로 줄이고 동적 스톱 로프트를 사용합니다.

  3. 거래 빈도를 제한합니다. 한 시간 동안 최대 2개의 거래가 가능합니다.

  4. 100달러가 아닌 자본의 비율을 기준으로 거래합니다.

  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)

더 많은