エルスインスタントトレンドライン戦略


作成日: 2023-12-20 16:51:05 最終変更日: 2023-12-20 16:51:05
コピー: 0 クリック数: 938
1
フォロー
1621
フォロワー

エルスインスタントトレンドライン戦略

概要

エラーズ即時トレンドライン戦略は,ジョン・エラーズが彼の書帳の株式と期貨の制御分析で提唱したものです. この戦略は,技術指標を使用して,株式または期貨の即時トレンドを認識し,トレンドが逆転したときにポジションを開きます.

戦略原則

この戦略の核心は,即時トレンドラインを計算することである. 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]

srcは価格を表し,aは平滑因子で,デフォルト値は0.07である. この公式は価格を平滑させ,トレンドを生成する二次フィルターである.

もう1つの重要な指標は遅滞線 ((lag) である.計算式は以下のとおりである.

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

この線は,IT線に1サイクル遅れている.上線が遅れているとき,トレンドの逆転を意味する,多額;下線が遅れているとき,トレンドの逆転を意味する,空白を意味する.

リスク管理のためのストップ・ローンの設定も行われています.

優位分析

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

  1. IT線路のトレンド認識を利用して,市場騒音を効果的にフィルターし,信号の質を向上させる
  2. 2階フィルターを使用し,パラメータ最適化スペースが広く,調整性が高い
  3. トレンドで繰り返し平仓を回避するために,後退線と組み合わせて取引シグナルを生成する
  4. ストップ・ロースの1つのリスクを設定し,ストップ・ロースの割合を設定できます.
  5. コード構造は明確で,理解し,修正しやすい.

リスク分析

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

  1. ITラインと遅滞ラインのパラメータの不適切な設定は,誤信号を生成する可能性があります.
  2. ストップポイントの設定が不適切で,早すぎるストップまたは過剰なストップ
  3. 取引頻度が高く,取引コストが利益に影響する可能性がある
  4. 集中保有期間が長すぎると収益率に影響する magnification 効果

これらのリスクは以下の方法で軽減できます.

  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()