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

作者: リン・ハーンチャオチャン, 日付: 2023-11-23 13:38:02
タグ:

img

概要

移動平均クロスオーバー戦略は,移動平均をベースとした取引戦略である. 移動平均と緩やかな移動平均のクロスオーバーを買い・売る信号として使用する. 速いMAが下から緩やかなMAを超えると,買い信号が生成される. 速いMAが上から緩やかなMAを下に突破すると,売り信号が生成される.

戦略の論理

この戦略は,SMA関数を使用して,Fast MAとSlow MAとして指定された期間の単純な移動平均を計算します.デフォルトのFast MA期間は18日で,パラメータによって調整できます.

低速MAが低速MAの上を横切ると,クロスアンダー関数はクロスオーバー信号を検知し,購入信号を生成する.高速MAが低速MAの下を横切ると,クロスオーバー関数はクロスオーバー信号を検知し,販売信号を生成する.

この戦略は,トラックシグナルと出口シグナルを通じて自動取引を実現する. 速いMAが遅いMAを超えるとロングエントリーが起動し,速いMAが遅いMAを下回るとショートエントリーが起動する. 対応する出口シグナルも逆クロスオーバーで生成される.

利点分析

  • 移動平均値は,トレンドを効果的に追跡し,価格の勢いを把握する能力を持っています.
  • MA戦略は単純で直接的で,理解し実行するのが簡単です
  • パラメータは,異なる市場環境に適応するために最適化できます
  • この戦略は手動的な介入なしに取引を自動化し,取引コストを削減します

リスク と 解決策

  • 価格の振動は複数の誤った信号と高い取引頻度を引き起こす可能性があります.追加のフィルターはこれを防ぐことができます.
  • パラメータ最適化は極めて重要であり,パフォーマンスに大きな影響を与える可能性があります.バックテスト最適化と適応型MAは役立ちます.
  • 欠けている信号の危険性がある.他の指標は,取引信号をフィルターまたは補完するために組み合わせられる.
  • ストップロスは単一の取引損失を制御できます

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

  • 適応型移動平均値は,よりよい追跡のためにMAパラメータを動的に調整するために使用できます.
  • トレンドが不透明なときに 取引量などの追加のフィルターは 誤った信号を避けることができます
  • フィルターや補完条件としてボリンジャー帯のような他の指標を組み合わせることで 戦略のパフォーマンスを改善できます
  • ストップロスの戦略は,単一の取引損失を許容できる水準で制御する.

結論

MAクロスオーバー戦略は,クラシックでシンプルなトレンドフォロー戦略である.主にMASクロスオーバーを簡単な論理と実装で取引信号として使用する.パラメータチューニングを通じて適応することができる.しかし,振動やトレンド逆転,高い信号周波数などへの易感性などの欠点も有する.これらのフィルター,ダイナミックパラメータ,ストップ損失などによって改善することができる.この戦略には広範な最適化空間と方向性があり,基本的な定量的な取引戦略の1つです.


/*backtest
start: 2023-11-15 00:00:00
end: 2023-11-17 04:00:00
period: 30m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title = "MA Close Strategy", shorttitle = "MA Close",calc_on_order_fills=true,calc_on_every_tick =true, initial_capital=21000,commission_value=.25,overlay = true,default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

MASource   = input(defval = open, title = "MA Source")
MaLength   = input(defval = 18, title = "MA Period", minval = 1)

StartYear = input(2018, "Backtest Start Year")
StartMonth = input(1, "Backtest Start Month")
StartDay = input(1, "Backtest Start Day")
UseStopLoss = input(true,"UseStopLoss")
stopLoss = input(50, title = "Stop loss percentage(0.1%)") 

window() => time >=  timestamp(StartYear, StartMonth, StartDay,00,00) ? true : false

MA = sma(MASource,MaLength)

plot(MA, title = "Fast MA", color = green, linewidth = 2, style = line, transp = 50)

long = crossunder(MA, close)
short = crossover(MA, close)

if (long)
    strategy.entry("LongId", strategy.long, when = long)
    strategy.exit("ExitLong", from_entry = "LongId", when = short)

if (short)
    strategy.entry("ShortId", strategy.short, when = short)
    strategy.exit("ExitShort", from_entry = "ShortId", when = long)

if (UseStopLoss)
    strategy.exit("StopLoss", "LongId", loss = close * stopLoss / 1000 / syminfo.mintick)
    strategy.exit("StopLoss", "ShortId", loss = close * stopLoss / 1000 / syminfo.mintick)


もっと