SMA移動平均のクロスオーバー戦略

作者: リン・ハーンチャオチャン開催日:2024年3月28日 17:50
タグ:

img

概要

この戦略は単純なSMA移動平均クロスオーバー戦略である.異なる長さの2つのシンプルムービング平均 (SMA) を使用する.速いMAが遅いMAを超えると,ロングポジションに入る.速いMAが遅いMAを下回ると,ロングポジションを閉じる.二つのMAの長さはカスタマイズできる.また,バックテストのための開始日と終了日.

この戦略の主なアイデアは,移動平均値のトレンド特性とMAクロスオーバーのシグナル特性を取引に使用することです. 速いMAがスローMAよりも高くなった場合,上昇傾向を示し,ロングポジションを保持する必要があります. 速いMAがスローMAよりも低くなった場合,低下傾向を示し,ポジションを保持しないでください.

戦略原則

  1. 異なる長さの2つのSMAを計算し,それをカスタマイズできます
  2. 現在の時間がバックテストウィンドウ内にあるかどうかを確認します.そうでない場合は何もしません.
  3. 速いMAが遅いMAを超えると,ロングポジションを入力します.
  4. 急速なMAが遅いMAを下回る場合は,すべてのロングポジションを閉じる.
  5. 他の場合は じっとして何もしない

利点分析

  1. シンプルで分かりやすい 論理が明瞭で 初心者が学習して使うのに適しています
  2. 移動平均は広く使用されている技術指標で,現在の市場傾向をよく反映できる明らかな傾向特性を有します.
  3. MAクロスオーバーは,トレンドの変化を迅速に把握できる典型的なトレンドフォロー信号です.
  4. MA の長さとバックテストの窓は,良い柔軟性を提供することで,カスタマイズすることができます.
  5. 強いトレンド特性を有する楽器やタイムフレームに適しています.

リスク分析

  1. 移動平均値には一定の遅れがあります.市場が大きく変動し,傾向が頻繁に逆転すると,頻繁にクロスオーバー信号が発生し,過剰な取引と取引コストの増加につながる可能性があります.
  2. この戦略は上向きの傾向のみを捉えることができ,範囲に限定された市場と下向きの傾向では無力です.
  3. MA パラメータの選択は,異なる機器と時間枠に最適化する必要があります.異なるパラメータは,パフォーマンスに大きな差があります.
  4. この戦略にはストップ・ロスの対策はありませんし,市場が劇的に変動するときに,引き上げリスクが大きくなります.

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

  1. ATRベースのトライルストップなどの適切なストップ・ロスの追加を検討し,単一の取引の最大損失を制御する.
  2. 偽信号をフィルタリングするために,取引量や変動などのフィルタリング条件を追加してみてください.
  3. 最適なパラメータの組み合わせを見つけるために 遺伝アルゴリズムや他のインテリジェントアルゴリズムを使うような パラメータを最適化することを検討します
  4. 戦略の信頼性と有効性を向上させるために,MACDとRSIなどの他の技術指標や取引信号をMAクロスオーバーと組み合わせることを検討する.

結論

SMA移動平均クロスオーバー戦略は,学習と使用に適した,シンプルでわかりやすい,古典的で実践的なトレンドフォロー戦略である.移動平均のトレンド特性とMAクロスオーバーの信号特性を活用して,市場のトレンドの変化を迅速に把握する.しかし,この戦略には,遅れ,頻繁な取引,ストップロスの欠如などのいくつかの制限とリスクもあります.したがって,実践的な応用では,戦略の安定性と収益性を高めるために,特定の条件に応じて適切に最適化され改善する必要があります.


/*backtest
start: 2023-03-22 00:00:00
end: 2024-03-27 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © j0secyn

//@version=5
strategy("MA Cross", overlay=true, margin_long=100, margin_short=100, default_qty_value=100, default_qty_type=strategy.percent_of_equity, initial_capital=10000)

// === INPUT BACKTEST RANGE ===
fromDay   = input.int(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input.int(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear  = input.int(defval = 2018,title = "From Year", minval = 1970)
thruDay   = input.int(defval = 30, title = "Thru Day", minval = 1, maxval = 31)
thruMonth = input.int(defval = 9, title = "Thru Month", minval = 1, maxval = 12)
thruYear  = input.int(defval = 2024, title = "Thru Year", minval = 1970)

slow_ma_length = input.int(defval = 100, title = "Slow MA lenght")
fast_ma_length = input.int(defval = 30, title = "Fast MA lenght")

// === FUNCTION EXAMPLE ===
start     = timestamp(fromYear, fromMonth, fromDay, 00, 00)            // backtest start  window
finish    = timestamp(thruYear, thruMonth, thruDay, 23, 59)            // backtest finish window
window()  => true

// === LOGIC ===
crossOv = ta.crossover(ta.sma(close, fast_ma_length), ta.sma(close, slow_ma_length))
crossUn = ta.crossunder(ta.sma(close, fast_ma_length), ta.sma(close, slow_ma_length))

// === EXECUTION ===
// strategy.entry("L", strategy.long, when = window() and crossOv)        // enter long when "within window of time" AND crossover
// strategy.close("L", when = window() and crossUn)                       // exits long when "within window of time" AND crossunder         
strategy.entry("L", strategy.long, when = window() and crossOv)        // enter long when "within window of time" AND crossover
strategy.close("L", when = window() and crossUn)                       // exits long when "within window of time" AND crossunder         

もっと