二重移動平均ゴールデンクロスとデスクロスアルゴリズム取引戦略


作成日: 2024-01-29 15:11:58 最終変更日: 2024-01-29 15:11:58
コピー: 0 クリック数: 590
1
フォロー
1617
フォロワー

二重移動平均ゴールデンクロスとデスクロスアルゴリズム取引戦略

概要

双均線金叉死叉アルゴリズム取引戦略 (Dual Moving Average Crossover Strategy) は,均線金叉と死叉を使用して入場と退出を判断する量化取引戦略である.この戦略は,異なる周期の均線を組み合わせて,複数のフィルターを形成し,偽信号を効果的に軽減し,取引信号の信頼性を向上させる.

戦略原則

この戦略の核心的な論理は,3つの時間周期 ((180分,60分,120分) の2つの移動平均 ((10日線と200日線) を追跡することである.速線が下方向から慢線を横切ると,金叉信号が生み出され,品種が多頭行進に進むことを表す.速線が上方向から下方向から慢線を横切ると,死叉信号が生み出され,品種が空頭行進に進むことを表す.

戦略は,まず,180分と60分周期で10日線と200日線を計算する.180分10日線が200日線を下方向から通過すると金叉信号が生じ,上方向から下方向から通過すると死叉信号が生じます.これは,高速周期の取引信号に相当します.

その後,戦略は120分周期の200日線を制御線として導入する.金叉またはデッドフォークが発生した場合にのみ,60分周期の200日線が120分周期の200日線より高いか低いか判断することによって取引を開始するかどうかを決定し,部分的な偽信号を排除する.

例えば,180分が金叉を生むとき,60分200日線が120分200日線より高いと多見する.この条件でしか多券が開かない.反対に,60分200日線が120分200日線より低いと多見せず,開かない.

要するに,この戦略は,異なる時間周期の均等な関係を比較して,複数のフィルターを形成し,信号の信頼性を高め,一般的なフィルター型取引戦略に属している.

戦略的優位性

  • 多周期確認,信号精度向上.単周期判断に比べて,この戦略は180分,60分および120分3周期の均線関係で確認し,偽信号を大幅に削減し,取引信号の質を向上させる.

  • 操作頻度は適中.高周波取引戦略と比較して,この戦略の取引頻度は低く,頻繁な操作を必要とせず,手動追記に適している.

  • シンプルで理解しやすい. この戦略は平均線指数のみを使用し,複雑なロジックはありません. 簡単に理解しやすい. 初心者のためのスリーブが低く,初心者のためのスリーブです.

  • 異なる周期とパラメータに応じて最適化することができる.この戦略の平均線周期とタイプは,異なる品種と市場環境に適したパラメータの組み合わせを研究するために調整することができる.

戦略リスク

  • 均線システムは遅滞しており,迅速な反転を間に合うように捉えることができない.この戦略は,主に均線関係に依存し,価格変化への反応には一定の遅滞があり,迅速な反転の動きを逃すのが容易である.

  • 大幅な振動市場では容易に止まる.市場が大きな振動が発生すると,均線関係が頻繁に交差し,頻繁にポジション開設と止まる結果となる.これは取引コストと損失のリスクを増やす.

  • パラメータ最適化に過度に依存し,過度に適合する.この戦略は,主にパラメータ最適化によってアルファを取得する.この単一データセットの結果への依存は,過度に最適化と過度に適合する問題を引き起こす可能性があります.

リスクに対応する解決策は以下の通りです.

  • 平均線パラメータを適切に短縮し,反応速度を加速する.

  • フィルタリング条件を増やして,波動的な市場での高頻度開設を回避する.

  • 異なる品種と時間帯のデータをテストし,パラメータの安定性を評価する.

戦略最適化の方向性

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

  • 異なる周期組合せと平均線参数を使って,より優れた参数を探します. 最小限の最適化と機械学習の方法によって,より優れた参数組合せを見つけることができます.

  • Volumeと大レベルのトレンド指標の確認を追加します.これは,偽の信号をさらにフィルターすることができます.例えば,Volumeの放出量が不足しているときにポジションを開かないことです.

  • ディープ・ラーニング・モデルの予測曲線形状を組み合わせる.RNNなどのディープ・ラーニング・モデルを使用して将来の価格を予測し,意思決定を支援する.

  • 適応均線を採用し,フィルタリングロジックを改善する.市場が震動状態に入るとき,均線の長さを動的に調整し,ポジション開設の頻度を低下させる.

要約する

双均線金叉死叉アルゴリズム取引戦略は,異なる時間周期の均線関係を比較して,複数のフィルタを確立し,取引信号の質を効果的に向上させることができる.これは,より一般的なフィルタ型アルゴリズム取引戦略である.この戦略は,簡単に実装し,初心者向けに学習し,また,多次元拡張と最適化が可能で,深入な研究と応用に値する.

ストラテジーソースコード
/*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")