ダイナミックRSIとCCIを組み合わせたマルチファクター定量取引戦略


作成日: 2023-11-27 18:54:34 最終変更日: 2023-11-27 18:54:34
コピー: 0 クリック数: 732
1
フォロー
1617
フォロワー

ダイナミックRSIとCCIを組み合わせたマルチファクター定量取引戦略

概要

この戦略は,ダイナミックなRSI指標,CCI指標,および多重MA平均線を組み合わせて,多要因駆動の定量取引戦略を実現します. この戦略は,トレンド,オーバーバイ,オーバーセールなどの複数の次元を総合的に考慮して判断し,取引シグナルを生成します.

戦略原則

技術指標

  • MA平均線:一定の周期内の閉盘価格平均値を計算し,価格トレンドを判断する
  • RSIの相対的な弱さ:超買いと超売りの領域を判断する
  • CCIの順位指数:超買い超売りを判断する
  • Stoch KDJ指標: ランダムな指標がメイントレンドから偏っている場合の判断

取引信号

買取信号:MA12でMA26を打つ,CCIは100以下 (超売),Stoch KDJは80以下 (超売)

売出シグナル:RSIの下の動的下落,Stoch KDJは80より高い (超買い)

戦略的優位性

  1. 多要素駆動,総合判断,偽信号の低減
  2. ダイナミック・デベリエーション・セラブル,リアルタイムで超買超売を検知する
  3. トレンド,ランダム性,主流の技術指標を組み合わせる
  4. 複数のパラメータを調整し,柔軟性がある

戦略リスク

  1. 多因子組合せは複雑で,パラメータを最適化するのが難しい
  2. 戦略のパフォーマンスとパラメータの選択は高度に関連している
  3. 定量化プロセスに厳密に準拠してパラメータを最適化する必要があります.
  4. 曲線適合のリスクが高い

戦略の最適化

  1. 複数のデータセットで 戦略の健全性をテストする
  2. 複数のパラメータを組み合わせたテストで最適パラメータを探す
  3. 損失防止装置を増やし,最大撤収を減らす
  4. ポジション管理を強化し,不況を回避する
  5. 異なる品種の合約の適合性をテストする

要約する

この戦略は,複数の技術指標と複数の要因を駆動した判断を総合的に適用し,パラメータの調整と厳格な統計的検証によって最適なパラメータを探し,優れた戦略効果を得ることができます.しかし,複雑度が高いため,過適合のリスクを防止し,ポジションとストップを制御して最大限の撤収を減らす必要があります.この戦略は,他の品種と時間周期に最適化テストをさらに拡張できます.

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

//@version=4
strategy(title="ATOM2.0", shorttitle="ATOM V2.0", overlay=false, default_qty_type=strategy.cash, currency=currency.USD, initial_capital=200, default_qty_type=strategy.cash, default_qty_value=100, pyramiding=10)

// Set Parameter MA12
len12 = input(12, minval=1, title="Length")
src12 = input(close, title="Source")
ma12 = sma(src12, len12)
//plot(ma12, color=color.blue, title="MA12")

// Set Parameter MA26
len26 = input(26, minval=1, title="Length")
src26 = input(close, title="Source")
ma26 = sma(src26, len26)
//plot(ma26, color=color.orange, title="MA12")

//Stochastic RSI 14,3,3
smoothK_1 = input(3, minval=1)
smoothD_1 = input(3, minval=1)
lengthRSI = input(14, minval=1)
lengthStoch = input(14, minval=1)
src_1 = input(close, title="RSI Source_1")

rsi1 = rsi(src_1, lengthRSI)
k = sma(stoch(rsi1, rsi1, rsi1, lengthStoch), smoothK_1)
d = sma(k, smoothD_1)
//plot(k, color=color.red)
//plot(d, color=color.yellow)

//Stochastic RSI 5,4,3
smoothK_2 = input(4, minval=1)
smoothD_2 = input(3, minval=1)
lengthRSI_2 = input(5, minval=1)
lengthStoch_2 = input(5, minval=1)
src_2 = input(close, title="RSI Source_2")

rsi2 = rsi(src_2, lengthRSI_2)
k_2 = sma(stoch(rsi2, rsi2, rsi2, lengthStoch_2), smoothK_2)
d_2 = sma(k_2, smoothD_2)
//plot(k_2, color=color.white)
//plot(d_2, color=color.green)

// CCI
cci = cci(close,26)
//plot(cci,color=color.blue)

// Dynamic RSI
DZbuy = 0.1
DZsell = 0.1
Period = 14
Lb = 60

RSILine = rsi(close,Period)
jh = highest(RSILine, Lb)
jl = lowest(RSILine, Lb)
jc = (wma((jh-jl)*0.5,Period) + wma(jl,Period))
Hiline = jh - jc * DZbuy
Loline = jl + jc * DZsell
R = (4 * RSILine + 3 * RSILine[1] + 2 * RSILine[2] + RSILine[3] ) / 10

plot(R, title='R', color=color.white, linewidth=1, transp=0)
plot(Hiline, title='Hiline', color=color.yellow,  linewidth=1, transp=0)
plot(Loline, title='Loline', color=color.yellow, linewidth=1, transp=0)
plot(jc, title='Jc', color=color.purple,  linewidth=1, transp=50)

col_1 = R > Hiline ? color.red:na
col_2 = R < Loline ? color.green:na

fill(plot(R, title='R', color=color.white, linewidth=1, transp=0), plot(Hiline, title='Hiline', color=color.yellow,  linewidth=1, transp=0), color=col_1,transp=0)
fill(plot(R, title='R', color=color.white, linewidth=1, transp=0), plot(Loline, title='Loline', color=color.yellow, linewidth=1, transp=0), color=col_2,transp=0)
//------------------------------------------------------------------------------
// Calculate qty
// Parameter
fund = 10           // Fund per Contract in USD
leverage = 100     // Leverage
// Buy Condition
buyCondition = (ma12>ma26 and cci<100 and k<80 and d<80 and k_2<80 and d_2<80 and crossover(k_2, d_2))
buy = (buyCondition == input(1))
alertcondition(buy, title='time to Long', message='Long!!!')
//closeBuy = (cci>100 and cci<cci[1] and cci<cci[2])
closeBuy = (crossunder(R, Hiline) and k>80)
alertcondition(closeBuy, title='Time to Close', message='Close Long')

// Submit Orders
strategy.entry(id="Long", qty=(fund*leverage)/close, long=true, when=buyCondition)
strategy.close(id="Long", when=closeBuy)