RSI 지표와 이동평균을 기반으로 한 양적 거래 전략


생성 날짜: 2023-12-25 11:40:36 마지막으로 수정됨: 2023-12-25 11:40:36
복사: 0 클릭수: 349
1
집중하다
1166
수행원

RSI 지표와 이동평균을 기반으로 한 양적 거래 전략

개요

이 전략은 RSI 지표와 이동 평균을 결합한 양적 거래 전략이라고 불린다. 이 전략은 RSI 지표와 이동 평균을 거래 신호로 사용하여 트렌드 배경에서 역전 작업을 수행하는 양적 거래 전략을 구현한다. 핵심 아이디어는 주가가 역전 신호가 발생했을 때 포지션을 열고, 과매가 발생할 때 정지하는 것이다.

전략 원칙

이 전략은 주로 RSI 지표와 느린 이동 평균을 사용하여 주식 가격의 추세와 반전의 시간을 판단한다. 구체적으로, 전략은 먼저 빠른 이동 평균 (SMA) 과 느린 이동 평균을 계산하여 빠른 이동 평균 위에 느린 이동 평균을 통과하면 구매 신호를 생성하고 빠른 이동 평균 아래에 느린 이동 평균을 통과하면 판매 신호를 생성한다. 이것은 주식 가격의 추세 변동이 있음을 나타냅니다.

동시에, 이 전략은 RSI 지표를 계산하여 주가가 과매매 또는 과매매 상태에 있는지 판단한다. 포지션을 개시하기 전에, RSI 지표가 정상인지 판단하고, RSI가 설정된 하위치를 초과하면, 포지션을 잠정적으로 개시하고 RSI가 돌아온 후 포지션을 개시한다. 이것은 과매를 초과하는 불리한 시간에 포지션을 구축하는 것을 피할 수 있다.

RSI 지표와 이동 평균의 조합을 통해 주가가 역전 신호를 생성 할 때 포지션을 열 수 있습니다. 과잉 구매 과잉 판매 할 때 중지 할 수 있습니다. 주가 추세의 배경에서 역전 작업을 통해 수익을 창출하는 양적 거래 전략을 구현합니다.

전략적 이점

이 전략은 다음과 같은 장점을 가지고 있습니다.

  1. 주가 역전될 때 정확하게 포지션을 열 수 있다. 이동 평균 금포를 구매 신호로, 사다리 포를 판매 신호로 사용하여 주가 트렌드 역전 기회를 정확하게 잡을 수 있다.

  2. 불리한 시점에 포지션을 개시하는 것을 피할 수 있다. RSI 지표를 통해 과매매 과매매 상황을 판단하여, 주가 단기 변동이 과도할 때 포지션을 구축하는 것을 효과적으로 방지하고, 불필요한 부진을 피할 수 있다.

  3. RSI 제약은 거래의 위험을 효과적으로 통제할 수 있는 합리적인 수익 범위 내에서 거래를 통제할 수 있다.

  4. 매개 변수 조절이 쉽다. SMA 주기와 RSI 매개 변수 등이 다양한 시장 환경에 적응하기 위해 유연하게 조정될 수 있다.

  5. 자본 사용 효율성이 높다. 동향 평정 충격 단계에서 자주 거래할 수 있고, 자본을 효과적으로 사용할 수 있다.

위험 분석

이 전략에는 다음과 같은 위험도 있습니다.

  1. 추적 오류 위험. 이동 평균은 트렌드를 판단하는 지표로 다소 지연되어 위치 개시 시기가 정확하지 않을 수 있습니다.

  2. 자주 거래하는 위험. 불안한 상황에서는 너무 자주 입금하고 청산할 수 있다.

  3. 매개 변수 조정 위험. SMA 주기 및 RSI 매개 변수는 시장에 적응하기 위해 반복적으로 테스트 조정이 필요하며, 부적절한 설정은 전략의 성과에 영향을 줄 수 있습니다.

  4. 정지 위험. RSI 정지 설정이 잘못되면 조기 종료 또는 정지 종료 후 계속 상승 할 수 있습니다.

최적화 방향

이 전략의 최적화 방향은 다음과 같습니다.

  1. MACD, 브린 라인 등 다른 지표들을 RSI와 결합하여 신호를 더 정확하고 신뢰할 수 있도록 시도하십시오.

  2. 기계 학습 알고리즘을 추가하여, 역학적 데이터에 따라 파라미터를 자동으로 조정할 수 있게 하여, 파라미터 조정 위험을 줄일 수 있다.

  3. 제약 전략 최적화 메커니즘을 추가하여 제약이 더 똑똑하고 시장 변화에 적응하도록 합니다.

  4. 포지션 관리 전략을 최적화하여 포지션 규모를 동적으로 조정하여 단일 거래의 위험을 줄입니다.

  5. 고주파 데이터와 결합하여, 틱 레벨의 실시간 데이터를 사용하여 고주파 거래를 하고, 전략의 빈도를 높인다.

요약하다

전체적으로, 이 전략은 RSI 지표와 이동 평균을 사용하여 거래 신호를 생성하여 트렌드 실행 과정에서 역전 계산을 수행하는 정량화 전략을 구현합니다. 이동 평균을 단독으로 사용하는 것과 비교하여, 이 전략은 RSI 지표 판단을 추가하여 불리한 시점 포지션 개시를 효과적으로 방지하고 RSI를 통해 거래 위험을 제어하여 전략의 안정성을 어느 정도 향상시킵니다. 물론, 이 전략에는 개선할 여지가 있습니다.

전략 소스 코드
/*backtest
start: 2023-12-17 00:00:00
end: 2023-12-18 19:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//1. 做多
//    a. RSI在超买区间时不开单,直到RSI回落一点再开单
//    b. 已经有多仓,如果RSI超买,则平多获利,当RSI回落一点之后,再次开多,直到有交叉信号反转做空

//2. 做空
//    a. RSI在超卖区间时不开单,直到RSI回落一点之后再开多单
//    b. 已经有空仓,如果RSI超卖,则平空获利,当RSI回落一点之后,再开空单,直到有交叉信号反转做多

//@version=4
strategy("策略_RSI+移动揉搓线_", overlay=true)

// 输入
fastLength = input(11, minval=1)
slowLength = input(82,minval=1)
length = input(title="长度", type=input.integer, defval=14, minval=1, maxval=100)
hight_rsi = input(title="rsi超过上轨平多获利", type=input.integer, defval=80, minval=1, maxval=100)
low_rsi = input(title="rsi超过下轨平空获利", type=input.integer, defval=20, minval=1, maxval=100)

open_long_rsi_threshold = input(title="rsi低于该阈值时才开多", type=input.integer, defval=75, minval=1, maxval=100)
open_short_rsi_threshold = input(title="rsi高于该阈值时才开空仓", type=input.integer, defval=25, minval=1, maxval=100)

// 均线
sma_fast = sma(close, fastLength)
sma_slow = sma(close, slowLength)
// RSI
rsi = rsi(close, length)

//**********变量*start*******//
var long_f = false // 标记是否是均线交叉多头
var short_f = false // 标记是否是均线交叉空头
var long_open_pending = false // 标记开仓时rsi是否处于超买状态
var short_open_pending = false // 标记开仓时rsi是否处于超卖
var long_rsi_over_buy = false // 标记 多仓时 是否发生超买平多获利
var short_rsi_over_sell = false // 标记 空仓时 是否发生超卖平空获利

//**********逻辑*start*******//

// 买入
longCondition = crossover(sma_fast, sma_slow)
if (longCondition)
    short_rsi_over_sell := false // 清空该标记,防止再次开空仓
    long_f := true
	short_f := false
	if (rsi < hight_rsi)
	    // 并且没有超买
	    strategy.entry("多", long=strategy.long)
    if (rsi > hight_rsi)
        // 开仓时发生超买,等待rsi小于hight_rsi
	    long_open_pending := true

// 卖出
shortCondition = crossunder(sma_fast, sma_slow)
if (shortCondition)
    long_rsi_over_buy := false //清空该标记,防止再次开多仓
    long_f := false
    short_f := true
    if (rsi > low_rsi)
        strategy.entry("空", long=strategy.short)
	if (rsi < low_rsi)
	    // 开仓时发生超卖,等待rsi大于low_rsi
	    short_open_pending := true
	    

// 等待RSI合理,买入开仓
if (long_f and long_open_pending and strategy.position_size == 0 and rsi < open_long_rsi_threshold)
    strategy.entry("多", long=strategy.long)
	long_open_pending := false
// 等待RSI合理,卖出开仓
if (short_f and short_open_pending and strategy.position_size == 0 and rsi > open_short_rsi_threshold)
    strategy.entry("空", long=strategy.short)
	short_open_pending := false


	
//RSI止盈(RSI超买平多)
if (strategy.position_size > 0 and long_f and rsi > hight_rsi)
	strategy.close_all()
	long_rsi_over_buy := true
//RSI止盈(RSI超卖平空)
if (strategy.position_size < 0 and short_f and rsi < low_rsi)
	strategy.close_all()
	short_rsi_over_sell := true
	
	
//RSI止盈之后,再次开多
if (long_f and long_rsi_over_buy and strategy.position_size == 0 and rsi < hight_rsi)
    long_rsi_over_buy := false
    strategy.entry("多", long=strategy.long)
//RSI止盈之后,再次开空
if (short_f and short_rsi_over_sell and strategy.position_size == 0 and rsi > low_rsi)
    short_rsi_over_sell := false
    strategy.entry("空", long=strategy.short)


//**********绘图*start*******//

p1 = plot(sma_fast, linewidth=2, color=color.green)
p2 = plot(sma_slow, linewidth=2, color=color.red)
fill(p1, p2, color=color.green)
plot(cross(sma_fast, sma_slow) ? sma_fast : na, style = plot.style_circles, linewidth = 4)

// 绘制rsi线
//plot(rsi, color=color.green, editable=true, style=plot.style_circles, linewidth=2)

// 绘制上下轨
//high_ = hline(80, title="上轨")
//low_ = hline(20, title="下轨")
//fill(high_, low_, transp=80, editable=true, title="背景")