ダブルEMAゴールデンクロスとデスクロストレンドフォロー戦略


作成日: 2024-02-29 11:45:42 最終変更日: 2024-02-29 11:45:42
コピー: 0 クリック数: 647
1
フォロー
1621
フォロワー

ダブルEMAゴールデンクロスとデスクロストレンドフォロー戦略

概要

双EMA金叉死叉トレンド追跡戦略は,双EMA指標を使用して価格トレンドの方向を判断する量化取引戦略である.この戦略は,金叉と死叉の信号を組み合わせた2つの異なるパラメータのEMA指標を計算することによって価格トレンドを判断する.より短いEMAの上部に長いEMAを通過すると買取信号が生じ,より短いEMAの下部に長いEMAを通過すると売り信号が生じます.

戦略原則

この戦略の核心指標は,長い周期のEMA1と短い周期のEMA2の2つのグループである.EMA1のパラメータは21で,EMA2のパラメータは10である.戦略は,4時間の線で基準周期としてこの2つのグループを計算する.

短い周期EMA2で長い周期EMA1を突破すると,買入シグナルが生じます. これは,価格の短期トレンドが強くなって,上昇状態に入ることを意味します. 短い周期EMA2の下の長い周期EMA1を突破すると,販売シグナルが生じます. これは,価格の短期上昇傾向が中断され,下降状態に入ることを意味します.

誤差信号をフィルタリングするために,戦略は2つの金叉死叉指標を設定している.二つの指標が同時に信号を発信した場合のみ,対応する買入販売操作を誘発する.これは,価格の揺れによって引き起こされる誤った取引を効果的に減らすことができる.

優位分析

  • 二重EMA構造を使用すると,価格の中間短期トレンドの変化を効果的に捉え,トレンドの判断を実現することができる.
  • 2つのセットの金叉死叉指標のフィルターを追加することで,誤差信号を軽減し,価格の揺れによる不必要な取引を回避できます.
  • 4時間単位で計算された指標を用いて,高頻度の価格変動に対応できる.
  • 戦略の構造はシンプルでわかりやすく,理解しやすい実装で,量化取引の適用に適しています.

リスク分析

  • 二重EMA構造は,整合状況を判断する効果が悪い.長期の整合に遭遇すると,誤信号が生じます.
  • 4時間レベルの指標は突発的な出来事に対する反応に敏感ではない.重大な突発的なメッセージは,4時間以内に大きな事態を引き起こし,リスクを効果的に制御することはできません.
  • 戦略は基本情報と結びつけられていない技術指標のみに基づいています. 会社の基本が大きく変化した場合,技術指標は失効する可能性があります.

これらのリスクは以下の方法で制御できます.

  1. モデルポートフォリオを確立する.
  2. テキスト・感情分析などの手法と組み合わせて,重大突発事件を判断し,動的にポジションを調整する.
  3. 経済環境,政策,会社の基本面の変化,動的調整パラメータ

最適化の方向

この戦略はさらに改善できる余地があります.

  1. モデルポートフォリオを増やす. より多くの異なるパラメータの指標の組み合わせを構築し,戦略の安定性を高める.

  2. 止損メカニズムを増やす. 合理的な止損点を設定し,単一の損失を効果的に制御する.

  3. ダイナミックパラメータ最適化 異なる市場環境に応じてEMAのパラメータを自動的に最適化できます

  4. 機械学習技術と組み合わせて.Tensorflowなどのフレームワークを使用して,価格動向をリアルタイムで予測するモデルを訓練します.

要約する

双EMA金叉死叉トレンド追跡戦略は,シンプルで実用的なトレンド取引戦略である.双EMA指数を使用して,価格の中での短期トレンドを判断し,方向的な動きの機会を捉える.同時に,二つの金叉死叉フィルター指数と組み合わせて,誤差取引を減らすことができる.この戦略の構造はシンプルで,容易に実装され,量化取引アプリケーションに適している.継続的な最適化と改善により,戦略の優位性をさらに拡大し,安定した収益性を高める見通しがある.

ストラテジーソースコード
/*backtest
start: 2023-02-22 00:00:00
end: 2024-02-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3


/// Component Code Startt
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(1, "Backtest Stop Month")
testStopDay = input(1, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=bool, defval=false)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

strategy(title="Ema cross strat", overlay=true)
margin = input(true, title="Margin?")
Margin = margin  ? margin : false
resCustom = input(title="EMA Timeframe", defval="240" )
source = close,
len2 = input(21, minval=1, title="EMA1")
len3 = input(10, minval=1, title="EMA2")
ema2 = request.security(syminfo.tickerid,resCustom,ema(source,len2), lookahead=barmerge.lookahead_off)
ema3 = request.security(syminfo.tickerid,resCustom,ema(source,len3), lookahead=barmerge.lookahead_off)


mylong = crossover(ema3, ema2)
myshort = crossunder(ema3,ema2)

last_long = na
last_short = na
last_long := mylong ? time : nz(last_long[1])
last_short := myshort ? time : nz(last_short[1])

in_long = last_long > last_short ? 2 : 0
in_short = last_short > last_long ? 2 : 0

mylong2 = crossover(ema3, ema2)
myshort2 = crossunder(ema3, ema2)

last_long2 = na
last_short2 = na
last_long2 := mylong2 ? time : nz(last_long2[1])
last_short2 := myshort2 ? time : nz(last_short2[1])

in_long2 = last_long2 > last_short2 ? 0 : 0
in_short2 = last_short2 > last_long2 ? 0 : 0

condlongx =   in_long + in_long2
condlong = crossover(condlongx, 1.9)
condlongclose = crossunder(condlongx, 1.9)

condshortx =  in_short + in_short2
condshort = crossover(condshortx, 1.9)
condshortclose = crossover(condshortx, 1.9)




if crossover(condlongx, 1.9) and testPeriod() and strategy.position_size <= 0
    strategy.entry("Long", strategy.long, comment="Long")

if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size > 0    
    strategy.close("Long",when = not Margin)
    
if crossover(condshortx, 1.9) and testPeriod() and strategy.position_size >= 0
    strategy.entry("Short", strategy.short, comment="Short", when = Margin)