動向平均の二重トレンド追跡戦略

作者: リン・ハーンチャオチャン, 日時: 2023-12-21 11:45:35
タグ:

img

概要

ダブル・ムービング・アベア・トレンド・トラッキング (Dual Moving Average Trend Tracking) は,株価のトレンドを追跡する定量的な取引戦略である.この戦略は,価格トレンドの方向性を決定するためにダブル指数的な移動平均システムを使用し,中長期間の価格トレンドを把握し,トレンドの強さを判断するためにADX指標を組み合わせる.

戦略原則

この戦略は主に価格動向の方向性を決定するための二重指数移動平均システムに基づいている.この戦略は異なるパラメータを持つ2つの高速および遅いEMAを使用し,高速EMA1は価格変化により速く反応し,遅いEMA2は価格変化によりゆっくり反応する.高速線がスローラインの上を横切ると,価格は上昇し始めていることを示唆する購入信号であり,高速線がスローライン以下を横切ると,価格は落ち始めていることを示唆する販売信号である.

ADXは,トレンドの強さを判断するためのADX指標も導入している. ADXはトレンドの強さを判断するために価格変動を計算する. ADXが上昇するとトレンドが強くなっていることを意味し, ADXが落ちるとトレンドが弱くなっていることを意味する. ADX指標を通じてトレードフィルター条件を設定し,トレンドの強さが比較的強い場合にのみ取引信号を発信する.

具体的には,この戦略の信号生成規則は次のとおりです.

  1. 速い線がスローラインを横切ったときに長行し,速い線がスローラインを横切ったときに短走する
  2. ADX > 25 の場合のみ,長期と短期を許可する.

これは,トレンド強度が弱くなる無効な信号を効果的にフィルタリングし,取引システムの安定性をさらに改善します.

戦略 の 利点

この戦略には以下の主な利点があります.

  1. 中期から長期間の価格動向を把握する: 双重EMAシステムは,中期から長期間の価格動向を効果的に決定し,短期的な市場の騒音による干渉を回避することができます.

  2. 偽のブレイクをフィルターするADX指標によってトレンド強さを判断することで,トレンドターニングポイントの周りに偽のブレイクによって引き起こされる不必要な損失を回避します.

  3. 大きいパラメータ最適化空間: 速い線と遅い線 パラメータ,ADX パラメーターなど,パラメータの組み合わせによってより良い取引結果をもたらすことができる最適化のための余地があります.

  4. 高度な適応性: この戦略は,ほとんどの株式と時間枠に適しており,様々な市場で検証されています.

  5. 簡単に実行できます: この戦略には単純な移動平均指標のみが必要であり,資源は少なく,プログラミングが簡単で,実用的な応用コストは低い.

戦略 の リスク

この戦略には,主に以下の分野に集中したリスクもあります.

  1. トレンド逆転リスク: どんなトレンド戦略も,トレンドの逆転点を完璧に決定することはできません.そして,実際のトレンドが実際に逆転したとき,より大きな損失を被るでしょう.

  2. オーバーオプティマイゼーションリスク: 極端にパラメータを最適化することで,戦略が歴史的データに過剰に適合し,戦略の安定性と実用的な効果を低下させる可能性があります.

  3. ブラック・スワン・イベントリスク: 予期せぬ大きな出来事が 元の価格動向モデルを壊し,移動平均指標の失敗を引き起こし,損失を制御するために手動介入またはストップ損失設定が必要になります.

上記のリスクに対処するために,次の側面から最適化することができます:

  1. 価格のターニングポイントを決定するための追加の指標を導入します.例えば,価格ターニングポイントが現れたときに増幅される取引量を導入します.

  2. ADX パラメータを適切に緩和して,トレンドの初期段階での機会を把握できるようにします.MACDやその他の補助判断指標も導入できます.

  3. パラメータ組み合わせの複数グループトレーニングとテストを行い,安定性や実用的な効果のある組み合わせを選択します.これは単一のパラメータグループの過剰最適化リスクを回避します.

戦略の最適化のための方向性

また,この戦略を最適化できるいくつかの方向性があります.

  1. ストップ・ロスのメカニズムを導入: 移動ストップ損失またはパーセントストップ損失を設定します. 傾向が逆転すると過度の損失を避けるために損失を積極的に停止することができます.

  2. 取引量指標を組み合わせる例えば,価格転換点で取引量が拡大するときに間違った信号を回避できる取引量です.

  3. パラメータ自己適応最適化: 固定的な静的パラメータではなく,インディケーターパラメータがリアルタイム市場変化に応じて適応的に調整できるようにします.これは戦略の安定性を大幅に向上させることができます.

  4. 機械学習を導入する: 移動平均値とADXのパラメータを決定するために,膨大な量の歴史的データを分析するために機械学習アルゴリズムを使用し,将来の価格動きを予測することもできます. これは移動平均戦略の進化の1つの方向です.

  5. クロスサイクル最適化: 異なる取引サイクルのパラメータを異なる方法で設定し,各サイクルの最適な構成をテストすることができます.

概要

一般的には,ダブル・ムービング・アベア・トレンド・トラッキング戦略は成熟した安定した戦略構想である.この戦略はダブル・EMAシステムを通じて中期から長期間の価格トレンドを把握し,ADX指標をシグナルをフィルターに搭載し,株価トレンドを効果的に把握し,短期間の市場騒音による干渉を回避することができる.同時に,この戦略にはパラメータ組み合わせとストップロスの最適化を必要とする一定のリスクも含まれており,戦略の安定性を高めるためにより多くの補助指標と機械学習アルゴリズムを導入することもできる.要約すると,ダブル・ムービング・アベア・トレンド・トラッキング戦略は良好なバランスを有し,中期から長期の投資家に適した定量戦略構想である.


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

//@version=3
strategy("Kitaec Strategy4", shorttitle = "Kitaec str4", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Lot")
len = input(14, defval=14, minval=1, maxval=1000, title="Smoothing")
len2 = input(14, defval=14, minval=1, maxval=1000, title="Smoothing2")
len3=input(550)
src = close
ema1=ema(src, len)
ema2=ema(ema1, len2)
d=ema1-ema2
zlema=ema1+d

ema21=ema(src, (len/3)*2)
ema22=ema(ema21, (len2/3)*2)
d2=ema21-ema22
zlema2=ema21+d2

ema31=ema(src, len3)
ema32=ema(ema21, len3)
d3=ema31-ema32
zlema3=ema31+d2

fromyear = input(1900, defval = 1900, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//MAs
//ma1 = security(tickerid, "60", vwma(src, len)[1])
//ma2 = security(tickerid, "120", vwma(src, len)[1])
//plot(ma1, linewidth = 2, color = blue, title = "MA")
//plot(ma2, linewidth = 2, color = red, title = "MA2")

// ADX
lenadx = 14
lensig = 14
limadx = 18

up = change(high)
down = -change(low)
trur = rma(tr, lenadx)
plus = fixnan(100 * rma(up > down and up > 0 ? up : 0, lenadx) / trur)
minus = fixnan(100 * rma(down > up and down > 0 ? down : 0, lenadx) / trur)
sum = plus + minus 
adx = 100 * rma(abs(plus - minus) / (sum == 0 ? 1 : sum), lensig)
adx2 = ema(adx, 14)
adx2i = ema(adx2,14)
dadx2 = adx2 - adx2i
zladx2 = adx2 + dadx2
plus2 = ema(plus, 14)
plus2i = ema (plus2, 14)
dplus2 = plus2 - plus2i
zlplus2 = plus2 + dplus2

minus2 = ema(minus, 14)
minus2i = ema (minus2, 14)
dminus2 = minus2 - minus2i
zlminus2 = minus2 + dminus2

vwma = vwma(close, 150)
vwma2 = ema(vwma, 9)
vwma2i = ema(vwma2, 9)
dvwma2 = vwma2 - vwma2i
zlvwma2 = vwma2 + dvwma2


rmax=rma(src, len)
rmax2=rma(rmax, len2)
rmd=rmax-rmax2
zlrmax=rmax+rmd
rmaxz=rma(src, (len/3)*2)
rmaxz2=rma(rmaxz, (len2/3)*2)
rmzd=rmaxz-rmaxz2
zlrmaxz=rmaxz+rmzd
rmaxcol2=zlrmaxz[1] > zlema2[1] ? red:lime
rmaxcol= zlrmax[1] > zlema[1] ? red:lime


rmazlema3=rma(zlema3, 100)
plot(rmazlema3, color=gray, linewidth=2)
plot(zlema, color=green)
plot(zlema2, color=yellow)
plot(zlema3, color=teal, linewidth=2)
plot(ema2, color=na)
plot(rmax, color=rmaxcol2, linewidth=3)
plot(zlrmax, color=rmaxcol, linewidth=3)


//Trading
size = strategy.position_size
lot = 0.0 
lot := size != size[1] ? strategy.equity / close * capital / 100 : lot[1]

if zlrmax[1] < zlema[1]
    strategy.entry("Buy", strategy.long, needlong ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
if zlrmax[1] > zlema[1]
    strategy.entry("Sell", strategy.short, needshort ? lot : 0, when = (time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))


もっと