ダブルEMAと価格変動指標に基づく定量取引戦略


作成日: 2023-12-18 11:26:49 最終変更日: 2023-12-18 11:26:49
コピー: 0 クリック数: 651
1
フォロー
1621
フォロワー

ダブルEMAと価格変動指標に基づく定量取引戦略

概要

この戦略は,平均線指標と価格変動率の組み合わせ戦略である.これは,二指数移動平均 ((Double Exponential Moving Average, DEMA) と価格変動率の指標を組み合わせて,総合的な取引信号の生成を実現する.

戦略原則

この戦略は2つの部分から構成されています.

  1. DEMA指数。この指数は,20日と2日の指数移動平均を計算し,価格が上方から下方から2日線を突破した場合,または下方から20日線を突破した場合,取引シグナルを生成する。

  2. (最高価格 - 最低価格) / 終盤価格の変動率指数。この指数は,価格が1周期間の変動幅を反映している。ここでは,過去20のK線の変動率指数の16日間の単純移動平均を計算し,現在のK線の変動率がこの平均値より高くまたは低いときは,取引シグナルを生成する。

2組の信号を組み合わせて,DEMAと波動率指標が同時に信号を発した場合は,最終的な多頭または空頭取引指示を生成する.

優位分析

この戦略の利点は以下の通りです.

  1. 複数の指標を組み合わせることで,偽信号を減らすことができ,信号の信頼性を高めることができる.

  2. 20日線は中長期トレンドを効果的に識別し,2日線は短期波動を捕捉し,組み合わせで異なる市場環境に対応することができる.

  3. 波動率指標は,市場の波動性と取引機会を効果的に反映します.

  4. パラメータを調整することで,異なる品種と周期の市場に対応できます.

リスク分析

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

  1. 波動率が低いトレンド市場では,波動率指標は誤った信号を生じることがあります.他の流動性指標と組み合わせてフィルタリングすることができます.

  2. 急速な単一行情では,二重EMAが遅滞する可能性がある.パラメータを適切に短縮するか,または他の指標と組み合わせることができる.

  3. 複数の指標の組み合わせは戦略的複雑さを増加させ,過剰最適化のリスクを増加させます. 完全な反測とパラメータの安定性検査が必要です.

最適化の方向

この戦略は,以下の点で最適化できます.

  1. 損失を抑制する仕組みを導入し, 損失を効率的に制御する.

  2. 異なる品種と周期のパラメータに応じて最適化され,パラメータをより適応的にします.

  3. 流動性と波動率の指標を組み合わせて信号の質を向上させる.

  4. 機械学習アルゴリズムを追加し,動的パラメータと重量調整を実現する.

要約する

この戦略は,二重EMAと波動率指標を組み合わせて,トレンド市場と振動市場の両方で良好な取引パフォーマンスを得ることができる.しかし,それと同時に,さらなる最適化と改善を必要とする一定のリスクもあります.しかし,全体的に,この戦略は,明確な考え方で,実際の操作価値を持っています.

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

//@version=5
////////////////////////////////////////////////////////////
//  Copyright by HPotter v1.0 12/04/2022
// This is combo strategies for get a cumulative signal. 
//
// First strategy
// This indicator plots 2/20 exponential moving average. For the Mov 
// Avg X 2/20 Indicator, the EMA bar will be painted when the Alert criteria is met.
//
// Second strategy
//  This histogram displays (high-low)/close
//  Can be applied to any time frame.
//
//
// WARNING:
// - For purpose educate only
// - This script to change bars colors.
////////////////////////////////////////////////////////////
EMA20(Length) =>
    pos = 0.0
    xPrice = close
    xXA = ta.ema(xPrice, Length)
    nHH = math.max(high, high[1])
    nLL = math.min(low, low[1])
    nXS = nLL > xXA or nHH < xXA ? nLL : nHH
    iff_1 = nXS < close[1] ? 1 : nz(pos[1], 0)
    pos := nXS > close[1] ? -1 : iff_1
    pos


HLCH(input_barsback,input_percentorprice,input_smalength) =>
    pos = 0.0
    xPrice = (high-low)/close
    xPriceHL = (high-low)
    xPrice1 = input_percentorprice ? xPrice * 100: xPriceHL
    xPrice1SMA = ta.sma(math.abs(xPrice1), input_smalength)
    pos := xPrice1SMA[input_barsback] > math.abs(xPrice1) ? 1 :
    	     xPrice1SMA[input_barsback] < math.abs(xPrice1) ? -1 : nz(pos[1], 0)
    pos

strategy(title='Combo 2/20 EMA & (H-L)/C Histogram', shorttitle='Combo', overlay=true)
var I1 = '●═════ 2/20 EMA ═════●'
Length = input.int(14, minval=1, group=I1)
var I2 = '●═════ (H-L)/C Histogram  ═════●'
input_barsback = input(20, title="Look Back", group=I2)
input_percentorprice = input(false, title="% change", group=I2)
input_smalength = input(16, title="SMA Length", group=I2)
var misc = '●═════ MISC ═════●'
reverse = input.bool(false, title='Trade reverse', group=misc)
var timePeriodHeader = '●═════ Time Start ═════●'
d = input.int(1, title='From Day', minval=1, maxval=31, group=timePeriodHeader)
m = input.int(1, title='From Month', minval=1, maxval=12, group=timePeriodHeader)
y = input.int(2005, title='From Year', minval=0, group=timePeriodHeader)
StartTrade = time > timestamp(y, m, d, 00, 00) ? true : false
posEMA20 = EMA20(Length)
prePosHLCH = HLCH(input_barsback,input_percentorprice,input_smalength)
iff_1 = posEMA20 == -1 and prePosHLCH == -1 and StartTrade ? -1 : 0
pos = posEMA20 == 1 and prePosHLCH == 1 and StartTrade ? 1 : iff_1
iff_2 = reverse and pos == -1 ? 1 : pos
possig = reverse and pos == 1 ? -1 : iff_2
if possig == 1
    strategy.entry('Long', strategy.long)
if possig == -1
    strategy.entry('Short', strategy.short)
if possig == 0
    strategy.close_all()
barcolor(possig == -1 ? #b50404 : possig == 1 ? #079605 : #0536b3)