定量的トレンドフォロー戦略


作成日: 2024-02-01 11:42:22 最終変更日: 2024-02-01 11:42:22
コピー: 0 クリック数: 524
1
フォロー
1617
フォロワー

定量的トレンドフォロー戦略

概要

この戦略は,ブリン帯,RSI,ADX,MACDなどの複数の指標を使用して,市場の傾向を判断し,強いトレンド識別能力を持っています.指標信号が同時にブルイッシュであるとき,追及策略を取ります.指標信号が同時にベアッシュであるとき,平仓ストップします.

戦略原則

  • ブリン帯は,価格がブリン帯の上線または下線近くにあるかどうかを判断するために使用され,トレンドが形成されているかどうかを判断するための基礎として使用されます.
  • RSIと結合して,超買い超売り領域にあるかどうかを判断し,偽突破を避ける
  • ADXでトレンドの強さを判断し,トレンドの強さがある場合にのみ信号を発信する
  • MACDを用いて短期と長期のトレンドの一致性を判断する
  • 指定された取引時間のみで取引する

複数の指標の組み合わせで判断し,価格トレンドを正確に識別し,トレンドが発生したときにタイムリーで追跡し,余剰収益を達成します.

優位分析

この戦略の最大の利点は,指標の組み合わせの判断がより包括的で正確であり,価格動向を効果的に識別し,単一の指標によって引き起こされる偽信号を回避することです.

具体的には,次の利点があります.

  1. ブリン帯は,価格の変動の範囲と弱さを判断します.
  2. RSIは超買区を避けるため,超売り区を売り込む
  3. ADXはトレンドの強さを判断し,強みだけを追う.
  4. MACDは,短線と長線が一致することを判断します.
  5. 取引時間を制限し,夜間取引を避ける

戦略の安定性を高めるため,偽信号を最大限に減らすために,指標の組み合わせを判断します.

リスク分析

この戦略の主なリスクは以下の通りです.

  1. 突発的な出来事により指標が機能しなくなった
  2. 震災は多くの偽信号を生成した.

リスク1では,複数の指標に依存しているため,単一の指標の失敗を一定程度に回避できるが,リスク管理の改善が必要である.

リスク2に合わせて,適切なパラメータを調整して,取引区間を縮小し,取引頻度を減らして,リスクを低減する.

最適化の方向

この戦略の改善策は以下の通りです.

  1. 移動止損,時間止損,突破止損などの止損メカニズムを追加し,過深な引き下げを避ける
  2. 最適化パラメータ,指数パラメータの組み合わせを調整し,最適なパラメータを探します.
  3. 小量の偽突破を避けるために,交差量フィルタのようなフィルタリング条件を追加する
  4. KDJ,OBVなど,より多くの指標と組み合わせて,信号の正確性を向上させる
  5. 機械学習によるパラメータの自動最適化

継続的な最適化により,戦略パラメータの強さを向上させ,偽信号の可能性を低減する.

要約する

この戦略は,全体的にトレンド信号を識別する能力があり,指標の組み合わせによって,価格トレンドを効果的に識別できます.

しかし,一定のリスクも存在し,風力制御機構を継続的に完善し,パラメータを継続的に最適化することで,長期にわたって安定した動作が可能になる.後期に機械学習などの方法が導入されれば,パラメータの自動最適化が可能になり,戦略の性および収益能力が大きく向上する.

ストラテジーソースコード
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 00:00:00
period: 5h
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/
// © abilash.s.90


dIMinusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementMinus = 0.0
    dIMinus = 0.0
    trueRange = 0.0
    directionalMovementMinus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementMinus := nz(low[1])-low > high-nz(high[1]) ? max(nz(low[1])-low, 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementMinus := nz(smoothedDirectionalMovementMinus[1]) - (nz(smoothedDirectionalMovementMinus[1])/adxLen) + directionalMovementMinus
    
    dIMinus := smoothedDirectionalMovementMinus / smoothedTrueRange * 100
    
    dIMinus

dIPlusCalc(adxLen) =>
    
    smoothedTrueRange = 0.0
    smoothedDirectionalMovementPlus = 0.0
    dIPlus =  0.0
    trueRange = 0.0
    directionalMovementPlus = 0.0
    
    trueRange := max(max(high-low, abs(high-nz(close[1]))), abs(low-nz(close[1])))
    directionalMovementPlus := high-nz(high[1]) > nz(low[1])-low ? max(high-nz(high[1]), 0): 0
    
    smoothedTrueRange := nz(smoothedTrueRange[1]) - (nz(smoothedTrueRange[1])/adxLen) + trueRange
    smoothedDirectionalMovementPlus := nz(smoothedDirectionalMovementPlus[1]) - (nz(smoothedDirectionalMovementPlus[1])/adxLen) + directionalMovementPlus
    
    dIPlus := smoothedDirectionalMovementPlus / smoothedTrueRange * 100
    
    dIPlus
    
    
Adx(adxLen) =>
    dIPlus =  0.0
    dIMinus = 0.0
    dX = 0.0
    aDX = 0.0
    dIPlus := dIPlusCalc(adxLen)
    dIMinus := dIMinusCalc(adxLen)
    dX := abs(dIPlus-dIMinus) / (dIPlus+dIMinus)*100
    aDX := sma(dX, adxLen)
    
    aDX
    
BarInSession(sess) => time(timeframe.period, sess) != 0


//@version=4
strategy("Bollinger Band + RSI + ADX + MACD", overlay=true)

//Session

session = input(title="Trading Session", type=input.session, defval="0930-1500")

sessionColor = BarInSession(session) ? color.green : na

bgcolor(color=sessionColor, transp=95)

// Bollinger Bands
src = input(high, title="Bollinger Band Source", type=input.source)
length = input(3, minval=1, type=input.integer, title="Bollinger Band Length")
mult = input(4.989, minval=0.001, maxval=50, step=0.001, type=input.float, title="Bollinger Band Std Dev")
basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev


plot(upper, title="Bollinger Band Upper", color=color.red)
plot(lower, title="Bollinger Band Lower", color=color.green)

// RSI
rsiSrc = input(close, title="RSI Source", type=input.source)
rsiLength = input(16, minval=1, type=input.integer, title="RSI Length")
rsiComparator = input(39.2, title="RSI Comparator", type=input.float, step=0.1)

rsi = rsi(rsiSrc, rsiLength)

// ADX
adxLength = input(14, minval=1, type=input.integer, title="ADX Length")
adxComparator = input(14, minval=1, type=input.integer, title="ADX Comparator")

adx = Adx(adxLength)

// Heikinashi

haClose = security(heikinashi(syminfo.ticker), timeframe.period, close)
haOpen = security(heikinashi(syminfo.ticker), timeframe.period, open)

nextHaOpen = (haOpen + haClose) / 2

//MACD

macdCalcTypeProcessed = input(title="MACD Source", type=input.source, defval=high)
fast = input(12, title="MACD Fast")
slow = input(20, title="MACD Slow")
signalLen = input(15, title="MACD Signal")

fastMA = ema(macdCalcTypeProcessed, fast)
slowMA = ema(macdCalcTypeProcessed, slow)
macd = fastMA - slowMA
signal = sma(macd, signalLen)



longCondition() =>
    (low < lower) and (rsi[0] > rsiComparator) and (adx > adxComparator) and (close > nextHaOpen) and BarInSession(session) and macd > signal

stop = (close - max((low - (low * 0.0022)), (close - (close * 0.0032)))) / syminfo.mintick
target = (max(upper, (close + (close * 0.0075))) - close) / syminfo.mintick


strategy.entry("SX,LE", strategy.long, when=longCondition(), comment="SX,LE")
strategy.close_all(when=(not BarInSession(session)))
strategy.exit("LX", from_entry="SX,LE", profit=target, loss=stop)