ダブルモメンタムブレイクアウトとボラティリティフィルター定量戦略


作成日: 2023-12-22 12:01:21 最終変更日: 2023-12-22 12:01:21
コピー: 0 クリック数: 826
1
フォロー
1621
フォロワー

ダブルモメンタムブレイクアウトとボラティリティフィルター定量戦略

概要

この戦略は,主に,価格のダブルEMA動力とDEMA動力の交差を計算してトレンドを識別し,ATR波動率指数と組み合わせて偽の突破をフィルタリングすることで,ダブルマンス指数と波動率をフィルタリングした量化取引戦略を実現します.

戦略原則

この戦略は以下の部分から構成されています.

  1. 価格を計算するEMAとDEMAは,二重動量指標として用いられる.その中で,より長い周期のEMAは,長期のトレンドを反映し,DEMAはより敏感な短期動量指標として用いられる.DEMAの上にEMAを突破すると,買い信号が生成される.

  2. ATRの波動率指標を計算する.ATRの大きさによって市場の波動率と流動性を判断する.波動率が大きすぎると波動量指標の信号をフィルターし,偽突破を避ける.

  3. ATRの波動率は,移動平均をパラメータ化して判断する.ATRの波動率が移動平均より低いときは,動量指標の信号のトリガーが許可される.

  4. ATRの時間周期,ATRの長さ,ATR移動平均の種類と長さなどをパラメータで制御します.

  5. 多頭ポジションのストップ・ストップと追跡ストップの規則を確立する

優位分析

この二重EMAフィルタリングの戦略は,通常のEMA金叉死叉戦略の偽信号と頻繁な取引を大幅に減らすことができます.ATR波動率指標を追加すると,微細な波動による誤導信号を効果的にフィルタリングして,被套を避けることができます.

単一の動量指標と比較して,この戦略は二つの指標の設計を採用し,判断の効果を向上させることができる.より敏感な短期動量指標であるDEMAは,安定した長線EMAと組み合わせて,比較的に信頼性の高い組合せ信号を形成する.

ATRパラメータを調節することで,異なる標識の物体に対して適切な波動率条件を設定し,戦略の適用性を向上させることができる.

リスク分析

この戦略の最大のリスクは,パラメータを不適切に設定すると,取引信号が過少になる可能性があるということです. DEMAとEMAの長さが長すぎるとか,ATRの波動率の限界が過度に設定されると,戦略の実際の動作効果が弱まります.これは,繰り返しテストすることで最適なパラメータの組み合わせに調整する必要があります.

もう一つの潜在的なリスクは,極端な状況では,価格変動がATRパラメータの制限を突破して損失をもたらす可能性があることです.これは,市場異常を監視するために人為的に戦略の実行を一時停止する必要があります.

最適化の方向

  1. 異なる運動指数パラメータの組み合わせをテストし,最適なパラメータを見つけます.

  2. 動量指標を双EMAからMACDまたは他の指標に調整してみる.

  3. 全体の歴史ATR,市場変動率指数など,さまざまな変動率指標の設定をテストする.

  4. 取引量に対するフィルタリングを増やして,偽りの価格突破のリスクを回避する.

  5. 損失を抑える仕組みを最適化して,損失を優しくする.

要約する

この戦略は,動量指標と波動率分析を統合し,堅牢な理論の基礎で設計されている.パラメータ調整とルール最適化により,安定した信頼性の高い定量取引戦略になることができる.取引信号は明確で,リスクは制御可能で,試行錯誤の検証と適用に値する.

ストラテジーソースコード
/*backtest
start: 2023-11-21 00:00:00
end: 2023-12-21 00:00:00
period: 1h
basePeriod: 15m
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/
// © Qorbanjf

//@version=4
strategy("ORIGIN DEMA/EMA & VOL LONG ONLY", shorttitle="ORIGIN DEMA/EMA & VOL LONG", overlay=true)

// DEMA
length = input(10, minval=1, title="DEMA LENGTH")
src = input(close, title="Source")
e1 = ema(src, length)
e2 = ema(e1, length)
dema1 = 2 * e1 - e2
plot(dema1, "DEMA", color=color.yellow)

//EMA
len = input(25, minval=1, title="EMA Length")
srb = input(close, title="Source")
offset = input(title="Offset", type=input.integer, defval=0, minval=-500, maxval=500)
ema1 = ema(srb, len)
plot(ema1, title="EMA", color=color.blue, offset=offset)


// Inputs
atrTimeFrame = input("D", title="ATR Timeframe", type=input.resolution)
atrLookback = input(defval=14,title="ATR Lookback Period",type=input.integer)
useMA = input(title = "Show Moving Average?", type = input.bool, defval = true)
maType = input(defval="EMA", options=["EMA", "SMA"], title = "Moving Average Type")
maLength = input(defval = 20, title = "Moving Average Period", minval = 1)
//longLossPerc = input(title="Long Stop Loss (%)",
    // type=input.float, minval=0.0, step=0.1, defval=1) * 0.01
longTrailPerc = input(title="Trail stop loss (%)",
     type=input.float, minval=0.0, step=0.1, defval=50) * 0.01
longProfitPerc = input(title="Long Take Profit (%)",
     type=input.float, minval=0.0, step=0.1, defval=3000) / 100

// === INPUT BACKTEST RANGE ===
FromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2017, title = "From Year", minval = 2000)
ToMonth   = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 9999, title = "To Year", minval = 2017)


// ATR Logic // atrValue = atr(atrLookback) // atrp = (atrValue/close)*100 // plot(atrp, color=color.white, linewidth=2, transp = 30)

atrValue = security(syminfo.tickerid, atrTimeFrame, atr(atrLookback))
atrp = (atrValue/close)*100

// Moving Average Logic
ma(maType, src, length) =>
    maType == "EMA" ? ema(src, length) : sma(src, length) //Ternary Operator (if maType equals EMA, then do ema calc, else do sma calc)
maFilter = security(syminfo.tickerid, atrTimeFrame, ma(maType, atrp, maLength))

// variables for enter position
enterLong = crossover(dema1, ema1) and atrp < maFilter

// variables for exit position
sale = crossunder(dema1, ema1)

// stop loss
//longStopPrice  = strategy.position_avg_price * (1 - longLossPerc)

// trail stop
// Determine trail stop loss prices
longStopTrail = 0.0

longStopTrail := if (strategy.position_size > 0)
    stopValue = close * (1 - longTrailPerc)
    max(stopValue, longStopTrail[1])
else
    0
//Take profit Percentage
longExitPrice  = strategy.position_avg_price * (1 + longProfitPerc)

//Enter trades when conditions are met
strategy.entry(id="long",
 long=strategy.long,
 when=enterLong,
 comment="long")

//
strategy.close("long", when = sale, comment = "Sell")
//place exit orders (only executed after trades are active)

strategy.exit(id="sell",
 limit = longExitPrice,
 stop = longStopTrail,
 comment = "SL/TP")