RSIインジケーターと移動平均に基づく定量取引戦略


作成日: 2023-12-25 11:40:36 最終変更日: 2023-12-25 11:40:36
コピー: 0 クリック数: 615
1
フォロー
1623
フォロワー

RSIインジケーターと移動平均に基づく定量取引戦略

概要

この戦略は,RSI指数と移動平均を組み合わせた定量取引戦略である.この戦略は,RSI指数と移動平均を取引信号として使用し,トレンドの背景で逆転操作を行うための定量取引戦略である.その核心思想は,株価が逆転信号が発生したときにポジションを開き,オーバーバイオーバーセールしたときにストップを行うことである.

戦略原則

この戦略は,株価のトレンドと逆転のタイミングを判断するために,主にRSI指標とスロー移動平均を使用する.具体的には,戦略は,まず,スロー移動平均とスロー移動平均を計算し,スロー移動平均を高速移動平均の上から穿越すると買入シグナルが生じ,スロー移動平均を高速移動平均の下から穿越すると売出シグナルが生じます.これは,株価のトレンドが変化していることを示します.

同時に,この戦略は,株価が超買いまたは超売り状態にあるかどうかを判断するために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="背景")