双重逆転モメンタム指数取引戦略

作者: リン・ハーンチャオチャン, 日付: 2023-12-25 12:02:57
タグ:

img

概要

この戦略は,取引のためのダブルリバースモメントインデックス指標に基づいています.最高価格,最低価格,閉値を使用して,一定期間中のリバースモメントインデックスを計算し,インデックスがオーバー買いゾーンからダウンまたはオーバーセールゾーンからアップに逆転したときの取引信号を生成します.また,ブレイアウトストップ損失メカニズムを設定します.

戦略の論理

この戦略のコア指標はストカスティック・モメントムインデックス (SMI) である.SMIの計算式は:

$$SMI = \frac{Close-(HH+LL)/2}{AVGDIFF/2}*100$$

HH は過去 N 日間の最高価格,LL は過去 N 日間の最低価格であり,N はパラメータ a によって決定され,AVGDIFF は HH-LL の M 日間の移動平均値であり,M はパラメータ b によって決定される.

SMIは価格の逆転特性を示します.SMIが過去N日間の最高値に近づいたとき,SMIは100に近いので,株の過買いを示します.過去N日間の最低値に近づいたとき,SMIは-100に近いので,過売りを示します.SMIが100値から下がり,または-100値から上昇すると,買い/売るシグナルが生成されます.

この戦略は,SMIのM日移動平均SMAを取引信号ラインとして使用する.SMIがオーバーバイトゾーンから下回し,SMA以下に突破すると,購入信号が生成される.SMIがオーバーセールゾーンから上回し,SMA以上に突破すると,販売信号が生成される.

ストップ・ロスの場合も 判断します

利点分析

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

  1. 価格逆転原理を用いて,逆転点で取引信号を生成し,逆転機会を捉えることができます.

  2. SMIは最高価格,最低価格,閉店価格を組み合わせて,過剰購入と過剰売却の状況を判断し,より信頼性の高いシグナルを作成します.

  3. キャンドルスタイクボディブレイクストップロスは ポジションを間に合って終了し リスクを効果的に制御します

  4. 戦略にはパラメータが少ないし,実装や最適化も簡単です.

リスク分析

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

  1. リバース取引では,成功したリバースの正確なタイミングを決定することは困難であり,トレンドの逆転を把握する前に複数の損失を負う可能性があります.

  2. 逆転点に対する誤った判断は 損失を増大させる可能性があります

  3. 身体の脱出ストップ・ロスは 敏感すぎると 閉じ込められる可能性が高い

解決策は次のとおりです

  1. SMI パラメータを最適化して逆転取引頻度を調整する.

  2. 逆転のタイミングを決定するために他の指標を組み合わせます.

  3. 身体のサイズを調整して 太りすぎないようにします

最適化

戦略は以下の側面で最適化できます.

  1. SMI のパラメータ a と b を最適化して,逆転の検出の感度を調整する.

  2. 判断のために他の指標を追加し,主要なトレンド方向を逃さないようにします.例えば移動平均値,変動指標など.

  3. トレイリングストップ損失,カーブストップ損失など,過度に敏感または無敏感であるのを防ぐために,より多くのストップ損失方法を追加します.

  4. 逆転成功の確率を判断するための機械学習モデルを組み込み,失敗した逆転取引を避ける.

結論

結論として,これは逆転モメントインデックス (SMI) をベースとした二方向取引戦略である.利点は,価格逆転を利用し,逆転点でシグナルを生成することで,より短期間の取引機会を把握することにある.しかし,逆転取引には典型的なリスクもあります.増幅損失を防ぐためにパラメータチューニングとストップロスの最適化が必要です.全体的に見ると,この戦略は逆転取引に興味のある投資家に適していますが,他の指標と厳格なストップロスを組み込む必要があります.


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

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.0", shorttitle = "Stochastic str 1.0", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
a = input(5, "Percent K Length")
b = input(3, "Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2018, defval = 2018, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = SMIsignal < -1 * limit and close < open
dn = SMIsignal > limit and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 2

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 : lot[1]

if up
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("Bottom", strategy.long, needlong == false ? 0 : lot)

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", strategy.short, needshort == false ? 0 : lot)
    
if  exit
    strategy.close_all()

もっと