2つの移動平均のクロスオーバー取引戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-29 15:11:58
タグ:

img

概要

ダブル・ムービング・平均クロスオーバー・トレーディング・ストラテジー (Dual Moving Average Crossover Trading Strategy) は,エントリー・エグジット・シグナルを決定するために移動平均クロスオーバーを使用する定量的なトレーディング・戦略である.この戦略は,複数のフィルタリング層を作成し,より信頼性の高いトレード・シグナルのための偽信号を減らすために,異なるタイムフレームからの移動平均を組み合わせる.

戦略の論理

この戦略の主な論理は,3つのタイムフレーム (180分,60分,120分) で2つの移動平均値 (10日と200日) を追跡することである. 速い移動平均値が遅い移動平均値を超えると,金色のクロスオーバーが生成され,インストラムが上昇傾向にあることを示唆する. 速い移動平均値が遅い平均値を下回ると,死亡クロスオーバーが生成され,ダウントレンドを示唆する.

まず,10日間および200日間の移動平均値は,180分および60分間のタイムフレームで別々に計算されます. 180分間のタイムフレーム上の10日間のMAが200日間のMAを上回ると,ゴールデンクロスオーバー信号が生成されます. 下を横切ると,デスクロスオーバー信号が生成されます. これは高速サイクル取引信号を提供します.

次に,戦略は120分タイムフレームで200日MAを"制御"移動平均として導入する. 180/60分サイクルでクロスオーバーが発生するときにのみ,60分200日MAが120分200日MAの上または下にあるかどうかを確認することで,誤った信号をフィルタリングするために取引を行うべきかどうかを決定する.

例えば,180分サイクルのゴールデンクロスオーバーが起こる場合,60分200日MAが120分200日MAよりも上である場合にのみ,戦略はロングになります.この条件が満たされたときにのみロングポジションが開かれます.逆に,60分200日MAが120分MA以下であれば,ロングポジションは取れません.

要するに,異なる時間枠における移動平均関係を比較することで,この戦略は信号信頼性を向上させるために複数の層のフィルタリングを作成し,フィルターベースの取引戦略の一般的なタイプになります.

利点

  • マルチタイムフレーム確認による精度向上.単一のタイムフレーム信号と比較して,180/60/120分からのMAを使用すると,誤った信号が劇的に減少し,取引信号の品質が向上します.

  • 合理的な操作頻度.高周波戦略とは異なり,この戦略は頻繁に取引が少なく,継続的な市場監視の必要性を回避する.手動取引に適しています.

  • シンプルで理解しやすい.複雑な論理なしで基本的な移動平均値のみを使用することで,この戦略は入場障壁が低く,初心者にとって理解が容易です.

  • 期間とパラメータにわたって最適化可能.使用されるMAタイプと期間は調整可能である.異なる製品と市場体制のために異なるパラメータセットをテストすることができる.

リスク

  • 遅滞の兆候と遅い反応.コア移動平均は設計的に遅滞しており,しばしば急速なトレンド逆転を捉えることができない.

  • 市場が変動しているとき,MA関係が非常に頻繁に交差し,過剰なエントリーとストップ損失を誘発し,コストと損失リスクを高めることがあります.

  • パラメータ最適化による過剰なフィッティングの危険性.アルファは主に限られたデータセットに基づくパラメータチューニングから生じる.これは過剰な最適化や過剰なフィッティングの問題につながる可能性があります.

解決策:

  • MA 期間を短縮し,反応が早くなる
  • 市場が動揺しているときに過剰なエントリを避けるためにフィルターを追加します
  • 異なる製品と時間帯における耐久性を試験する

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

さらに最適化できる余地があります.

  • ブルートフォース最適化や機械学習技術によって より良いパラメータを見つけるために 異なる時間枠の組み合わせを試して MA期間を調整します

  • 追加的な信号確認のために,ボリュームとより長いタイムフレームの傾向分析を組み込む.例えば,取引量が少ないときにエントリを避ける.

  • RNNのようなディープラーニングモデルを使って 曲線パターンを事前に予測し 意思決定を支援します

  • フィルタリングロジックを改善するために適応性移動平均を導入する.市場不確実性中にエントリを減らすためにMA期間を動的に調整する.

結論

ダブル・ムービング・平均クロスオーバー・トレーディング・ストラテジー (Dual Moving Average Crossover Trading Strategy) は,複数のタイムフレームにおける移動平均関係を比較して偽信号をフィルタリングし,信号の信頼性を向上させる.このタイプのフィルターベースのアルゴリズム戦略は,初心者にとって一般的で簡単に実装され,複数の次元で広範な最適化も可能であり,研究し適用する価値があります.


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

//@version=3
strategy(shorttitle = "ALGO 3-1-2", title="ALGO 3h, 1h, 2h", overlay=true)

bool startLONGBOTandDEAL = false
bool stopLONGBOTandDEAL = false
bool openLONG = false
bool closeLONG = false
bool startSHORTBOTandDEAL = false
bool stopSHORTBOTandDEAL = false
bool openSHORT = false
bool closeSHORT = false

MA1Period = ema(close, 10)
MA2Period = ema(close, 200)
MA3Period = ema(close, 200)

MA1 = security(syminfo.tickerid, "180", MA1Period)
MA2 = security(syminfo.tickerid, "60", MA2Period)
MA3 = security(syminfo.tickerid, "120", MA3Period)

MA12Crossover = crossover(MA1, MA2)
MA12Crossunder = crossunder(MA1, MA2)
MA23Crossover = crossover(MA2, MA3)
MA23Crossunder = crossunder(MA2, MA3)

if MA23Crossover
    startLONGBOTandDEAL := true //stop shortBOT and DEAL code in the TV alert as well, probably stop first w/ a delay on startlong
    lblBull = label.new(bar_index, na, ' BULL Time Open LONG', color=color.blue, textcolor=color.black, style=label.style_label_up, size=size.small)
    label.set_y(lblBull, MA2)  
    strategy.close("go Short")
    strategy.entry("go Long", strategy.long, comment="go Long")
if MA23Crossunder
    //not sure if i should set alert for stop and start each bot, or just put start appropriate bot and stop its opposite in the same alert.
    startSHORTBOTandDEAL := true
    lblBull = label.new(bar_index, na, ' BEAR Time - Open SHORT', color=color.orange, textcolor=color.black, style=label.style_label_down, size=size.small)
    label.set_y(lblBull, MA2)
    strategy.close("go Long")
    strategy.entry("go Short", strategy.short, comment="go Short")
if MA12Crossover
    if MA2 >= MA3
        openLONG := true
        lup1 = label.new(bar_index, na, ' OPEN LONG ', color=color.green, textcolor=color.white, style=label.style_label_up, size=size.small, yloc=yloc.belowbar)
        strategy.entry("go Long", strategy.long, comment="go Long")
    if MA2 <= MA3
        closeSHORT := true
        lup1 = label.new(bar_index, na, ' CLOSE SHORT ', color=color.gray, textcolor=color.black, style=label.style_label_up, size=size.small, yloc=yloc.belowbar)
        strategy.close("go Short")
    
if MA12Crossunder
    if MA2 >= MA3
        closeLONG := true
        lun1 = label.new(bar_index, na, ' CLOSE LONG ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar)
        strategy.close("go Long")
    if MA2 <= MA3
        openSHORT := true
        lun1 = label.new(bar_index, na, ' OPEN SHORT ', color=color.red, textcolor=color.white, style=label.style_label_down, size=size.small, yloc=yloc.abovebar)
        strategy.entry("go Short", strategy.short, comment="go Short")


plot(MA1, color=color.green, linewidth=2, title="MA1")
plot(MA2, color=color.yellow, linewidth=3, title="MA2")
plot(MA3, color=color.red, linewidth=4, title="MA3")


alertcondition(startLONGBOTandDEAL, title="Start LONG BOT and DEAL", message="Start Long Bot and Deal")
alertcondition(stopLONGBOTandDEAL, title="Stop LONG BOT and DEAL", message="Stop Long Bot and Deal")
alertcondition(openLONG, title="Open LONG DEAL", message="Open Long Deal")
alertcondition(closeLONG, title="Close LONG DEAL", message="Close Long Deal")
alertcondition(stopSHORTBOTandDEAL, title="Stop SHORT BOT and DEAL", message="Stop Short Bot and Deal")
alertcondition(openSHORT, title="Open SHORT DEAL", message="Open Short Deal")
alertcondition(closeSHORT, title="Close SHORT DEAL", message="Close Short Deal")

もっと