デュアルCCI定量戦略


作成日: 2023-11-28 15:47:04 最終変更日: 2023-11-28 15:47:04
コピー: 1 クリック数: 710
1
フォロー
1621
フォロワー

デュアルCCI定量戦略

概要

この戦略は,クラシック技術指標CCIと自主開発のVCI,MCI双指数を組み合わせて取引信号を形成し,典型的な量的な取引戦略の1つである.それは,VolumeとPriceの変化の傾向を認識し,現在の市場情勢の主要な取引方向と強さを判断し,取引信号を形成する.デジタル通貨,外貨,および株式などの金融機関に広く適用できる.

戦略原則

  1. 価格を判断するために,OHLC4平均線を計算し,CCI指数と組み合わせます.
  2. 資金の流れを測るobv指標を計算する.
  3. VCI指数,つまりobv指数による差差分による資金流動の分布を計算する.
  4. MCI指数,つまり価格差による価格分布の測定を計算する.
  5. VCIとMCIの指標を比較して,市場での買い物状況を判断する.
  • VCI > MCI 購入意欲が高い
  • VCI < MCI 売り手による意思表示
  1. VCIとMCIの比較によって形成された多空信号;

優位分析

  1. この戦略は,価格,取引量,そして資金の流れを複数の次元に統合して,市場での買い買い状況を判断し,シグナルはより正確である.
  2. VCIとMCIは,ダイナミック標準差の計算により,市場のリアルタイムの変化に対応します.
  3. 戦略のパラメータは,大量に反測して最適化され,高い安定性を有する.

リスク分析

  1. 価格と取引量指標の計算が遅れており,予期せぬ事態を予め捉えられない.
  2. 複雑で変動する市場情勢を 単一の戦略では完全にカバーすることはできません.
  3. 他の補助指標と組み合わせる必要があるため,市場を単独で判断することはできません.

最適化の方向

  1. 信号判断の精度を向上させるため,ディープラーニングなどの予測モデルを組み合わせる.
  2. 戦略の安定性を高めるため,リスク管理モジュール,例えばストップ・ロスを追加する.
  3. 特定の市場での適用性をテストするために,異なるパラメータの組み合わせを試すことができます.

要約する

この戦略は,価格と取引量などの複数の要因を考慮して,市場での買い買い力を評価して,双子CCI指数の比較によって取引信号を形成する.これは典型的な,実用的な量化取引戦略である.しかし,戦略の最大限の効果を出すために,他の補助ツールと連携して使用する必要があります.適用シナリオを向上させ,リスクを減らすためにさらに最適化することは価値があります.

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

//@version=3
strategy("MCI and VCI - Modified CCI Formulas")
test = cci(ohlc4, 13)
test1 = cci(ohlc4, 20)

obv(src) => cum(change(src) > 0 ? volume : change(src) < 0 ? -volume : 0*volume)
mDisc = input(0, title="Mode Discrepency")
mDiv = input(0.015, title="Interval")
mean(_src, _length)=>
    _return = sum(_src, _length) / _length

median(_src, _length)=>
    _return = _src
    for _i = 0 to _length
        _return := _return == 0 ? _src : (_return + _src[_i]) / 2
    _return


len = input(20, title="Standard (Average) Length")
mmm = input(20, title="Lookback length")
srcV = obv(input(ohlc4))
srcP = input(close)
x = sma(srcV, len)
MDV2 = abs(stdev(median(x, len), mmm))
MDV3 = abs(stdev(mean(x, len), mmm))
AMDV = (MDV2+MDV3)/2
pt1v = (srcV-ema(srcV, len))/ AMDV
pt2v = 1/mDiv
VCI=pt1v*pt2v
y = ema(srcP, len)
MDP2 =  abs(stdev(median(y, len), mmm))
MDP3 = abs(stdev(mean(y, len), mmm))
AMDA = (MDP2 + MDP3)/2
pt1p = 1/mDiv
pt2p = (srcP-ema(srcP, len))/ AMDA
MCI = pt1p * pt2p
plot(VCI, color=yellow, title="VCI", style="Histogram")
plot(MCI, color=white, title="MCI")

plot(500, style=line)

plot(0, style=line, linewidth=2)

plot(-500, style=line)
long = crossover(MCI, 0) and VCI > MCI[2] 
short = crossunder(MCI, 0) and VCI < MCI[2] 
//Time Control
//Set date and time
FromMonth = input(defval = 9, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 13, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2017)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)

// === FUNCTION EXAMPLE ===
start     = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish    = timestamp(ToYear, ToMonth, ToDay, 23, 59)        // backtest finish window
window()  => time >= start and time <= finish ? true : false // create function "within window of time"


direction = input(0, title = "Strategy Direction", minval=-1, maxval=1)
strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long))
if (long)
    strategy.entry("Long", strategy.long, when=window(), limit=ohlc4, oca_name="BollingerBands",  comment="BBandLE")
else
    strategy.cancel(id="Long")

if (short)
    strategy.entry("Short", strategy.short, when=window(), limit=ohlc4, oca_name="BollingerBands", comment="BBandSE")
else
    strategy.cancel(id="Short")