RSI平均逆転量的な取引戦略

作者: リン・ハーンチャオチャン,日付: 2023年12月1日 16:59:26
タグ:

img

概要

この戦略は,短期取引戦略に属する,RSI指標と移動平均値の交差点に基づいて購入・売却信号を決定する.RSIがMAより低いときに購入し,RSIがMAより高いときに販売する.これは典型的な低買い高売り戦略である.

戦略原則

  1. RSI インディケーターを40バーで計算する.
  2. RSI指標のMAを10バーの期間で計算する.
  3. RSI が MA を係数で掛け合わせた値よりも低いときの購入信号を生成する (1%の取引範囲)
  4. RSI が MA を係数 (1+取引範囲%) で掛けた値よりも高いとき,売り信号を生成する.
  5. デフォルトの取引範囲距離は5で,発信信号を誘発するMAよりも 5%上または下です.
  6. RSI が MA 値と 50 値を超えると出口を決定する.

利点分析

これは典型的な平均逆転戦略で,RSI指標の過剰購入/過剰販売特性を活用して取引信号を決定する.利点とは:

  1. 市場構造を判断するためのRSI指標を採用し,それはかなり信頼性があります
  2. MAフィルターは不必要な取引を避け,安定性を高めます
  3. 調整可能な取引範囲制御の頻度
  4. シンプルな論理と理解しやすい

簡単に言うと シンプルで実用的な短期取引戦略です

リスク分析

リスクはいくつかあります.

  1. RSIが誤った信号を与える可能性,パターンを監視する必要があります
  2. 不適切な取引範囲設定は,過剰取引または機会を逃す可能性があります.
  3. 取引頻度が高いため,取引コストを考慮する必要がある
  4. 単一の指標にのみ依存し,市場異常に易い

パラメータ調整やフィルター追加などによって これらのリスクは軽減できます

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

戦略は以下の側面で最適化できます.

  1. ボリュームなどのフィルターを追加して,ターニングポイントでのみ信号を確保します.
  2. 単一の取引損失を制御するためにストップロスを追加する
  3. 取引頻度と利益率をバランスするために取引範囲を最適化
  4. 最適なパラメータセットを見つけるために機械学習を利用する
  5. サブ戦略からの結果を統合するためにアンサンブルモデルを追加する

多指標コンボ,ストップ損失管理,パラメータ最適化などにより,性能の大幅な向上が達成できます.

概要

概要すると,これは非常に典型的で実用的な短期取引戦略である.追加MAフィルターを使用して,エントリーと出口を決定するために,RSIの過剰購入/過剰販売レベルをキャピタライズする.論理はシンプルで明確で,パラメータは柔軟で,実装が簡単である.特定の市場リスクがあるが,エントリー/出口メカニズムを精製し,パラメータチューニングなどを通じて対処できる.より技術指標とリスク管理技術と組み合わせると,この戦略は比較的安定した短期戦略になることができます.


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © I11L

//@version=5
strategy("I11L - Meanreverter 4h", overlay=false, pyramiding=3, default_qty_value=10000, initial_capital=10000, default_qty_type=strategy.cash,process_orders_on_close=false, calc_on_every_tick=false)
 
frequency = input.int(10)
rsiFrequency = input.int(40)
buyZoneDistance = input.int(5)
avgDownATRSum = input.int(3)
useAbsoluteRSIBarrier = input.bool(true)
barrierLevel = 50//input.int(50)

momentumRSI = ta.rsi(close,rsiFrequency)
momentumRSI_slow = ta.sma(momentumRSI,frequency)
 
isBuy = momentumRSI < momentumRSI_slow*(1-buyZoneDistance/100) and (strategy.position_avg_price - math.sum(ta.atr(20),avgDownATRSum)*strategy.opentrades > close or strategy.opentrades == 0 ) //and (momentumRSI < barrierLevel or not(useAbsoluteRSIBarrier))
isShort = momentumRSI > momentumRSI_slow*(1+buyZoneDistance/100) and (strategy.position_avg_price - math.sum(ta.atr(20),avgDownATRSum)*strategy.opentrades > close or strategy.opentrades == 0 ) and (momentumRSI > barrierLevel or not(useAbsoluteRSIBarrier))
momentumRSISoftClose = (momentumRSI > momentumRSI_slow) and (momentumRSI > barrierLevel or not(useAbsoluteRSIBarrier))

isClose = momentumRSISoftClose

plot(momentumRSI,color=isClose ? color.red :  momentumRSI < momentumRSI_slow*(1-buyZoneDistance/100) ? color.green : color.white)
plot(momentumRSI_slow,color=color.gray)
plot(barrierLevel,color=useAbsoluteRSIBarrier ? color.white : color.rgb(0,0,0,0))
plot(momentumRSI_slow*(1-buyZoneDistance/100),color=color.gray)
plot(momentumRSI_slow*(1+buyZoneDistance/100),color=color.gray)
plot(momentumRSI_slow*(1+(buyZoneDistance*2)/100),color=color.gray)

// plot(strategy.wintrades - strategy.losstrades)

 
 
if(isBuy)
    strategy.entry("Buy",strategy.long, comment="#"+str.tostring(strategy.opentrades+1))

// if(isShort)
//     strategy.entry("Sell",strategy.short, comment="#"+str.tostring(strategy.opentrades+1))

if(isClose)
    strategy.exit("Close",limit=close)





もっと