エーラーズ 瞬間のトレンドライン戦略

作者: リン・ハーンチャオチャン開催日:2023年12月20日16時05分
タグ:

img

概要

エーラーズ即時トレンドライン戦略は,ジョン・エーラーズが著書"株式と先物に対するサイバー分析"で提案したものです.これは,技術指標を使用して,株/先物に関するリアルタイムトレンドとトレンドが逆転するときにオープンポジションを特定します.

戦略の論理

この戦略の核は即時トレンドライン (IT) の計算である.ITの公式は:

it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]

この式は,価格を滑らかにし,トレンドを生成できる二次順位フィルターです.

もう一つの重要な指標は遅延線で,以下のように計算されます.

lag = 2.0 * it - nz(it[2])

遅延線はIT線を1バー遅れている.価格が遅延線を超えると,上向きのブレイクをシグナルします.

さらに,戦略はリスク管理のためにストップ・ロスの注文を設定します.

利点分析

この戦略の利点は以下の通りです.

  1. IT ラインは,ノイズを効果的にフィルタリングし,信号品質を改善します
  2. 2番目のオーダーフィルタは,より多くの調節柔軟性と強度を提供します
  3. 遅延線はトレンド内の不必要なウィプソウを回避します
  4. 既定レベルでのリスクを制御するストップ損失を組み込む
  5. シンプルなコード構造,理解し変更が簡単

リスク分析

この戦略にはいくつかのリスクもあります:

  1. IT/レイグラインのパラメータ調節が正しくない場合,誤った信号が生じる可能性があります.
  2. 誤ったストップ損失設定は,早速ストップアウトまたは過大損失を引き起こす可能性があります.
  3. 高い取引頻度は,累積された手数料につながります.
  4. 長時間保持すると損失拡大リスクが高まります

これらのリスクは以下によって軽減できます.

  1. パラメータ最適化のために機械学習を適用する
  2. 調整可能なストップ損失レベル設定
  3. 取引頻度を低くするためにポジションサイズを減らす
  4. 保持期間のストップ損失を含む

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

この戦略は,次の側面でさらに最適化できます.

  1. 最適値を見つけるために異なるフィルターパラメータの試験影響
  2. 他の指標を組み合わせてシグナルをフィルタリングしてみてください
  3. トレンド加速段階のサイズアップのためにエントリーロジックを改善する
  4. 市場変動に基づいて適応型ストップ損失を設定する
  5. 取引セッションと頻度に関する時間系列分析を行う

結論

概して,エーラーズ即時トレンドライン戦略は,株式/先物およびトレンドが逆転するときにオープンポジションのリアルタイムトレンドを特定するために技術指標を使用する.効果的なノイズフィルタリング,高いパラメータチューニング,明確な信号生成論理,および組み込まれたリスク制御の利点があります.パラメータ選択,信号フィルタリング,ポジションサイズ化,ストップ損失チューニングのさらなる最適化により,この戦略はさらに優れたパフォーマンスを達成できます.明確なコード構造により,理解し変更することも簡単です.要約すると,これはテストと改善に値する効率的なトレンドフォローシステムです.


/*backtest
start: 2022-12-13 00:00:00
end: 2023-12-19 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy("Ehlers Instantaneous Trendline Strategy", shorttitle = "Ehlers Instantaneous Trendline Strategy", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, backtest_fill_limits_assumption = 1)
src = input(hl2, title="Source")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
it = na
if (na(it[2]) or na(it[1]))
    it := (src + 2 * src[1] + src[2]) / 4.0
else
    it := (a-((a*a)/4.0))*src+0.5*a*a*src[1]-(a-0.75*a*a)*src[2]+2*(1-a )*it[1]-(1-a )*(1-a )*it[2]
lag = 2.0 * it - nz(it[2])
rngFrac = input(0.35)
revPct = input(0.015)
stopType = input(title="Stop type", defval = "stop-order", options = ["stop-order", "market-order", "None"])

diff = input(0.5, title = "Spread")
LongPrice(p) =>
    LongPrice = diff == 0 ? p : floor(p / diff) * diff

ShortPrice(p) =>
    ShortPrice = diff == 0 ? p : ceil(p / diff) * diff

strategy.cancel_all()
reverseTrade = false
if stopType == "market-order" 
    if  strategy.position_size > 0 and close < strategy.position_avg_price * (1 - revPct) 
        strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, limit = close - 2 * diff)
        reverseTrade := true
    if  strategy.position_size < 0 and close > strategy.position_avg_price * (1 + revPct) 
        strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, limit = close + 2 * diff)
        reverseTrade := true
    
if lag > it and not reverseTrade
    price = LongPrice(max(close - (high - low) * rngFrac, low))
    if strategy.position_size <= 0
        strategy.order("Open long", strategy.long, strategy.equity / price - strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.short, 2 * strategy.equity / price, stop = ShortPrice(price * (1 - revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.short, 2 * strategy.position_size, stop = ShortPrice(strategy.position_avg_price * (1 - revPct)))
if lag < it and not reverseTrade
    price = ShortPrice(min(close - (high - low) * rngFrac, high))
    if strategy.position_size >= 0
        strategy.order("Open short", strategy.short, strategy.equity / price + strategy.position_size, limit = price)
        if stopType == "stop-order"
            strategy.order("StopLoss open short", strategy.long, 2 * strategy.equity / price, stop = LongPrice(price * (1 + revPct)))
    else
        if stopType == "stop-order"
            strategy.order("StopLoss open long", strategy.long, -2 * strategy.position_size, stop = LongPrice(strategy.position_avg_price * (1 + revPct)))


itPlot=plot(it, color=red, linewidth=1, title="Trend")
lagPlot=plot(lag, color=blue, linewidth=1, title="Trigger")
fill(itPlot, lagPlot, it < lag ? green : red,  transp=70)

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(9, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

もっと