
双動平均トレンド追跡戦略は,株式価格のトレンドを追跡する量化取引戦略である.この戦略は,双指数移動平均システムの価格トレンドの方向を判断し,ADX指標のトレンド判断力と組み合わせて,中長期線で価格トレンドを捕捉する.
この戦略は,主に二指数移動平均システムに基づいて価格の傾向の方向を判断する.戦略は,速く遅い2つの異なるパラメータのEMAを使用し,速線EMA1は価格の変化により迅速に反応し,遅い線EMA2は価格変化により遅い反応する.速線上の慢線を横断すると,価格が上昇し始めることを示す買い信号であり,速線の下の慢線を横断すると,価格が下がり始めることを示す売り信号である.
さらに,戦略はADX指標を導入し,トレンドの強さを判断する. ADXは価格変動を計算してトレンドの強さを判断する. ADX値が上昇すると,トレンドが強化されていることを示し,ADX値が低下すると,トレンドが弱まっていることを示している. 戦略はADX指標を介して取引フィルタリング条件を設定し,トレンドの強度が高い場合にのみ取引信号を発信する.
具体的には,この戦略の取引シグナル生成規則は以下の通りです.
取引システムの安定性をさらに高めるため,トレンドの弱さの無効信号を効果的にフィルターすることができます.
この戦略の利点は以下の通りです.
中長線の価格トレンドを捉える: 二重EMA平均システムは,価格の中長期トレンドを効果的に判断し,短期市場の騒音に邪魔されないようにする.
フィルタが破裂する: ADX指標でトレンドの強さを判断し,トレンドの転換点の近くで発生する偽の断裂による不必要な損失を避ける.
パラメータの最適化スペースが大きい: 快慢線パラメータ組合せ,ADXパラメータなどには最適化スペースがあり,組合せパラメータによってよりよい取引効果を得ることができる.
適応性が高いこの戦略は,ほとんどの株式と時間周期に適用され,多くの市場で実証されています.
実行しやすい戦略はシンプルな平均指標のみを必要とし,リソースが少なく,プログラミングが簡単で,実際の運用コストは低い.
この戦略にはいくつかのリスクがあり,以下のような部分に重点を置いています.
トレンド反転リスク逆転のタイミングを正確に判断できるトレンド戦略は存在しないので,本当の逆転が起こると,大きな損失を招くことは避けられない.
パラメータ最適化過度のリスク:パラメータを極度に最適化すると,戦術が歴史データに過度に適合し,戦術の安定性と実戦効果が低下する.
緊急事態のリスク: 重要な突発事件は,原始的な価格トレンドパターンを破り,移動平均指標は失効し,人工介入または損失を制御するためにストップを設定する必要があります.
このリスクに対して,以下のような方法で最適化することができます.
価格転換点を判断する追加指標を導入する.例えば,取引量を導入すると,価格転換と同時に取引量が増大する.
ADXパラメータを適切に緩め,トレンドの初期にもチャンスを掴むことを保証する.また,MACDなどの補助判断指標を導入することもできる.
パラメータの組み合わせを複数のグループでトレーニングテストし,安定性と実戦効果の両方が良好なパラメータを選択する.単一のパラメータの最適化過度のリスクを避ける.
この戦略には,いくつかの改善策があります.
ストップロスメカニズムの導入: 移動ストップまたはパーセンテージストップを設定し,トレンドが逆転したときに積極的にストップし,ポジションの過大損失を避ける.
取引量指数と組み合わせた例えば,取引量が増加すると,価格の転換点に誤信号が発生しないようにする.
パラメータの自主最適化:指標のパラメータを,固定された静的なパラメータではなく,リアルタイム市場の変化に合わせて自律的に調整できるようにすることで,戦略の安定性を大幅に向上させることができる.
機械学習を導入する: 機械学習アルゴリズムを使用して,大量の歴史的データを分析し,移動平均とADXのパラメータを決定し,価格の将来の動きを予測することもできます. これは,移動平均戦略の進化の方向です.
クロスサイクル最適化: 異なる取引周期のパラメータ設定は異なるが,各周期のパラメータの最適配置をテストすることができる.
双移動平均トレンドトラッキング戦略は,全体として,成熟した安定した戦略思路である。この戦略は,双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)))