リキュルシブ・モメンタム・トレーディング・戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-31 16時56分31秒
タグ:

img

概要

この戦略は,アレクスグローバーによって開発されたリキュリブバンド指標に基づいたトレンドフォローとブレイクアウト戦略である.低周波でも高品質のエントリー信号を達成するために,誤ったブレイクアウトをフィルタリングするためにモメント条件と組み合わせて,価格動向と主要なサポート/レジスタンスレベルを決定するためにリキュリブバンド指標を使用する.

戦略の論理

リキュルシブバンド指標の計算

リキュルシブ・バンド指標は,上部帯,下部帯,中部線で構成され,以下のように計算されます.

上部帯 = 最大 ((前行の上部帯, 閉じる価格 + n波動性 低帯分 = Min (前回のバーの低帯分,閉じる価格 - n)波動性 中間線 = (上部帯 + 下部帯)/2

ここで n はスケーリング係数であり,波動性は ATR,標準偏差,平均真域または特別な RFV 方法から選択することができます.長度パラメータは感度を制御し,より大きな値は指標がより頻繁に起動しないようにします.

取引規則

この戦略では,まず,下帯と上帯が同じ方向に動いているかどうかを確認し,偽のブレイクを避ける.

価格が下帯を下回ると,ロングで 上帯を下回るとショートで

さらに,ストップ・ロスの論理も実装されています.

利点分析

この戦略の利点は次のとおりです.

  1. 復習計算を避けるため,再帰的枠組みを用いた効率的な指標計算
  2. 柔軟なパラメータ調整により,異なる市場体制に適応
  3. トレンドとブレイクを組み合わせて,偽ブレイクを避ける
  4. モメントコンディションフィルターは信号品質を保証します

リスク分析

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

  1. パラメータの設定が正しくない場合,過剰取引や信号品質の低下を引き起こす可能性があります.
  2. 主要なトレンドの変化で大きな損失に直面する可能性があります.
  3. 極端な動きで不十分な滑り制御は,損失を増幅する可能性があります

これらのリスクは,パラメータの最適化,ストップ損失の実施,滑り値の上昇などによって管理できます.

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

戦略をさらに最適化するためのいくつかの方向性:

  1. 安定性のための複数の時間枠の指標を組み込む
  2. 適応パラメータ最適化のための機械学習モジュールを追加
  3. 最適なパラメータ組み合わせを見つけるために定量的な相関分析を行う
  4. ディープラーニングを使用して価格経路を予測し,信号精度を向上させる

結論

概要すると,これは非常に実用的で効率的なトレンドフォロー戦略である.計算効率のための再帰的フレームワークを組み合わせ,主要なトレンドを決定するためにトレンドサポート/レジスタンスを使用し,偽のブレイクをフィルターし,信号品質を確保するためにモメント条件を追加する.適切なパラメータチューニングとリスク制御により,良い結果を達成することができます.より複雑な市場体制に適応するためにさらなる研究と最適化に値します.


/*backtest
start: 2023-12-01 00:00:00
end: 2023-12-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// @version=5
// Original indicator by alexgrover
strategy('Extended Recursive Bands Strategy', overlay=true, commission_type=strategy.commission.percent,commission_value=0.06,default_qty_type =strategy.percent_of_equity,default_qty_value = 100,initial_capital =1000)
length = input.int(260, step=10, title='Length')
src = input(close, title='Source')
method = input.string('Classic', options=['Classic', 'Atr', 'Stdev', 'Ahlr', 'Rfv'], title='Method')
bandDirectionCheck = input.bool(true, title='Bands Hold Direction')
lookback = input(3)
//----
atr = ta.atr(length)
stdev = ta.stdev(src, length)
ahlr = ta.sma(high - low, length)
rfv = 0.
rfv := ta.rising(src, length) or ta.falling(src, length) ? math.abs(ta.change(src)) : rfv[1]
//-----
f(a, b, c) =>
    method == a ? b : c
v(x) =>
    f('Atr', atr, f('Stdev', stdev, f('Ahlr', ahlr, f('Rfv', rfv, x))))
//----
sc = 2 / (length + 1)
a = 0.
a := math.max(nz(a[1], src), src) - sc * v(math.abs(src - nz(a[1], src)))
b = 0.
b := math.min(nz(b[1], src), src) + sc * v(math.abs(src - nz(b[1], src)))
c = (a+b)/2

// Colors
beColor = #675F76
buColor = #a472ff

// Plots
pA = plot(a, color=color.new(beColor, 0), linewidth=2, title='Upper Band')
pB = plot(b, color=color.new(buColor, 0), linewidth=2, title='Lower Band')
pC = plot(c, color=color.rgb(120,123,134,0), linewidth=2, title='Middle Band')
fill(pC, pA, color=color.new(beColor,90))
fill(pC, pB, color=color.new(buColor,90))

// Band keeping direction
// By Adulari
longc = 0
shortc = 0
for i = 0 to lookback-1
    if b[i] > b[i+1]
        longc:=longc+1
    if a[i] < a[i+1]
        shortc:=shortc+1
bhdLong = if bandDirectionCheck
    longc==lookback
else
    true
bhdShort = if bandDirectionCheck
    shortc==lookback
else
    true

// Strategy
if b>=low and bhdLong
    strategy.entry(id='Long',direction=strategy.long)
if high>=a and bhdShort
    strategy.entry(id='Short',direction=strategy.short)

// TP at middle line
//if low<=c and strategy.position_size<0 and strategy.position_avg_price>close
    //strategy.exit(id="Short",limit=close)
//if high>=c and strategy.position_size>0 and strategy.position_avg_price<close
    //strategy.exit(id="Long",limit=close)

もっと