RSI移動平均に基づく、安く買って高く売る短期定量取引戦略


作成日: 2023-12-01 16:59:26 最終変更日: 2023-12-01 16:59:26
コピー: 0 クリック数: 706
1
フォロー
1621
フォロワー

RSI移動平均に基づく、安く買って高く売る短期定量取引戦略

概要

この戦略は,RSI指数とその平均線の交差を介して買入点を決定し,ショートライン取引戦略に属します.この戦略は,RSI指数が平均線より低いときに購入し,平均線より高いときに販売し,典型的な低買い高売り戦略に属します.

戦略原則

  1. 周期長40KのRSIを計算する
  2. RSI指標の平均線MAを計算し,周期長が10根のK線である
  3. RSI指標が平均線より下にあるとき,係数 ((1-買取区間/100) で買取信号を生成する
  4. RSI指標が平均線より高くなると,その係数 ((1+買取区間/100) で出札シグナルが生成される.
  5. 買賣区間距離がデフォルトで5で,平均線から正負5%でシグナルが生成される
  6. RSIが平均線より高く,50レベルより高い場合

優位分析

これは,RSIの超買超売の特性を利用して,買い買いするタイミングを決定する典型的なトレンド反転戦略である.この戦略には以下の利点があります.

  1. RSI指標は市場構造を判断するために使用され,指標自体は信頼性が高い
  2. 均一なフィルタリングにより,不必要な取引を回避し,安定性を高めます.
  3. 取引頻度を調整する取引区間距離のパラメータ
  4. シンプルでわかりやすいコードで 論理が明確です

簡単な,実用的なショートラインの取引戦略です.

リスク分析

この戦略にはいくつかのリスクがあります.

  1. RSIは誤った信号を発信する可能性があるので,指標曲線の形状に注意する必要があります
  2. 買い物区間を誤って設定すると,取引が過度になり,機会が失われる可能性があります.
  3. 取引頻度が高いため,取引コストの影響も考慮する必要があります.
  4. 単一の指標に基づいて,市場異常の影響を受けやすい

これらのリスクは,パラメータの最適化,フィルタリング条件の追加などによって軽減できます.

最適化の方向

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

  1. トレンド転換点でのみ信号を発信することを保証する,取引量指標などのフィルタリング指標を追加
  2. 単一損失をコントロールするストップ・ローズ戦略
  3. 取引距離の最適化,取引頻度と利得率のバランス
  4. 機械学習のアルゴリズムで最適参数组を自動検索する
  5. 複数のサブ戦略の結果を統合する集積モデルを追加

複数の指標の組み合わせ,ストップ管理,パラメータ最適化などの手段によって,戦略のパフォーマンスを大幅に向上させることができます.

要約する

この戦略は,全体的に非常に典型的で実用的なショートライン取引戦略である.これは,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)