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

RSI 지표 및 이동 평균에 기초한 양적 거래 전략

저자:차오장, 날짜: 2023-12-25 11:40:36
태그:

img

전반적인 설명

이 전략은 RSI 지표와 이동 평균에 기반한 양적 거래 전략 (Quantitative Trading Strategy Based on RSI Indicator and Moving Average) 이라고 불린다. 이는 RSI 지표와 이동 평균을 거래 신호로 사용하여 트렌드 배경에서 역전 작전을 수행하는 양적 거래 전략을 구현한다. 그것의 핵심 아이디어는 가격 역전 신호가 발생했을 때 포지션을 열고 과소매 또는 과소매했을 때 이익을 취하는 것이다.

전략 원칙

이 전략은 주로 RSI 지표와 빠른 / 느린 이동 평균을 사용하여 가격 트렌드와 반전 시기를 결정합니다. 구체적으로, 먼저 빠른 이동 평균 (SMA) 과 느린 이동 평균을 계산합니다. 빠른 SMA가 느린 SMA를 넘을 때 구매 신호가 생성됩니다. 빠른 SMA가 느린 SMA를 넘을 때 판매 신호가 생성됩니다. 이것은 가격의 추세가 변하고 있음을 나타냅니다.

동시에, 이 전략은 가격이 과잉 구매 또는 과잉 판매 상태인지 판단하기 위해 RSI 지표를 계산합니다. 포지션을 열기 전에 RSI 지표가 정상인지 판단합니다. RSI가 설정된 임계치를 초과하면 개설 포지션을 중단하고 RSI가 열기 전에 다시 떨어지는 것을 기다립니다. 이것은 불리한 과잉 구매 및 과잉 판매 타이밍에서 포지션을 설정하는 것을 피할 수 있습니다. 반면에 포지션을 취한 후, RSI가 설정 된 수익 임계치를 초과하면 수익을 얻기 위해 포지션을 닫을 수 있습니다. 이것은 거래 수익을 잠금 할 수 있습니다.

이동평균과 RSI 지표를 협업함으로써, 가격 반전 신호가 발생하면 포지션을 열 수 있습니다. 과잉 구매 또는 과잉 판매시 수익을 취함으로써, 가격 트렌드 배경에서 수익을 위해 반전 작전을 수행하는 양적 거래 전략을 구현할 수 있습니다.

장점

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

  1. 가격 전환이 발생했을 때 정확한 포지션을 열기. 이동 평균 황금 십자 (golden cross) 를 구매 신호로, 죽음의 십자 (death cross) 을 판매 신호로 사용하면 가격 트렌드 전환 기회를 정확하게 파악할 수 있습니다.

  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="背景")
    
    
    
    
    
    
    

더 많은