ダブルRSI定量取引戦略


作成日: 2023-11-15 17:31:24 最終変更日: 2023-11-15 17:31:24
コピー: 0 クリック数: 690
1
フォロー
1617
フォロワー

ダブルRSI定量取引戦略

概要

この戦略は,二重RSI指標を使用し,長短二方向取引を行い,同時に均線システムと組み合わせてトレンドの方向を判断し,二重RSI定量化戦略に属します.この戦略は,まず,RSI指標を使用して多空信号を判断し,次に均線と組み合わせてトレンドの方向を判断し,多空を決定し,典型的なトレンドフォロー戦略に属します.

原則分析

二重RSI量化戦略は,主に二時間周期RSI指標を取引信号判断のために使用する.戦略は,最初に2つのRSIパラメータを設定し,より長い周期が主取引判断として,より短い周期が補助フィルターとして使用する.より長い周期RSIラインの下では,セールラインを破るときに多信号を生じ,短い周期RSIライン上では,購入ラインを破るときに空調信号を生じ,二重RSI指標の長さのショートクロス取引機会を形成する.

偽信号をフィルターするために,戦略はまた,SMAとEMA平均を導入し,トレンド判断を行う.短期のSMAラインが長期EMAラインを穿越するときにのみ,RSIの多信号を考慮し,短期のSMAラインの下の長期EMAラインを穿越するときにのみ,RSIの空き信号を考慮し,双RSIの信号がトレンド方向に一致することを確認し,反トレンドの取引を避ける.

さらに,ストップ・ストップの論理を設定する. ポジション開設後,同時に2つの異なる数のストップ・ストップのカードを下し,ストップ・ストップの位置を設定する.

優位分析

双RSI量化戦略には以下の利点があります.

  1. 双時間周期RSI指標は多空信号をより正確に判断できる.長短周期RSIのクロス組み合わせは,部分的な偽信号をフィルターして信号品質を向上させることができる.

  2. 均線システムは,大きなトレンドの方向を判断し,反トレンドの取引を避け,ほとんどのノイズ取引をフィルターし,勝利率を上げることができます.

  3. 柔軟なストップ・ストップ・メカニズムにより,異なるストップ設定により,より高い利益を得ることができ,また,リスクを制御するためにストップ・ストップすることもできます.

  4. 戦略的な取引の論理は,単純で明快で,容易に理解し,最適化され,量化トレーダーに学ぶのに適しています.

リスク分析

双RSIの定量化戦略にはいくつかの利点がありますが,以下のリスクがあります.

  1. RSI指数自体は,波動やトレンドの逆転の判断に効果がないため,これらの市場での戦略の取引効果は良くない可能性があります.

  2. 均線システムは,小範囲のノイズをフィルタリングできるが,中間周期のトレンド変化の判断は不十分であり,トレンド転換点を逃す可能性がある.

  3. ストップ・ロスの設定が不適切である場合,ストップ・ロスがあまりにも広いかストップ・ロスがあまりにも小さいことが起こり,戦略の効果が低下する.

  4. 大規模な空調や過剰空調は,損失の拡大につながる可能性があるため,ポジションの規模を制御する必要があります.

上記のリスクに対して,RSIパラメータを調整し,より高度なトレンドと逆転指標を導入し,ストップ・ストップ・ロスのロジックを最適化し,ポジションを制御することでリスクを軽減することができます.

最適化の方向

双RSIの量化戦略は,以下の方向からさらに最適化できます.

  1. 異なるパラメータの組み合わせを試し,RSI周期パラメータを最適化して,最適な長短周期RSI指標の組み合わせを見つけます.

  2. 異なる平均線指標をテストし,MACDなどの指標を導入し,トレンドと逆転の機会を判断する.

  3. ストップ・ストップ・ストップの戦略を最適化して,ストップ・ストップの柔軟性を高めるために,ストップ・ストップを追跡するストップまたは移動ストップを設定します.

  4. ポジションコントロールモジュールを追加し,大周期トレンドの異なる段階で空白ポジションをコントロールする.

  5. 機械学習モデルの追加により,エントリーとエグジットの精度が向上する.

  6. 分析と最適化により,最適の取引品種とタイミングを特定する.

要約する

双RSI定量化戦略は全体として典型的なトレンド追跡戦略である.双RSI指標を判断する取引信号と均線システムフィルターノイズを融合した戦略的考え方は非常に古典的で実用的である.戦略にも一定の改善の余地があるが,全体的な運行ロジックは明確で,容易に理解し,最適化できる.これは,量化取引初心者の学習と実践に適した戦略である.Practice makes perfectの原則によって,この戦略を継続的に最適化して代することで,安定した取引結果を得ることができる.

ストラテジーソースコード
/*backtest
start: 2023-11-07 00:00:00
end: 2023-11-14 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Growth Producer", overlay=true, initial_capital = 1000, currency = "USD", pyramiding = 2, commission_type=strategy.commission.percent, commission_value=0.07, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

//Functions
Atr(p) =>
    atr = 0.
    Tr = max(high - low, max(abs(high - close[1]), abs(low - close[1])))
    atr := nz(atr[1] + (Tr - atr[1])/p,Tr)

/// TREND
ribbon_period = input(19, "Period", step=1)

leadLine1 = ema(close, ribbon_period)
leadLine2 = sma(close, ribbon_period)

p1 = plot(leadLine1, color= #53b987, title="EMA", transp = 50, linewidth = 1)
p2 = plot(leadLine2, color= #eb4d5c, title="SMA", transp = 50, linewidth = 1)
fill(p1, p2, transp = 60, color = leadLine1 > leadLine2 ? #53b987 : #eb4d5c)

// Relative volatility index
length = input(120,"RVI period", minval=1), src = close
len = 14
stddev = stdev(src, length)
upper = ema(change(src) <= 0 ? 0 : stddev, len)
lower = ema(change(src) > 0 ? 0 : stddev, len)
rvi = upper / (upper + lower) * 100
benchmark = input(35, "RVI benchmark", minval=10, maxval=100, step=0.1)

// Plot RVI
// h0 = hline(80, "Upper Band", color=#C0C0C0)
// h1 = hline(20, "Lower Band", color=#C0C0C0)
// fill(h0, h1, color=#996A15, title="Background")
// offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
// plot(rvi, title="RVI", color=#008000, offset = offset)


/// MFI input
mfi_source = hlc3
mfi_length = input(19, "MFI Length", minval=1)
mfi_lower = input(15, "MFI Lower level", minval=0, maxval=50)
mfi_upper = input(90, "MFI Higher level", minval=50, maxval=100)


// MFI
upper_s = sum(volume * (change(mfi_source) <= 0 ? 0 : mfi_source), mfi_length)
lower_s = sum(volume * (change(mfi_source) >= 0 ? 0 : mfi_source), mfi_length)
mf = rsi(upper_s, lower_s)
// mfp = plot(mf, color=color.new(color.gray,0), linewidth=1)
// top = hline(mfi_upper, color=color.new(color.gray, 100), linewidth=1, editable=false)
// bottom = hline(mfi_lower, color=color.new(color.gray,100), linewidth=1, editable=false)
// hline(0, color=color.new(color.black,100), editable=false)
// hline(100, color=color.new(color.black,100), editable=false)

// Breaches
// b_color = (mf > mfi_upper) ? color.new(color.red,70) : (mf < mfi_lower) ? color.new(color.green,60) : na
// bgcolor(HighlightBreaches ? b_color : na)

// fill(top, bottom, color=color.gray, transp=75)

// Initial inputs
Act_RSI_VWAP_long = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE LONG")
RSI_VWAP_length_long = input(16, "RSI-VWAP LENGTH LONG")
RSI_VWAP_overSold_long = input(13, "RSI-VWAP OVERSOLD LONG", type=input.float)
RSI_VWAP_overBought_long = input(68, "RSI-VWAP OVERBOUGHT LONG", type=input.float)

Act_RSI_VWAP_short = input(true, "RSI VOLUME WEIGHTED AVERAGE PRICE SHORT")
RSI_VWAP_length_short = input(14, "RSI-VWAP LENGTH SHORT")
RSI_VWAP_overSold_short = input(7, "RSI-VWAP OVERSOLD SHORT", type=input.float)
RSI_VWAP_overBought_short = input(68, "RSI-VWAP OVERBOUGHT SHORT", type=input.float)

// RSI with VWAP as source
RSI_VWAP_long = rsi(vwap(close), RSI_VWAP_length_long)
RSI_VWAP_short = rsi(vwap(close), RSI_VWAP_length_short)

// Plot Them Separately.
// Plotting LONG, Put overlay=false
// r=plot(RSI_VWAP_long, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : RSI_VWAP_lnog < RSI_VWAP_overSold_long ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_long, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_long, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_long > RSI_VWAP_overBought_long ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_long < RSI_VWAP_overSold_long ? color.lime : na, transp = 60)

// Plotting SHORT, Put overlay=false
// r=plot(RSI_VWAP_short, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : color.blue, title="rsi", linewidth=2, style=plot.style_line)
// h1=plot(RSI_VWAP_overBought_short, color = color.gray, style=plot.style_stepline)
// h2=plot(RSI_VWAP_overSold_short, color = color.gray, style=plot.style_stepline)
// fill(r,h1, color = RSI_VWAP_short > RSI_VWAP_overBought_short ? color.red : na, transp = 60)
// fill(r,h2, color = RSI_VWAP_short < RSI_VWAP_overSold_short ? color.lime : na, transp = 60)


///////  STRATEGY Take Profit / Stop Loss ////////
////// LONG //////

long_tp1_inp = input(3.3, title='Long Take Profit 1 %', step=0.1)/100
long_tp1_qty = input(15, title="Long Take Profit 1 Qty", step=1)

long_tp2_inp = input(12, title='Long Take Profit 2%', step=0.1)/100
long_tp2_qty = input(100, title="Long Take Profit 2 Qty", step=1)

long_sl_inp = input(3.3, title='Long Stop Loss %', step=0.1)/100

long_take_level_1 = strategy.position_avg_price * (1 + long_tp1_inp)
long_take_level_2 = strategy.position_avg_price * (1 + long_tp2_inp)
long_stop_level = strategy.position_avg_price * (1 - long_sl_inp)

////// SHORT //////
short_tp1_inp = input(3.2, title='Short Take Profit 1 %', step=0.1)/100
short_tp1_qty = input(20, title="Short Take Profit 1 Qty", step=1)

short_tp2_inp = input(5.5, title='Short Take Profit 2%', step=0.1)/100
short_tp2_qty = input(100, title="Short Take Profit 2 Qty", step=1)

short_sl_inp = input(3.2, title='Short Stop Loss %', step=0.1)/100

short_take_level_1 = strategy.position_avg_price * (1 - short_tp1_inp)
short_take_level_2 = strategy.position_avg_price * (1 - short_tp2_inp)
short_stop_level = strategy.position_avg_price * (1 + short_sl_inp)



///Strategy_Conditions
/// LONG ///
entry_long =(crossover(RSI_VWAP_long, RSI_VWAP_overSold_long) and leadLine2<leadLine1) or (crossunder(mf,mfi_lower) and leadLine2<leadLine1)
entry_price_long=valuewhen(entry_long,close,0)
exit_long =crossunder(RSI_VWAP_long, RSI_VWAP_overBought_long)

/// SHORT ///

entry_short =crossunder(RSI_VWAP_short, RSI_VWAP_overBought_short) and leadLine2>leadLine1 or (crossover(mf,mfi_upper) and leadLine2>leadLine1)
entry_price_short=valuewhen(entry_short,close,0)
exit_short =crossover(RSI_VWAP_short, RSI_VWAP_overSold_short)

////// BACKTEST PERIOD ///////
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true

if testPeriod()

    if strategy.position_size == 0 or strategy.position_size > 0 and rvi>benchmark
        strategy.entry("long", true, when = entry_long, comment="Insert Enter Long Comment")
    strategy.exit("TP1","long", qty_percent=long_tp1_qty, limit=long_take_level_1, stop=long_stop_level)
    strategy.exit("TP2","long", qty_percent=long_tp2_qty, limit=long_take_level_2, stop=long_stop_level)
    strategy.close("long", when=exit_long, comment = "Insert Exit Long Comment")

    if strategy.position_size == 0 or strategy.position_size < 0 and rvi>benchmark
        strategy.entry("short", false, when = entry_short, comment="Insert Enter Short Comment")
    strategy.exit("TP1","short", qty_percent=short_tp1_qty, limit=short_take_level_1, stop=short_stop_level)
    strategy.exit("TP2","short", qty_percent=short_tp2_qty, limit=short_take_level_2, stop=short_stop_level)
    strategy.close("short", when=exit_short, comment = "Insert Exit Short Comment")


// LONG POSITION
plot(strategy.position_size > 0 ? long_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Long Take Profit")
plot(strategy.position_size > 0 ? long_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Long Take Profit")
plot(strategy.position_size > 0 ? long_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")


// SHORT POSITION
plot(strategy.position_size < 0 ? short_take_level_1 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="1st Short Take Profit")
plot(strategy.position_size < 0 ? short_take_level_2 : na, style=plot.style_linebr, color=color.green, linewidth=1, title="2nd Short Take Profit")
plot(strategy.position_size < 0 ? short_stop_level : na, style=plot.style_linebr, color=color.red, linewidth=1, title="Long Stop Loss")