2重移動平均戦略

作者: リン・ハーンチャオチャン開催日:2024年11月17日17時45分45秒
タグ:

img

概要

この戦略は,2つの移動平均値,特に8期と21期を採用する.より短いMAがより長いMAを横切るときに長い信号,より短いMAがより長いMAを下回るときに短い信号を生成する.

この戦略は,移動平均線の傾きを組み込み,トレンドではない時期をフィルターし,トレンドがより顕著であるときにのみシグナルを出します.

原則

この戦略の核心は,短期間の移動平均値と長期間の移動平均値のクロスオーバーにあります.より短いMAは傾向の変化をより速く捉えることができ,より長いMAはノイズフィルタリング効果が優れています.より短いMAがより長いMAを横切ると,長い信号につながる.より短いMAがより長いMAを横切って,短い信号につながる場合,上昇傾向の確立が提案されています.

この戦略では,傾斜の値も設定する.傾斜が正の値よりも大きいときのみ,ロング信号が生成される.傾斜が負の値よりも小さいときのみ,ショート信号が生成される.これは,顕著なトレンドが存在しないゾーンをフィルタリングするのに役立ちます.その結果,より質の高い取引信号が生成されます.

取引シグナルを生成する論理は,

  1. 8 期と 21 期の単純な移動平均を計算する
  2. 2つの間のクロスオーバー信号を検出
  3. arctangent関数 atan を使って 21 期間の移動平均線の傾斜を計算する
  4. 傾きが前もって設定された正値を超えるとのみ長信号を生成する
  5. 傾きが既定のマイナス値を下回る場合にのみ短信号を生成する.

利点分析

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

  1. 戦略のアイデアは単純で理解し/実行しやすい
  2. 傾斜指数を組み込むことで,トレンドではない期間をフィルタリングし,信号品質を改善します.
  3. 二重移動平均を使用することで,両者の強みを発揮し,安定性を向上させる
  4. パラメータは,異なる取引手段に合わせて調整できます.
  5. シンプルなプログラム実装は,さらなる最適化を促進します

リスク分析

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

  1. 激しい市場変動の間,より多くの誤った信号が発生する可能性があります.
  2. クロスオーバー自体も 誤った信号を出す傾向があります
  3. 傾向の逆転を即座に把握できない.

これらのリスクに基づいて最適化する方法:

  1. 市場特性に合わせてMAパラメータを調整する
  2. 傾斜の限界を最適化して強さを向上させる
  3. 単一の損失を制御するストップ損失メカニズムを追加する
  4. シグナルをフィルターする他の指標を組み込む
  5. 安定性を向上させるための適応パラメータ設定を使用

オプティマイゼーションの方向性

戦略を最適化するためのいくつかの方向性:

  1. 適応型MAsを使用し,波動性に基づいてパラメータを調整する
  2. 統合中にエラーを避けるため,容量分析を組み込む
  3. 品質とタイミングを向上させるため,変動指数を追加する
  4. 自動パラメータ最適化のための機械学習を追加
  5. より複雑な非線形パターンを発見するために深層学習を活用する

結論

概要すると,このダブルMA戦略はシンプルで実用的です. 2つの期間パラメータを通じて異なるトレンド特性を捕捉し,それらを組み合わせて取引信号を生成します. 一方,傾斜値を取り入れることで信号品質が向上します.この戦略は拡張のための基本的であり,十分な最適化スペースと可能性があります.


/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 10m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//written by sixpathssenin
//@version=4
strategy(title="Dual Moving Average",initial_capital=10000,overlay=true)

ma1= sma(close,8)
ma2= sma(close,21)

angleCriteria = input(title="Angle", type=input.integer, defval=7, minval=1, maxval=13)

i_lookback   = input(2,     "Angle Period", input.integer, minval = 1)
i_atrPeriod  = input(10,    "ATR Period",   input.integer, minval = 1)
i_angleLevel = input(6,     "Angle Level",  input.integer, minval = 1)
i_maSource   = input(close, "MA Source",    input.source)

f_angle(_src, _lookback, _atrPeriod) =>
    rad2degree = 180 / 3.141592653589793238462643  //pi 
    ang = rad2degree * atan((_src[0] - _src[_lookback]) / atr(_atrPeriod)/_lookback)
    ang
_angle = f_angle(ma2, i_lookback, i_atrPeriod)

plot(ma1,color=#FF0000)
plot(ma2,color=#00FF00)

crosso=crossover(ma1,ma2) 
crossu=crossunder(ma1,ma2)

_lookback = 15

f_somethingHappened(_cond, _lookback) =>
    bool _crossed = false
    for i = 1 to _lookback
        if _cond[i]
            _crossed := true
    _crossed
    
longcrossed = f_somethingHappened(crosso,_lookback)
shortcrossed = f_somethingHappened(crossu,_lookback)

long = longcrossed and _angle > angleCriteria
short= shortcrossed and _angle < -(angleCriteria)


if(long)
    strategy.entry("Long",strategy.long)
if(short)
    strategy.entry("short",strategy.short)
    


もっと