RSI インディケーターと移動平均値に基づく定量的な取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-25 11:40:36
タグ:

img

概要

この戦略は,RSI指標と移動平均値に基づく定量取引戦略と呼ばれる.RSI指標と移動平均値を取引シグナルとして利用し,トレンド背景下で逆転操作を行う定量取引戦略を実装する.その基本的なアイデアは,価格逆転信号が発生するとポジションを開き,過買いまたは過売りした場合の利益を取ることです.

戦略原則

この戦略は,主にRSI指標と高速/スロー移動平均値を使用して価格動向と逆転タイミングを決定する.特に,まずは高速移動平均値 (SMA) とスロー移動平均値 (SMA) を計算する.高速 SMAがスロー SMAを横切ると,購入信号が生成される.高速 SMAがスロー SMAを下回ると,販売信号が生成される.これは価格の傾向が変化していることを示す.

この戦略は,価格が過買いまたは過売り状態にあるかどうかを判断するために,RSIインジケーターを計算する.ポジションを開く前に,RSIインジケーターが正常かどうかを判断する.RSIが設定された値を超えると,開設ポジションを一時停止し,RSIがオープンする前に戻ってくるのを待つ.これは不利な過買いおよび過売りタイミングでポジションを確立するのを防ぐことができます.一方,ポジションを取った後,RSIが設定された利益の値を超えると,利益を得るためにポジションを閉じる.これは取引の利益をロックすることができます.

RSIインジケーターを移動平均値と協働することで,価格逆転のシグナルが発生するとポジションを開くことができる.過買いまたは過売れたときに利益を得ることで,価格トレンド背景の下での利益の逆転操作を行う定量的な取引戦略を実装することができます.

利点

この戦略には以下の利点があります.

  1. 価格逆転が起こると正確にポジションを開く.移動平均金十字を購入信号と死亡十字を販売信号として使用することで,価格トレンド逆転の機会を正確に把握することができます.

  2. 不利なオープニングポジションのタイミングを避ける.RSIインジケーターを通じて過剰購入および過剰売却状況を判断することで,短期的に価格が過剰に変動するときにポジションを確立するのを効果的に防ぐことができ,不必要な浮動損失を回避することができます.

  3. リスクはうまくコントロールできます.RSIの取利益は,ポジションを合理的な利益範囲内に保ち,取引リスクを効果的に制御できます.

  4. パラメータを最適化しやすい.SMA期間,RSIパラメータなど,異なる市場環境に適応するために柔軟に調整できます.

  5. 高資本利用効率.トレンド konsolidation とショック段階では頻繁に取引が実施され,資本の効率的な利用が可能である.

リスク分析

この戦略には次のリスクもあります

  1. トレーキングエラーリスク 傾向判断指標としての移動平均値は一定の遅延があり,開設ポジションのタイミングが不正確になる可能性があります.

  2. 頻繁に取引するリスク:変動する市場では,過剰に頻繁にポジションを開設・閉じる可能性があります.

  3. パラメータ調整リスク.SMA期とRSIパラメータは,市場に適応するために繰り返しテストと調整が必要です.不適切な設定は戦略のパフォーマンスに影響を与える可能性があります.

  4. 利得リスク 誤ったRSIの利得リスク設定は,ポジションの早期離脱や利得離脱後に継続的な上昇につながる可能性があります.

オプティマイゼーションの方向性

最適化方向は以下のとおりです.

  1. RSIと組み合わせてMACD,ボリンジャー帯,その他の指標を使用して信号をより正確で信頼性のあるものにしてください.

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

もっと